Changeset 35853 in webkit for trunk/JavaScriptCore/API


Ignore:
Timestamp:
Aug 20, 2008, 12:23:06 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Geoff Garen.

Bring back shared JSGlobalData and implicit locking, because too many clients rely on it.

Location:
trunk/JavaScriptCore/API
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/API/JSBase.cpp

    r35775 r35853  
    3535#include <kjs/interpreter.h>
    3636#include <kjs/JSGlobalObject.h>
     37#include <kjs/JSLock.h>
    3738#include <kjs/JSObject.h>
    3839
     
    4344    ExecState* exec = toJS(ctx);
    4445    exec->globalData().heap->registerThread();
     46    JSLock lock(exec);
    4547
    4648    JSObject* jsThisObject = toJS(thisObject);
     
    6769    ExecState* exec = toJS(ctx);
    6870    exec->globalData().heap->registerThread();
     71    JSLock lock(exec);
    6972
    7073    Completion completion = Interpreter::checkSyntax(exec->dynamicGlobalObject()->globalExec(), sourceURL->ustring(), startingLineNumber, script->ustring());
     
    9295    Heap* heap = globalData.heap;
    9396
     97    JSLock lock(globalData.isSharedInstance);
     98
    9499    if (!heap->isBusy())
    95100        heap->collect();
  • trunk/JavaScriptCore/API/JSCallbackConstructor.cpp

    r35478 r35853  
    3030#include "APICast.h"
    3131#include <kjs/JSGlobalObject.h>
     32#include <kjs/JSLock.h>
    3233#include <kjs/ObjectPrototype.h>
    3334#include <wtf/Vector.h>
     
    6970            arguments[i] = toRef(args.at(exec, i));
    7071           
     72        JSLock::DropAllLocks dropAllLocks(exec);
    7173        return toJS(callback(ctx, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    7274    }
  • trunk/JavaScriptCore/API/JSCallbackFunction.cpp

    r35807 r35853  
    3333#include "FunctionPrototype.h"
    3434#include <kjs/JSGlobalObject.h>
     35#include <kjs/JSLock.h>
    3536#include <wtf/Vector.h>
    3637
     
    6566        arguments[i] = toRef(args.at(exec, i));
    6667
     68    JSLock::DropAllLocks dropAllLocks(exec);
    6769    return toJS(static_cast<JSCallbackFunction*>(functionObject)->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    6870}
  • trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r35807 r35853  
    3131#include "JSClassRef.h"
    3232#include "JSGlobalObject.h"
     33#include "JSLock.h"
    3334#include "JSObjectRef.h"
    3435#include "JSString.h"
     
    7273    // initialize from base to derived
    7374    for (int i = static_cast<int>(initRoutines.size()) - 1; i >= 0; i--) {
     75        JSLock::DropAllLocks dropAllLocks(exec);
    7476        JSObjectInitializeCallback initialize = initRoutines[i];
    7577        initialize(toRef(exec), toRef(this));
     
    109111            if (!propertyNameRef)
    110112                propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     113            JSLock::DropAllLocks dropAllLocks(exec);
    111114            if (hasProperty(ctx, thisRef, propertyNameRef.get())) {
    112115                slot.setCustom(this, callbackGetter);
     
    116119            if (!propertyNameRef)
    117120                propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     121            JSLock::DropAllLocks dropAllLocks(exec);
    118122            if (JSValueRef value = getProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) {
    119123                // cache the value so we don't have to compute it again
     
    161165            if (!propertyNameRef)
    162166                propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     167            JSLock::DropAllLocks dropAllLocks(exec);
    163168            if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot())))
    164169                return;
     
    172177                    if (!propertyNameRef)
    173178                        propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     179                    JSLock::DropAllLocks dropAllLocks(exec);
    174180                    if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot())))
    175181                        return;
     
    209215            if (!propertyNameRef)
    210216                propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     217            JSLock::DropAllLocks dropAllLocks(exec);
    211218            if (deleteProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot())))
    212219                return true;
     
    263270            for (int i = 0; i < argumentCount; i++)
    264271                arguments[i] = toRef(args.at(exec, i));
     272            JSLock::DropAllLocks dropAllLocks(exec);
    265273            return toJS(callAsConstructor(execRef, constructorRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    266274        }
     
    288296   
    289297    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
    290         if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance)
     298        if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) {
     299            JSLock::DropAllLocks dropAllLocks(exec);
    291300            return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot()));
     301        }
    292302    }
    293303    ASSERT_NOT_REACHED(); // implementsHasInstance should prevent us from reaching here
     
    320330            for (int i = 0; i < argumentCount; i++)
    321331                arguments[i] = toRef(args.at(exec, i));
     332            JSLock::DropAllLocks dropAllLocks(exec);
    322333            return toJS(callAsFunction(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), toRef(exec->exceptionSlot())));
    323334        }
     
    335346   
    336347    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
    337         if (JSObjectGetPropertyNamesCallback getPropertyNames = jsClass->getPropertyNames)
     348        if (JSObjectGetPropertyNamesCallback getPropertyNames = jsClass->getPropertyNames) {
     349            JSLock::DropAllLocks dropAllLocks(exec);
    338350            getPropertyNames(execRef, thisRef, toRef(&propertyNames));
     351        }
    339352       
    340353        if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) {
     
    377390    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
    378391        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) {
     392            JSLock::DropAllLocks dropAllLocks(exec);
    379393            if (JSValueRef value = convertToType(ctx, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot())))
    380394                return toJS(value)->getNumber();
     
    392406    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
    393407        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) {
    394             JSValueRef value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot()));
     408            JSValueRef value;
     409            {
     410                JSLock::DropAllLocks dropAllLocks(exec);
     411                value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot()));
     412            }
    395413            if (value)
    396414                return toJS(value)->getString();
     
    445463                    if (!propertyNameRef)
    446464                        propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     465                    JSLock::DropAllLocks dropAllLocks(exec);
    447466                    if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot())))
    448467                        return toJS(value);
     
    491510            if (!propertyNameRef)
    492511                propertyNameRef = OpaqueJSString::create(propertyName.ustring());
     512            JSLock::DropAllLocks dropAllLocks(exec);
    493513            if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot())))
    494514                return toJS(value);
  • trunk/JavaScriptCore/API/JSContextRef.cpp

    r35815 r35853  
    5656JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass)
    5757{
    58     return JSGlobalContextCreateInGroup(toRef(JSGlobalData::create().get()), globalObjectClass);
     58    JSLock lock(true);
     59    return JSGlobalContextCreateInGroup(toRef(&JSGlobalData::sharedInstance()), globalObjectClass);
    5960}
    6061
     
    6364    initializeThreading();
    6465
    65     JSGlobalData* globalData = toJS(group);
     66    JSLock lock(true);
     67
     68    RefPtr<JSGlobalData> globalData = group ? PassRefPtr<JSGlobalData>(toJS(group)) : JSGlobalData::create();
    6669
    6770    if (!globalObjectClass) {
    68         JSGlobalObject* globalObject = new (globalData) JSGlobalObject;
     71        JSGlobalObject* globalObject = new (globalData.get()) JSGlobalObject;
    6972        return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec()));
    7073    }
    7174
    72     JSGlobalObject* globalObject = new (globalData) JSCallbackObject<JSGlobalObject>(globalObjectClass);
     75    JSGlobalObject* globalObject = new (globalData.get()) JSCallbackObject<JSGlobalObject>(globalObjectClass);
    7376    ExecState* exec = globalObject->globalExec();
    7477    JSValue* prototype = globalObjectClass->prototype(exec);
     
    8285{
    8386    ExecState* exec = toJS(ctx);
     87    JSLock lock(exec);
     88
    8489    JSGlobalData& globalData = exec->globalData();
    8590
     
    9499{
    95100    ExecState* exec = toJS(ctx);
     101    JSLock lock(exec);
    96102
    97103    gcUnprotect(exec->dynamicGlobalObject());
     
    116122    ExecState* exec = toJS(ctx);
    117123    exec->globalData().heap->registerThread();
     124    JSLock lock(exec);
    118125
    119126    // It is necessary to call toThisObject to get the wrapper object when used with WebCore.
  • trunk/JavaScriptCore/API/JSContextRef.h

    r35442 r35853  
    7171@discussion JSGlobalContextCreate allocates a global object and populates it with all the
    7272 built-in JavaScript objects, such as Object, Function, String, and Array.
    73  The global context is created in a unique context group.
     73
     74 The created context can only be used on the main thread. JavaScript values cannot be
     75 shared or exchanged between contexts.
    7476@param globalObjectClass The class to use when creating the global object. Pass
    7577 NULL to use the default object class.
    7678@result A JSGlobalContext with a global object of class globalObjectClass.
    7779*/
    78 JS_EXPORT JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass);
     80JS_EXPORT JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass) AVAILABLE_WEBKIT_VERSION_1_0_AND_LATER_BUT_DEPRECATED_AFTER_WEBKIT_VERSION_3_1;
    7981
    8082/*!
     
    8688 NULL to use the default object class.
    8789@param group The context group to use. The created global context retains the group.
     90 Pass NULL to create a unique group for the context.
    8891@result A JSGlobalContext with a global object of class globalObjectClass and a context
    8992 group equal to group.
  • trunk/JavaScriptCore/API/JSObjectRef.cpp

    r35775 r35853  
    7171    ExecState* exec = toJS(ctx);
    7272    exec->globalData().heap->registerThread();
     73    JSLock lock(exec);
    7374
    7475    if (!jsClass)
     
    8687    ExecState* exec = toJS(ctx);
    8788    exec->globalData().heap->registerThread();
     89    JSLock lock(exec);
    8890
    8991    Identifier nameID = name ? name->identifier(exec) : Identifier(exec, "anonymous");
     
    9698    ExecState* exec = toJS(ctx);
    9799    exec->globalData().heap->registerThread();
     100    JSLock lock(exec);
    98101
    99102    JSValue* jsPrototype = jsClass
     
    110113    ExecState* exec = toJS(ctx);
    111114    exec->globalData().heap->registerThread();
     115    JSLock lock(exec);
    112116
    113117    Identifier nameID = name ? name->identifier(exec) : Identifier(exec, "anonymous");
     
    146150    ExecState* exec = toJS(ctx);
    147151    exec->globalData().heap->registerThread();
     152    JSLock lock(exec);
    148153
    149154    JSObject* jsObject = toJS(object);
     
    156161    ExecState* exec = toJS(ctx);
    157162    exec->globalData().heap->registerThread();
     163    JSLock lock(exec);
    158164
    159165    JSObject* jsObject = toJS(object);
     
    172178    ExecState* exec = toJS(ctx);
    173179    exec->globalData().heap->registerThread();
     180    JSLock lock(exec);
    174181
    175182    JSObject* jsObject = toJS(object);
     
    193200    ExecState* exec = toJS(ctx);
    194201    exec->globalData().heap->registerThread();
     202    JSLock lock(exec);
    195203
    196204    JSObject* jsObject = toJS(object);
     
    210218    ExecState* exec = toJS(ctx);
    211219    exec->globalData().heap->registerThread();
     220    JSLock lock(exec);
    212221
    213222    JSObject* jsObject = toJS(object);
     
    226235    ExecState* exec = toJS(ctx);
    227236    exec->globalData().heap->registerThread();
     237    JSLock lock(exec);
    228238
    229239    JSObject* jsObject = toJS(object);
     
    275285    ExecState* exec = toJS(ctx);
    276286    exec->globalData().heap->registerThread();
     287    JSLock lock(exec);
    277288
    278289    JSObject* jsObject = toJS(object);
     
    312323    ExecState* exec = toJS(ctx);
    313324    exec->globalData().heap->registerThread();
     325    JSLock lock(exec);
    314326
    315327    JSObject* jsObject = toJS(object);
     
    350362    ExecState* exec = toJS(ctx);
    351363    exec->globalData().heap->registerThread();
     364    JSLock lock(exec);
    352365
    353366    JSGlobalData* globalData = &exec->globalData();
     
    373386void JSPropertyNameArrayRelease(JSPropertyNameArrayRef array)
    374387{
    375     if (--array->refCount == 0)
     388    if (--array->refCount == 0) {
     389        JSLock lock(array->globalData->isSharedInstance);
    376390        delete array;
     391    }
    377392}
    378393
     
    392407
    393408    propertyNames->globalData()->heap->registerThread();
     409    JSLock lock(propertyNames->globalData()->isSharedInstance);
    394410
    395411    propertyNames->add(propertyName->identifier(propertyNames->globalData()));
  • trunk/JavaScriptCore/API/JSValueRef.cpp

    r35830 r35853  
    115115    ExecState* exec = toJS(ctx);
    116116    exec->globalData().heap->registerThread();
     117    JSLock lock(exec);
    117118
    118119    JSValue* jsA = toJS(a);
     
    141142    ExecState* exec = toJS(ctx);
    142143    exec->globalData().heap->registerThread();
     144    JSLock lock(exec);
    143145
    144146    JSValue* jsValue = toJS(value);
     
    174176    ExecState* exec = toJS(ctx);
    175177    exec->globalData().heap->registerThread();
     178    JSLock lock(exec);
    176179
    177180    return toRef(jsNumber(exec, value));
     
    182185    ExecState* exec = toJS(ctx);
    183186    exec->globalData().heap->registerThread();
     187    JSLock lock(exec);
    184188
    185189    return toRef(jsString(exec, string->ustring()));
     
    197201    ExecState* exec = toJS(ctx);
    198202    exec->globalData().heap->registerThread();
     203    JSLock lock(exec);
    199204
    200205    JSValue* jsValue = toJS(value);
     
    214219    ExecState* exec = toJS(ctx);
    215220    exec->globalData().heap->registerThread();
     221    JSLock lock(exec);
    216222
    217223    JSValue* jsValue = toJS(value);
     
    231237    ExecState* exec = toJS(ctx);
    232238    exec->globalData().heap->registerThread();
     239    JSLock lock(exec);
    233240
    234241    JSValue* jsValue = toJS(value);
     
    248255    ExecState* exec = toJS(ctx);
    249256    exec->globalData().heap->registerThread();
     257    JSLock lock(exec);
    250258
    251259    JSValue* jsValue = toJS(value);
     
    257265    ExecState* exec = toJS(ctx);
    258266    exec->globalData().heap->registerThread();
     267    JSLock lock(exec);
    259268
    260269    JSValue* jsValue = toJS(value);
  • trunk/JavaScriptCore/API/tests/minidom.c

    r35342 r35853  
    4545    }
    4646   
    47     JSGlobalContextRef context = JSGlobalContextCreate(NULL);
     47    JSGlobalContextRef context = JSGlobalContextCreateInGroup(NULL, NULL);
    4848    JSObjectRef globalObject = JSContextGetGlobalObject(context);
    4949   
     
    7777    globalObject = 0;
    7878    JSGlobalContextRelease(context);
    79     JSGarbageCollect(context);
    8079    printf("PASS: Program exited normally.\n");
    8180    return 0;
  • trunk/JavaScriptCore/API/tests/testapi.c

    r35815 r35853  
    567567   
    568568    // Test garbage collection with a fresh context
    569     context = JSGlobalContextCreate(NULL);
     569    context = JSGlobalContextCreateInGroup(NULL, NULL);
    570570    TestInitializeFinalize = true;
    571571    testInitializeFinalize();
     
    581581    globalObjectClassDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
    582582    JSClassRef globalObjectClass = JSClassCreate(&globalObjectClassDefinition);
    583     context = JSGlobalContextCreate(globalObjectClass);
     583    context = JSGlobalContextCreateInGroup(NULL, globalObjectClass);
    584584
    585585    JSGlobalContextRetain(context);
Note: See TracChangeset for help on using the changeset viewer.