+ return registers() + codeBlock->stackPointerOffset();
+}
+
+JSGlobalObject* CallFrame::vmEntryGlobalObject()
+{
+ if (this == lexicalGlobalObject()->globalExec())
+ return lexicalGlobalObject();
+
+ // For any ExecState that's not a globalExec, the
+ // dynamic global object must be set since code is running
+ ASSERT(vm().entryScope);
+ return vm().entryScope->globalObject();
+}
+
+CallFrame* CallFrame::callerFrame(VMEntryFrame*& currVMEntryFrame)
+{
+ if (callerFrameOrVMEntryFrame() == currVMEntryFrame) {
+ VMEntryRecord* currVMEntryRecord = vmEntryRecord(currVMEntryFrame);
+ currVMEntryFrame = currVMEntryRecord->prevTopVMEntryFrame();
+ return currVMEntryRecord->prevTopCallFrame();
+ }
+ return static_cast<CallFrame*>(callerFrameOrVMEntryFrame());
+}
+
+JSLexicalEnvironment* CallFrame::lexicalEnvironment() const
+{
+ CodeBlock* codeBlock = this->codeBlock();
+ RELEASE_ASSERT(codeBlock->needsActivation());
+ VirtualRegister activationRegister = codeBlock->activationRegister();
+ return registers()[activationRegister.offset()].Register::lexicalEnvironment();
+}
+
+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()] = lexicalEnvironment;