Ignore:
Timestamp:
Nov 20, 2013, 9:29:42 PM (12 years ago)
Author:
[email protected]
Message:

Introducing VMEntryScope to update the VM stack limit.
https://bugs.webkit.org/show_bug.cgi?id=124634.

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  1. Introduced USE(SEPARATE_C_AND_JS_STACK) (defined in Platform.h). Currently, it is hardcoded to use separate C and JS stacks. Once we switch to using the C stack for JS frames, we'll need to fix this to only be enabled when ENABLE(LLINT_C_LOOP).
  1. Stack limits are now tracked in the VM.

Logically, there are 2 stack limits:

  1. m_stackLimit for the native C stack, and
  2. m_jsStackLimit for the JS stack.

If USE(SEPARATE_C_AND_JS_STACK), then the 2 limits are the same
value, and are implemented as 2 fields in a union.

  1. The VM native stackLimit is set as follows:
    1. Initially, the VM sets it to the limit of the stack of the thread that instantiated the VM. This allows the parser and bytecode generator to run before we enter the VM to execute JS code.
  1. Upon entry into the VM to execute JS code (via one of the Interpreter::execute...() functions), we instantiate a VMEntryScope that sets the VM's stackLimit to the limit of the current thread's stack. The VMEntryScope will automatically restore the previous entryScope and stack limit upon destruction.

If USE(SEPARATE_C_AND_JS_STACK), the JSStack's methods will set the VM's
jsStackLimit whenever it grows or shrinks.

  1. The VM now provides a isSafeToRecurse() function that compares the current stack pointer against its native stackLimit. This subsumes and obsoletes the VMStackBounds class.
  1. The VMEntryScope class also subsumes DynamicGlobalObjectScope for tracking the JSGlobalObject that we last entered the VM with.
  1. Renamed dynamicGlobalObject() to vmEntryGlobalObject() since that is the value that the function retrieves.
  1. Changed JIT and LLINT code to do stack checks against the jsStackLimit in the VM class instead of the JSStack.
  • API/JSBase.cpp:

(JSEvaluateScript):
(JSCheckScriptSyntax):

  • API/JSContextRef.cpp:

(JSGlobalContextRetain):
(JSGlobalContextRelease):

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::emitNode):
(JSC::BytecodeGenerator::emitNodeInConditionContext):

  • debugger/Debugger.cpp:

(JSC::Debugger::detach):
(JSC::Debugger::recompileAllJSFunctions):
(JSC::Debugger::pauseIfNeeded):

  • debugger/DebuggerCallFrame.cpp:

(JSC::DebuggerCallFrame::vmEntryGlobalObject):

  • debugger/DebuggerCallFrame.h:
  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::compileFunction):

  • dfg/DFGOSREntry.cpp:
  • ftl/FTLLink.cpp:

(JSC::FTL::link):

  • ftl/FTLOSREntry.cpp:
  • heap/Heap.cpp:

(JSC::Heap::lastChanceToFinalize):
(JSC::Heap::deleteAllCompiledCode):

  • interpreter/CachedCall.h:

(JSC::CachedCall::CachedCall):

  • interpreter/CallFrame.cpp:

(JSC::CallFrame::vmEntryGlobalObject):

  • interpreter/CallFrame.h:
  • interpreter/Interpreter.cpp:

(JSC::unwindCallFrame):
(JSC::Interpreter::unwind):
(JSC::Interpreter::execute):
(JSC::Interpreter::executeCall):
(JSC::Interpreter::executeConstruct):
(JSC::Interpreter::prepareForRepeatCall):
(JSC::Interpreter::debug):

  • interpreter/JSStack.cpp:

(JSC::JSStack::JSStack):
(JSC::JSStack::growSlowCase):

  • interpreter/JSStack.h:
  • interpreter/JSStackInlines.h:

(JSC::JSStack::shrink):
(JSC::JSStack::grow):

  • Moved these inlined functions here from JSStack.h. It reduces some #include dependencies of JSSTack.h which had previously resulted in some EWS bots' unhappiness with this patch.

(JSC::JSStack::updateStackLimit):

  • jit/JIT.cpp:

(JSC::JIT::privateCompile):

  • jit/JITCall.cpp:

(JSC::JIT::compileLoadVarargs):

  • jit/JITCall32_64.cpp:

(JSC::JIT::compileLoadVarargs):

  • jit/JITOperations.cpp:
  • llint/LLIntSlowPaths.cpp:
  • llint/LowLevelInterpreter.asm:
  • parser/Parser.cpp:

(JSC::::Parser):

  • parser/Parser.h:

(JSC::Parser::canRecurse):

  • runtime/CommonSlowPaths.h:
  • runtime/Completion.cpp:

(JSC::evaluate):

  • runtime/FunctionConstructor.cpp:

(JSC::constructFunctionSkippingEvalEnabledCheck):

  • runtime/JSGlobalObject.cpp:
  • runtime/JSGlobalObject.h:
  • runtime/StringRecursionChecker.h:

