X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/81345200c95645a1b0d2635520f96ad55dfde63f..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/interpreter/CallFrame.cpp?ds=sidebyside diff --git a/interpreter/CallFrame.cpp b/interpreter/CallFrame.cpp index df19d7f..259061d 100644 --- a/interpreter/CallFrame.cpp +++ b/interpreter/CallFrame.cpp @@ -29,7 +29,7 @@ #include "CallFrameInlines.h" #include "CodeBlock.h" #include "Interpreter.h" -#include "JSActivation.h" +#include "JSLexicalEnvironment.h" #include "JSCInlines.h" #include "VMEntryScope.h" #include @@ -136,20 +136,36 @@ JSGlobalObject* CallFrame::vmEntryGlobalObject() return vm().entryScope->globalObject(); } -JSActivation* CallFrame::activation() const +CallFrame* CallFrame::callerFrame(VMEntryFrame*& currVMEntryFrame) +{ + if (callerFrameOrVMEntryFrame() == currVMEntryFrame) { + VMEntryRecord* currVMEntryRecord = vmEntryRecord(currVMEntryFrame); + currVMEntryFrame = currVMEntryRecord->prevTopVMEntryFrame(); + return currVMEntryRecord->prevTopCallFrame(); + } + return static_cast(callerFrameOrVMEntryFrame()); +} + +JSLexicalEnvironment* CallFrame::lexicalEnvironment() const { CodeBlock* codeBlock = this->codeBlock(); RELEASE_ASSERT(codeBlock->needsActivation()); VirtualRegister activationRegister = codeBlock->activationRegister(); - return registers()[activationRegister.offset()].Register::activation(); + return registers()[activationRegister.offset()].Register::lexicalEnvironment(); } -void CallFrame::setActivation(JSActivation* activation) +JSLexicalEnvironment* CallFrame::lexicalEnvironmentOrNullptr() const +{ + CodeBlock* codeBlock = this->codeBlock(); + return codeBlock->needsActivation() ? lexicalEnvironment() : nullptr; +} + +void CallFrame::setActivation(JSLexicalEnvironment* lexicalEnvironment) { CodeBlock* codeBlock = this->codeBlock(); RELEASE_ASSERT(codeBlock->needsActivation()); VirtualRegister activationRegister = codeBlock->activationRegister(); - registers()[activationRegister.offset()] = activation; + registers()[activationRegister.offset()] = lexicalEnvironment; } void CallFrame::dump(PrintStream& out)