Show
Ignore:
Timestamp:
08/18/08 11:14:49 (5 months ago)
Author:
odole
Message:

merge with webkit revision 35814

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r427 r440  
    3434#include "JSString.h" 
    3535#include "JSStringRef.h" 
     36#include "OpaqueJSString.h" 
    3637#include "PropertyNameArray.h" 
    3738#include <wtf/Vector.h> 
     
    4243JSCallbackObject<Base>::JSCallbackObject(ExecState* exec, JSClassRef jsClass, JSValue* prototype, void* data) 
    4344    : Base(prototype) 
    44     , m_privateData(data) 
    45     , m_class(JSClassRetain(jsClass)) 
     45    , m_callbackObjectData(new JSCallbackObjectData(data, jsClass)) 
    4646{ 
    4747    init(exec); 
     
    5252template <class Base> 
    5353JSCallbackObject<Base>::JSCallbackObject(JSClassRef jsClass) 
    54     : m_privateData(0) 
    55     , m_class(JSClassRetain(jsClass)) 
     54    : m_callbackObjectData(new JSCallbackObjectData(0, jsClass)) 
    5655{ 
    5756    ASSERT(Base::isGlobalObject()); 
     
    6564     
    6665    Vector<JSObjectInitializeCallback, 16> initRoutines; 
    67     JSClassRef jsClass = m_class
     66    JSClassRef jsClass = classRef()
    6867    do { 
    6968        if (JSObjectInitializeCallback initialize = jsClass->initialize) 
     
    8382    JSObjectRef thisRef = toRef(this); 
    8483     
    85     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
    86         if (JSObjectFinalizeCallback finalize = jsClass->finalize) { 
     84    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 
     85        if (JSObjectFinalizeCallback finalize = jsClass->finalize) 
    8786            finalize(thisRef); 
    88         } 
    89              
    90     JSClassRelease(m_class); 
    9187} 
    9288 
     
    9490UString JSCallbackObject<Base>::className() const 
    9591{ 
    96     UString thisClassName = m_class->className(); 
     92    UString thisClassName = classRef()->className(); 
    9793    if (!thisClassName.isNull()) 
    9894        return thisClassName; 
     
    106102    JSContextRef ctx = toRef(exec); 
    107103    JSObjectRef thisRef = toRef(this); 
    108     JSStringRef propertyNameRef = toRef(propertyName.ustring().rep())
    109      
    110     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     104    RefPtr<OpaqueJSString> propertyNameRef
     105     
     106    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    111107        // optional optimization to bypass getProperty in cases when we only need to know if the property exists 
    112108        if (JSObjectHasPropertyCallback hasProperty = jsClass->hasProperty) { 
    113             if (hasProperty(ctx, thisRef, propertyNameRef)) { 
     109            if (!propertyNameRef) 
     110                propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     111            if (hasProperty(ctx, thisRef, propertyNameRef.get())) { 
    114112                slot.setCustom(this, callbackGetter); 
    115113                return true; 
    116114            } 
    117115        } else if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) { 
    118             if (JSValueRef value = getProperty(ctx, thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) { 
     116            if (!propertyNameRef) 
     117                propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     118            if (JSValueRef value = getProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) { 
    119119                // cache the value so we don't have to compute it again 
    120120                // FIXME: This violates the PropertySlot design a little bit. 
     
    154154    JSContextRef ctx = toRef(exec); 
    155155    JSObjectRef thisRef = toRef(this); 
    156     JSStringRef propertyNameRef = toRef(propertyName.ustring().rep())
     156    RefPtr<OpaqueJSString> propertyNameRef
    157157    JSValueRef valueRef = toRef(value); 
    158158     
    159     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     159    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    160160        if (JSObjectSetPropertyCallback setProperty = jsClass->setProperty) { 
    161             if (setProperty(ctx, thisRef, propertyNameRef, valueRef, toRef(exec->exceptionSlot()))) 
     161            if (!propertyNameRef) 
     162                propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     163            if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot()))) 
    162164                return; 
    163165        } 
     
    168170                    return; 
    169171                if (JSObjectSetPropertyCallback setProperty = entry->setProperty) { 
    170                     if (setProperty(ctx, thisRef, propertyNameRef, valueRef, toRef(exec->exceptionSlot()))) 
     172                    if (!propertyNameRef) 
     173                        propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     174                    if (setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, toRef(exec->exceptionSlot()))) 
    171175                        return; 
    172176                } else 
     
    199203    JSContextRef ctx = toRef(exec); 
    200204    JSObjectRef thisRef = toRef(this); 
    201     JSStringRef propertyNameRef = toRef(propertyName.ustring().rep())
    202      
    203     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     205    RefPtr<OpaqueJSString> propertyNameRef
     206     
     207    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    204208        if (JSObjectDeletePropertyCallback deleteProperty = jsClass->deleteProperty) { 
    205             if (deleteProperty(ctx, thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) 
     209            if (!propertyNameRef) 
     210                propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     211            if (deleteProperty(ctx, thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) 
    206212                return true; 
    207213        } 
     
    236242ConstructType JSCallbackObject<Base>::getConstructData(ConstructData& constructData) 
    237243{ 
    238     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     244    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    239245        if (jsClass->callAsConstructor) { 
    240246            constructData.native.function = construct; 
     
    268274bool JSCallbackObject<Base>::implementsHasInstance() const 
    269275{ 
    270     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     276    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 
    271277        if (jsClass->hasInstance) 
    272278            return true; 
     
    281287    JSObjectRef thisRef = toRef(this); 
    282288     
    283     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     289    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    284290        if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) 
    285291            return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot())); 
     
    292298CallType JSCallbackObject<Base>::getCallData(CallData& callData) 
    293299{ 
    294     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     300    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    295301        if (jsClass->callAsFunction) { 
    296302            callData.native.function = call; 
     
    308314    JSObjectRef thisObjRef = toRef(thisValue->toThisObject(exec)); 
    309315     
    310     for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(functionObject)->m_class; jsClass; jsClass = jsClass->parentClass) { 
     316    for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(functionObject)->classRef(); jsClass; jsClass = jsClass->parentClass) { 
    311317        if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) { 
    312318            int argumentCount = static_cast<int>(args.size()); 
     
    328334    JSObjectRef thisRef = toRef(this); 
    329335     
    330     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     336    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 
    331337        if (JSObjectGetPropertyNamesCallback getPropertyNames = jsClass->getPropertyNames) 
    332338            getPropertyNames(execRef, thisRef, toRef(&propertyNames)); 
     
    369375    JSObjectRef thisRef = toRef(this); 
    370376     
    371     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     377    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 
    372378        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { 
    373379            if (JSValueRef value = convertToType(ctx, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot()))) 
     
    384390    JSObjectRef thisRef = toRef(this); 
    385391     
    386     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     392    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 
    387393        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { 
    388394            JSValueRef value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot())); 
     
    397403void JSCallbackObject<Base>::setPrivate(void* data) 
    398404{ 
    399     m_privateData = data; 
     405    m_callbackObjectData->privateData = data; 
    400406} 
    401407 
     
    403409void* JSCallbackObject<Base>::getPrivate() 
    404410{ 
    405     return m_privateData; 
     411    return m_callbackObjectData->privateData; 
    406412} 
    407413 
     
    409415bool JSCallbackObject<Base>::inherits(JSClassRef c) const 
    410416{ 
    411     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     417    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 
    412418        if (jsClass == c) 
    413419            return true; 
     
    431437     
    432438    JSObjectRef thisRef = toRef(thisObj); 
    433     JSStringRef propertyNameRef = toRef(propertyName.ustring().rep())
    434      
    435     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) 
     439    RefPtr<OpaqueJSString> propertyNameRef
     440     
     441    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) 
    436442        if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) 
    437443            if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) 
    438444                if (JSObjectGetPropertyCallback getProperty = entry->getProperty) { 
    439                     if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) 
     445                    if (!propertyNameRef) 
     446                        propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     447                    if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) 
    440448                        return toJS(value); 
    441449                } 
     
    455463        return slot2.getValue(exec, propertyName); 
    456464     
    457     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) { 
     465    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) { 
    458466        if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { 
    459467            if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { 
     
    477485     
    478486    JSObjectRef thisRef = toRef(thisObj); 
    479     JSStringRef propertyNameRef = toRef(propertyName.ustring().rep())
    480      
    481     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) 
     487    RefPtr<OpaqueJSString> propertyNameRef
     488     
     489    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) 
    482490        if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) { 
    483             if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) 
     491            if (!propertyNameRef) 
     492                propertyNameRef = OpaqueJSString::create(propertyName.ustring()); 
     493            if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), toRef(exec->exceptionSlot()))) 
    484494                return toJS(value); 
    485495        }