diff options
Diffstat (limited to 'Source/JavaScriptCore/API/JSContextRef.cpp')
-rw-r--r-- | Source/JavaScriptCore/API/JSContextRef.cpp | 204 |
1 files changed, 43 insertions, 161 deletions
diff --git a/Source/JavaScriptCore/API/JSContextRef.cpp b/Source/JavaScriptCore/API/JSContextRef.cpp index 98cd8b030..81b61cf47 100644 --- a/Source/JavaScriptCore/API/JSContextRef.cpp +++ b/Source/JavaScriptCore/API/JSContextRef.cpp @@ -10,47 +10,37 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "JSContextRef.h" -#include "JSContextRefInternal.h" +#include "JSContextRefPrivate.h" #include "APICast.h" #include "CallFrame.h" +#include "CallFrameInlines.h" #include "InitializeThreading.h" #include "JSCallbackObject.h" #include "JSClassRef.h" #include "JSGlobalObject.h" #include "JSObject.h" -#include "JSCInlines.h" +#include "Operations.h" #include "SourceProvider.h" #include "StackVisitor.h" -#include "Watchdog.h" #include <wtf/text/StringBuilder.h> #include <wtf/text/StringHash.h> -#if ENABLE(REMOTE_INSPECTOR) -#include "JSGlobalObjectDebuggable.h" -#include "JSGlobalObjectInspectorController.h" -#include "JSRemoteInspector.h" -#endif - -#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS) -#include "JSContextRefInspectorSupport.h" -#endif - #if OS(DARWIN) #include <mach-o/dyld.h> @@ -67,7 +57,7 @@ using namespace JSC; JSContextGroupRef JSContextGroupCreate() { initializeThreading(); - return toRef(&VM::createContextGroup().leakRef()); + return toRef(VM::createContextGroup().leakRef()); } JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) @@ -78,10 +68,16 @@ JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) void JSContextGroupRelease(JSContextGroupRef group) { + IdentifierTable* savedIdentifierTable; VM& vm = *toJS(group); - JSLockHolder locker(&vm); - vm.deref(); + { + JSLockHolder lock(vm); + savedIdentifierTable = wtfThreadData().setCurrentIdentifierTable(vm.identifierTable); + vm.deref(); + } + + wtfThreadData().setCurrentIdentifierTable(savedIdentifierTable); } static bool internalScriptTimeoutCallback(ExecState* exec, void* callbackPtr, void* callbackData) @@ -95,21 +91,21 @@ static bool internalScriptTimeoutCallback(ExecState* exec, void* callbackPtr, vo void JSContextGroupSetExecutionTimeLimit(JSContextGroupRef group, double limit, JSShouldTerminateCallback callback, void* callbackData) { VM& vm = *toJS(group); - JSLockHolder locker(&vm); - Watchdog& watchdog = vm.ensureWatchdog(); + APIEntryShim entryShim(&vm); + Watchdog& watchdog = vm.watchdog; if (callback) { void* callbackPtr = reinterpret_cast<void*>(callback); - watchdog.setTimeLimit(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::duration<double>(limit)), internalScriptTimeoutCallback, callbackPtr, callbackData); + watchdog.setTimeLimit(vm, limit, internalScriptTimeoutCallback, callbackPtr, callbackData); } else - watchdog.setTimeLimit(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::duration<double>(limit))); + watchdog.setTimeLimit(vm, limit); } void JSContextGroupClearExecutionTimeLimit(JSContextGroupRef group) { VM& vm = *toJS(group); - JSLockHolder locker(&vm); - if (vm.watchdog()) - vm.watchdog()->setTimeLimit(Watchdog::noTimeLimit); + APIEntryShim entryShim(&vm); + Watchdog& watchdog = vm.watchdog; + watchdog.setTimeLimit(vm, std::numeric_limits<double>::infinity()); } // From the API's perspective, a global context remains alive iff it has been JSGlobalContextRetained. @@ -135,14 +131,12 @@ JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClass RefPtr<VM> vm = group ? PassRefPtr<VM>(toJS(group)) : VM::createContextGroup(); - JSLockHolder locker(vm.get()); + APIEntryShim entryShim(vm.get(), false); + vm->makeUsableFromMultipleThreads(); if (!globalObjectClass) { JSGlobalObject* globalObject = JSGlobalObject::create(*vm, JSGlobalObject::createStructure(*vm, jsNull())); -#if ENABLE(REMOTE_INSPECTOR) - if (JSRemoteInspectorGetInspectionEnabledByDefault()) - globalObject->setRemoteDebuggingEnabled(true); -#endif + globalObject->setGlobalThis(*vm, JSProxy::create(*vm, JSProxy::createStructure(*vm, globalObject, globalObject->prototype()), globalObject)); return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec())); } @@ -152,17 +146,13 @@ JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClass if (!prototype) prototype = jsNull(); globalObject->resetPrototype(*vm, prototype); -#if ENABLE(REMOTE_INSPECTOR) - if (JSRemoteInspectorGetInspectionEnabledByDefault()) - globalObject->setRemoteDebuggingEnabled(true); -#endif return JSGlobalContextRetain(toGlobalRef(exec)); } JSGlobalContextRef JSGlobalContextRetain(JSGlobalContextRef ctx) { ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + APIEntryShim entryShim(exec); VM& vm = exec->vm(); gcProtect(exec->vmEntryGlobalObject()); @@ -172,14 +162,21 @@ JSGlobalContextRef JSGlobalContextRetain(JSGlobalContextRef ctx) void JSGlobalContextRelease(JSGlobalContextRef ctx) { + IdentifierTable* savedIdentifierTable; ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + { + JSLockHolder lock(exec); - VM& vm = exec->vm(); - bool protectCountIsZero = Heap::heap(exec->vmEntryGlobalObject())->unprotect(exec->vmEntryGlobalObject()); - if (protectCountIsZero) - vm.heap.reportAbandonedObjectGraph(); - vm.deref(); + VM& vm = exec->vm(); + savedIdentifierTable = wtfThreadData().setCurrentIdentifierTable(vm.identifierTable); + + bool protectCountIsZero = Heap::heap(exec->vmEntryGlobalObject())->unprotect(exec->vmEntryGlobalObject()); + if (protectCountIsZero) + vm.heap.reportAbandonedObjectGraph(); + vm.deref(); + } + + wtfThreadData().setCurrentIdentifierTable(savedIdentifierTable); } JSObjectRef JSContextGetGlobalObject(JSContextRef ctx) @@ -189,7 +186,7 @@ JSObjectRef JSContextGetGlobalObject(JSContextRef ctx) return 0; } ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + APIEntryShim entryShim(exec); return toRef(jsCast<JSObject*>(exec->lexicalGlobalObject()->methodTable()->toThis(exec->lexicalGlobalObject(), exec, NotStrictMode))); } @@ -211,7 +208,7 @@ JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx) return 0; } ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + APIEntryShim entryShim(exec); return toGlobalRef(exec->lexicalGlobalObject()->globalExec()); } @@ -224,7 +221,7 @@ JSStringRef JSGlobalContextCopyName(JSGlobalContextRef ctx) } ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + APIEntryShim entryShim(exec); String name = exec->vmEntryGlobalObject()->name(); if (name.isNull()) @@ -241,7 +238,7 @@ void JSGlobalContextSetName(JSGlobalContextRef ctx, JSStringRef name) } ExecState* exec = toJS(ctx); - JSLockHolder locker(exec); + APIEntryShim entryShim(exec); exec->vmEntryGlobalObject()->setName(name ? name->string() : String()); } @@ -313,119 +310,4 @@ JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) return OpaqueJSString::create(builder.toString()).leakRef(); } -bool JSGlobalContextGetRemoteInspectionEnabled(JSGlobalContextRef ctx) -{ - if (!ctx) { - ASSERT_NOT_REACHED(); - return false; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - return exec->vmEntryGlobalObject()->remoteDebuggingEnabled(); -} - -void JSGlobalContextSetRemoteInspectionEnabled(JSGlobalContextRef ctx, bool enabled) -{ - if (!ctx) { - ASSERT_NOT_REACHED(); - return; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - exec->vmEntryGlobalObject()->setRemoteDebuggingEnabled(enabled); -} - -bool JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(JSGlobalContextRef ctx) -{ -#if ENABLE(REMOTE_INSPECTOR) - if (!ctx) { - ASSERT_NOT_REACHED(); - return false; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); - return globalObject->inspectorController().includesNativeCallStackWhenReportingExceptions(); -#else - UNUSED_PARAM(ctx); - return false; -#endif -} - -void JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions(JSGlobalContextRef ctx, bool includesNativeCallStack) -{ -#if ENABLE(REMOTE_INSPECTOR) - if (!ctx) { - ASSERT_NOT_REACHED(); - return; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); - globalObject->inspectorController().setIncludesNativeCallStackWhenReportingExceptions(includesNativeCallStack); -#else - UNUSED_PARAM(ctx); - UNUSED_PARAM(includesNativeCallStack); -#endif -} - -#if USE(CF) -CFRunLoopRef JSGlobalContextGetDebuggerRunLoop(JSGlobalContextRef ctx) -{ -#if ENABLE(REMOTE_INSPECTOR) - if (!ctx) { - ASSERT_NOT_REACHED(); - return nullptr; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - return exec->vmEntryGlobalObject()->inspectorDebuggable().targetRunLoop(); -#else - UNUSED_PARAM(ctx); - return nullptr; -#endif -} -void JSGlobalContextSetDebuggerRunLoop(JSGlobalContextRef ctx, CFRunLoopRef runLoop) -{ -#if ENABLE(REMOTE_INSPECTOR) - if (!ctx) { - ASSERT_NOT_REACHED(); - return; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - exec->vmEntryGlobalObject()->inspectorDebuggable().setTargetRunLoop(runLoop); -#else - UNUSED_PARAM(ctx); - UNUSED_PARAM(runLoop); -#endif -} -#endif // USE(CF) - -#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS) -Inspector::AugmentableInspectorController* JSGlobalContextGetAugmentableInspectorController(JSGlobalContextRef ctx) -{ - if (!ctx) { - ASSERT_NOT_REACHED(); - return nullptr; - } - - ExecState* exec = toJS(ctx); - JSLockHolder lock(exec); - - return &exec->vmEntryGlobalObject()->inspectorController(); -} -#endif |