source: webkit/trunk/JavaScriptCore/API/JSBase.cpp@ 51512

Last change on this file since 51512 was 51512, checked in by [email protected], 15 years ago

Bug 31859 - Make world selection for JSC IsolatedWorlds automagical.

Reviewed by Geoff Garen.

JavaScriptCore:

WebCore presently has to explicitly specify the world before entering into JSC,
which is a little fragile (particularly since property access via a
getter/setter might invoke execution). Instead derive the current world from
the lexical global object.

Remove the temporary duct tape of willExecute/didExecute virtual hooks on the JSGlobalData::ClientData - these are no longer necessary.

  • API/JSBase.cpp:

(JSEvaluateScript):

  • API/JSObjectRef.cpp:

(JSObjectCallAsFunction):

  • JavaScriptCore.exp:
  • runtime/JSGlobalData.cpp:
  • runtime/JSGlobalData.h:

WebCore:

WebCore presently has to explicitly specify the world before entering into JSC,
which is a little fragile (particularly since property access via a
getter/setter might invoke execution). Instead derive the current world from
the lexical global object.

Remove the last uses of mainThreadCurrentWorld(), so the world is always obtained via
currentWorld(). Switch this to obtain the world from the ExecsState's lexical global
object instead. Remove the call/construct/evaluate 'InWorld' methods, since these
are no longer necessary.

  • WebCore.base.exp:
  • bindings/js/JSCallbackData.cpp:

(WebCore::JSCallbackData::invokeCallback):

  • bindings/js/JSCallbackData.h:

(WebCore::JSCallbackData::JSCallbackData):

  • bindings/js/JSCustomXPathNSResolver.cpp:

(WebCore::JSCustomXPathNSResolver::lookupNamespaceURI):

  • bindings/js/JSDOMBinding.cpp:

(WebCore::currentWorld):
(WebCore::mainThreadNormalWorld):

  • bindings/js/JSDOMBinding.h:

(WebCore::WebCoreJSClientData::WebCoreJSClientData):

  • bindings/js/JSDOMWindowBase.cpp:

(WebCore::JSDOMWindowBase::updateDocument):

  • bindings/js/JSDOMWindowBase.h:
  • bindings/js/JSEventListener.cpp:

(WebCore::JSEventListener::handleEvent):
(WebCore::JSEventListener::reportError):

  • bindings/js/JSHTMLDocumentCustom.cpp:

(WebCore::JSHTMLDocument::open):

  • bindings/js/JSNodeFilterCondition.cpp:

(WebCore::JSNodeFilterCondition::acceptNode):

  • bindings/js/JSQuarantinedObjectWrapper.cpp:

(WebCore::JSQuarantinedObjectWrapper::construct):
(WebCore::JSQuarantinedObjectWrapper::call):

  • bindings/js/ScheduledAction.cpp:

(WebCore::ScheduledAction::executeFunctionInContext):

  • bindings/js/ScriptController.cpp:

(WebCore::ScriptController::evaluateInWorld):
(WebCore::ScriptController::initScript):
(WebCore::ScriptController::updateDocument):

  • bindings/js/ScriptFunctionCall.cpp:

(WebCore::ScriptFunctionCall::call):
(WebCore::ScriptFunctionCall::construct):

  • bindings/js/ScriptObjectQuarantine.cpp:

(WebCore::getQuarantinedScriptObject):

  • bindings/js/ScriptState.cpp:

(WebCore::scriptStateFromNode):
(WebCore::scriptStateFromPage):

  • bindings/js/ScriptState.h:
  • bindings/js/WorkerScriptController.cpp:

(WebCore::WorkerScriptController::evaluate):

  • bindings/objc/WebScriptObject.mm:

(-[WebScriptObject callWebScriptMethod:withArguments:]):
(-[WebScriptObject evaluateWebScript:]):

  • bridge/NP_jsobject.cpp:

(_NPN_InvokeDefault):
(_NPN_Invoke):
(_NPN_Evaluate):
(_NPN_Construct):

  • bridge/jni/jni_jsobject.mm:

(JavaJSObject::call):
(JavaJSObject::eval):

  • dom/NodeFilter.h:

(WebCore::NodeFilter::acceptNode):

  • dom/NodeIterator.h:

