Skip to content
  • msaboff@apple.com's avatar
    Eliminate HostCall bit from JSC Stack CallerFrame · c9b3ad6e
    msaboff@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=123642
    
    Reviewed by Geoffrey Garen.
    
    Source/JavaScriptCore: 
    
    Replace the HostCallFrame bit or'ed to the CallerFrame value in a CallFrame with
    a VM entry sentinel CallFrame.  Logically, the VM entry sentinel call frame is
    pushed on the stack before the callee frame when calling from native to JavaScript
    code.  The callee frame's CallerFrame points at the VM entry sentinel call frame
    and the VM entry sentinel call frame's CallerFrame points to the real caller.
    The VM entry sentinel call frame has a sentinel (1) in the CodeBlock to indicate
    its a VM entry sentinel call frame.  It's ScopeChain has vm.topCallFrame at the
    time of the call.  This allows for a complete stack walk as well as walking just
    the contiguous JS frames.
    
    The VM entry sentinel call frame and callee frame are currently allocated and
    initialized in ExecState::init(), but this initialization will be moved to
    ctiTrampoline when we actually move onto the native stack.
    
    * bytecode/CodeBlock.cpp:
    (JSC::CodeBlock::noticeIncomingCall):
    * debugger/DebuggerCallFrame.cpp:
    (JSC::DebuggerCallFrame::callerFrame):
    * dfg/DFGJITCompiler.cpp:
    (JSC::DFG::JITCompiler::compileExceptionHandlers):
    * interpreter/CallFrame.h:
    (JSC::ExecState::frameExtent):
    (JSC::ExecState::currentVPC):
    (JSC::ExecState::setCurrentVPC):
    (JSC::ExecState::init):
    (JSC::ExecState::noCaller):
    (JSC::ExecState::isVMEntrySentinel):
    (JSC::ExecState::vmEntrySentinelCallerFrame):
    (JSC::ExecState::initializeVMEntrySentinelFrame):
    (JSC::ExecState::callerFrameSkippingVMEntrySentinel):
    (JSC::ExecState::vmEntrySentinelCodeBlock):
    * interpreter/Interpreter.cpp:
    (JSC::unwindCallFrame):
    (JSC::Interpreter::getStackTrace):
    * interpreter/Interpreter.h:
    (JSC::TopCallFrameSetter::TopCallFrameSetter):
    (JSC::TopCallFrameSetter::~TopCallFrameSetter):
    (JSC::NativeCallFrameTracer::NativeCallFrameTracer):
    * interpreter/JSStack.cpp:
    (JSC::JSStack::~JSStack):
    * interpreter/JSStackInlines.h:
    (JSC::JSStack::getStartOfFrame):
    (JSC::JSStack::pushFrame):
    (JSC::JSStack::popFrame):
    * interpreter/Register.h:
    (JSC::Register::operator=):
    (JSC::Register::callFrame):
    * interpreter/StackVisitor.cpp:
    (JSC::StackVisitor::readFrame):
    (JSC::StackVisitor::readNonInlinedFrame):
    (JSC::StackVisitor::readInlinedFrame):
    (JSC::StackVisitor::Frame::print):
    * interpreter/VMInspector.cpp:
    (JSC::VMInspector::countFrames):
    * jit/JIT.cpp:
    (JSC::JIT::privateCompileExceptionHandlers):
    * jit/JITOperations.cpp:
    * jit/JITStubsARM.h:
    (JSC::ctiTrampoline):
    * jit/JITStubsARM64.h:
    * jit/JITStubsARMv7.h:
    (JSC::ctiTrampoline):
    * jit/JITStubsMIPS.h:
    * jit/JITStubsMSVC64.asm:
    * jit/JITStubsSH4.h:
    * jit/JITStubsX86.h:
    * jit/JITStubsX86_64.h:
    * jsc.cpp:
    (functionDumpCallFrame):
    * llint/LowLevelInterpreter.cpp:
    (JSC::CLoop::execute):
    * runtime/VM.cpp:
    (JSC::VM::VM):
    (JSC::VM::throwException):
    
    Source/WebCore: 
    
    Updated JavaScript stack walking as a result of the corresponding changes made in
    JavaScriptCore.
    
    * bindings/js/ScriptController.cpp:
    (WebCore::ScriptController::shouldBypassMainWorldContentSecurityPolicy):
    * bindings/js/ScriptDebugServer.cpp:
    (WebCore::ScriptDebugServer::stepOutOfFunction):
    (WebCore::ScriptDebugServer::returnEvent):
    (WebCore::ScriptDebugServer::didExecuteProgram):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@158586 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    c9b3ad6e