(JSC::StringRecursionChecker::performCheck):

  • runtime/VM.cpp:

(JSC::VM::VM):
(JSC::VM::releaseExecutableMemory):
(JSC::VM::throwException):

  • runtime/VM.h:

(JSC::VM::addressOfJSStackLimit):
(JSC::VM::jsStackLimit):
(JSC::VM::setJSStackLimit):
(JSC::VM::stackLimit):
(JSC::VM::setStackLimit):
(JSC::VM::isSafeToRecurse):

  • runtime/VMEntryScope.cpp: Added.

(JSC::VMEntryScope::VMEntryScope):
(JSC::VMEntryScope::~VMEntryScope):
(JSC::VMEntryScope::requiredCapacity):

  • runtime/VMEntryScope.h: Added.

(JSC::VMEntryScope::globalObject):

  • runtime/VMStackBounds.h: Removed.

Source/WebCore:

No new tests.

Renamed dynamicGlobalObject() to vmEntryGlobalObject().
Replaced uses of DynamicGlobalObjectScope with VMEntryScope.

  • ForwardingHeaders/runtime/VMEntryScope.h: Added.
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.vcxproj/WebCore.vcxproj.filters:
  • bindings/js/JSCryptoAlgorithmBuilder.cpp:

(WebCore::JSCryptoAlgorithmBuilder::add):

  • bindings/js/JSCustomXPathNSResolver.cpp:

(WebCore::JSCustomXPathNSResolver::create):

  • bindings/js/JSDOMBinding.cpp:

(WebCore::firstDOMWindow):

  • bindings/js/JSErrorHandler.cpp:

(WebCore::JSErrorHandler::handleEvent):

  • bindings/js/JSEventListener.cpp:

(WebCore::JSEventListener::handleEvent):

  • bindings/js/JavaScriptCallFrame.h:

(WebCore::JavaScriptCallFrame::vmEntryGlobalObject):

  • bindings/js/PageScriptDebugServer.cpp:

(WebCore::PageScriptDebugServer::recompileAllJSFunctions):

  • bindings/js/ScriptDebugServer.cpp:

(WebCore::ScriptDebugServer::evaluateBreakpointAction):
(WebCore::ScriptDebugServer::handlePause):

  • bindings/js/WorkerScriptDebugServer.cpp:

(WebCore::WorkerScriptDebugServer::recompileAllJSFunctions):

  • bindings/objc/WebScriptObject.mm:

(WebCore::addExceptionToConsole):

  • bridge/c/c_utility.cpp:

(JSC::Bindings::convertValueToNPVariant):

  • bridge/objc/objc_instance.mm:

(ObjcInstance::moveGlobalExceptionToExecState):

  • bridge/objc/objc_runtime.mm:

(JSC::Bindings::convertValueToObjcObject):

  • bridge/objc/objc_utility.mm:

(JSC::Bindings::convertValueToObjcValue):

Source/WebKit/mac:

  • WebView/WebScriptDebugger.mm:

(WebScriptDebugger::sourceParsed):

Source/WTF:

  • wtf/Platform.h:
  • wtf/StackBounds.h:

(WTF::StackBounds::StackBounds):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/debugger/Debugger.cpp

    r159110 r159605  
    3333#include "Parser.h"
    3434#include "Protect.h"
     35#include "VMEntryScope.h"
    3536
    3637namespace {
     
    173174    // stack, since we won't get further debugger callbacks to do so. Also, resume execution,
    174175    // since there's no point in staying paused once a window closes.
    175     if (m_currentCallFrame && m_currentCallFrame->dynamicGlobalObject() == globalObject) {
     176    if (m_currentCallFrame && m_currentCallFrame->vmEntryGlobalObject() == globalObject) {
    176177        m_currentCallFrame = 0;
    177178        m_pauseOnCallFrame = 0;
     
    194195    // If JavaScript is running, it's not safe to recompile, since we'll end
    195196    // up throwing away code that is live on the stack.
    196     ASSERT(!vm->dynamicGlobalObject);
    197     if (vm->dynamicGlobalObject)
     197    ASSERT(!vm->entryScope);
     198    if (vm->entryScope)
    198199        return;
    199200   
     
    439440        return;
    440441
    441     JSGlobalObject* dynamicGlobalObject = callFrame->dynamicGlobalObject();
    442     if (!needPauseHandling(dynamicGlobalObject))
     442    JSGlobalObject* vmEntryGlobalObject = callFrame->vmEntryGlobalObject();
     443    if (!needPauseHandling(vmEntryGlobalObject))
    443444        return;
    444445
     
    471472    }
    472473
    473     handlePause(m_reasonForPause, dynamicGlobalObject);
     474    handlePause(m_reasonForPause, vmEntryGlobalObject);
    474475
    475476    if (!m_pauseOnNextStatement && !m_pauseOnCallFrame) {
Note: See TracChangeset for help on using the changeset viewer.