(WebCore::NodeIterator::nextNode):
(WebCore::NodeIterator::previousNode):

  • dom/TreeWalker.h:

(WebCore::TreeWalker::parentNode):
(WebCore::TreeWalker::firstChild):
(WebCore::TreeWalker::lastChild):
(WebCore::TreeWalker::previousSibling):
(WebCore::TreeWalker::nextSibling):
(WebCore::TreeWalker::previousNode):
(WebCore::TreeWalker::nextNode):

  • inspector/InspectorController.cpp:

(WebCore::InspectorController::windowScriptObjectAvailable):
(WebCore::InspectorController::didEvaluateForTestInFrontend):

  • inspector/JavaScriptCallFrame.cpp:

(WebCore::JavaScriptCallFrame::evaluate):

WebKit/mac:

WebCore presently has to explicitly specify the world before entering into JSC,
which is a little fragile (particularly since property access via a
getter/setter might invoke execution). Instead derive the current world from
the lexical global object.

Since WebCore no longer needs to explicitly specify the world on entry to JSC DebuggerCallFrame::evaluate can be called directly.

  • WebView/WebScriptDebugDelegate.mm:

(-[WebScriptCallFrame evaluateWebScript:]):

  • Property svn:eol-style set to native
File size: 4.4 KB
Line 
1/*
2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "JSBase.h"
28#include "JSBasePrivate.h"
29
30#include "APICast.h"
31#include "Completion.h"
32#include "OpaqueJSString.h"
33#include "SourceCode.h"
34#include <interpreter/CallFrame.h>
35#include <runtime/InitializeThreading.h>
36#include <runtime/Completion.h>
37#include <runtime/JSGlobalObject.h>
38#include <runtime/JSLock.h>
39#include <runtime/JSObject.h>
40
41using namespace JSC;
42
43JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
44{
45 ExecState* exec = toJS(ctx);
46 exec->globalData().heap.registerThread();
47 JSLock lock(exec);
48
49 JSObject* jsThisObject = toJS(thisObject);
50
51 // evaluate sets "this" to the global object if it is NULL
52 JSGlobalObject* globalObject = exec->dynamicGlobalObject();
53 SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
54 Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), source, jsThisObject);
55
56 if (completion.complType() == Throw) {
57 if (exception)
58 *exception = toRef(exec, completion.value());
59 return 0;
60 }
61
62 if (completion.value())
63 return toRef(exec, completion.value());
64
65 // happens, for example, when the only statement is an empty (';') statement
66 return toRef(exec, jsUndefined());
67}
68
69bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
70{
71 ExecState* exec = toJS(ctx);
72 exec->globalData().heap.registerThread();
73 JSLock lock(exec);
74
75 SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
76 Completion completion = checkSyntax(exec->dynamicGlobalObject()->globalExec(), source);
77 if (completion.complType() == Throw) {
78 if (exception)
79 *exception = toRef(exec, completion.value());
80 return false;
81 }
82
83 return true;
84}
85
86void JSGarbageCollect(JSContextRef ctx)
87{
88 // We used to recommend passing NULL as an argument here, which caused the only heap to be collected.
89 // As there is no longer a shared heap, the previously recommended usage became a no-op (but the GC
90 // will happen when the context group is destroyed).
91 // Because the function argument was originally ignored, some clients may pass their released context here,
92 // in which case there is a risk of crashing if another thread performs GC on the same heap in between.
93 if (!ctx)
94 return;
95
96 ExecState* exec = toJS(ctx);
97 JSGlobalData& globalData = exec->globalData();
98
99 JSLock lock(globalData.isSharedInstance ? LockForReal : SilenceAssertionsOnly);
100
101 if (!globalData.heap.isBusy())
102 globalData.heap.collect();
103
104 // FIXME: Perhaps we should trigger a second mark and sweep
105 // once the garbage collector is done if this is called when
106 // the collector is busy.
107}
108
109void JSReportExtraMemoryCost(JSContextRef ctx, size_t size)
110{
111 ExecState* exec = toJS(ctx);
112 exec->globalData().heap.registerThread();
113 JSLock lock(exec);
114
115 exec->globalData().heap.reportExtraMemoryCost(size);
116}
Note: See TracBrowser for help on using the repository browser.