Show
Ignore:
Timestamp:
07/15/06 18:28:25 (2 years ago)
Author:
ggaren
Message:

Reviewed by Maciej.

  • Moved the arguments passed to JSClassCreate into a single structure, called JSClassDefinition. This will enable easier structure migration/versioning in the future, if necessary.


  • Added support for class names.


  • kJSClassDefinitionNull replaces kJSObjectCallbacksNone.


  • JSClass is becoming a fairly complex struct, so I migrated all of its implementation other than reference counting to the sruct.


  • Also moved JSClass* functions in the API to JSObjectRef.cpp, since they're declared in JSObjectRef.h


  • Also added some more informative explanation to the class structure doc.
Files:
1 modified

Legend:

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

    r15444 r15462  
    6060     
    6161    do { 
    62         if (JSObjectInitializeCallback initialize = jsClass->callbacks.initialize) 
     62        if (JSObjectInitializeCallback initialize = jsClass->initialize) 
    6363            initialize(context, thisRef, toRef(exec->exceptionSlot())); 
    64     } while ((jsClass = jsClass->parent)); 
     64    } while ((jsClass = jsClass->parentClass)); 
    6565} 
    6666 
     
    6969    JSObjectRef thisRef = toRef(this); 
    7070     
    71     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    72         if (JSObjectFinalizeCallback finalize = jsClass->callbacks.finalize) 
     71    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     72        if (JSObjectFinalizeCallback finalize = jsClass->finalize) 
    7373            finalize(thisRef); 
    7474     
     
    7878UString JSCallbackObject::className() const 
    7979{ 
    80     return classInfo()->className; 
     80    if (!m_class->className.isNull()) 
     81        return m_class->className; 
     82     
     83    return JSObject::className(); 
    8184} 
    8285 
     
    8790    JSStringRef propertyNameRef = toRef(propertyName.ustring().rep()); 
    8891 
    89     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
     92    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
    9093        // optional optimization to bypass getProperty in cases when we only need to know if the property exists 
    91         if (JSObjectHasPropertyCallback hasProperty = jsClass->callbacks.hasProperty) { 
     94        if (JSObjectHasPropertyCallback hasProperty = jsClass->hasProperty) { 
    9295            if (hasProperty(context, thisRef, propertyNameRef)) { 
    9396                slot.setCustom(this, callbackGetter); 
    9497                return true; 
    9598            } 
    96         } else if (JSObjectGetPropertyCallback getProperty = jsClass->callbacks.getProperty) { 
     99        } else if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) { 
    97100            if (JSValueRef value = getProperty(context, thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) { 
    98101                // cache the value so we don't have to compute it again 
     
    136139    JSValueRef valueRef = toRef(value); 
    137140 
    138     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
    139         if (JSObjectSetPropertyCallback setProperty = jsClass->callbacks.setProperty) { 
     141    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     142        if (JSObjectSetPropertyCallback setProperty = jsClass->setProperty) { 
    140143            if (setProperty(context, thisRef, propertyNameRef, valueRef, toRef(exec->exceptionSlot()))) 
    141144                return; 
     
    177180    JSStringRef propertyNameRef = toRef(propertyName.ustring().rep()); 
    178181     
    179     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
    180         if (JSObjectDeletePropertyCallback deleteProperty = jsClass->callbacks.deleteProperty) { 
     182    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     183        if (JSObjectDeletePropertyCallback deleteProperty = jsClass->deleteProperty) { 
    181184            if (deleteProperty(context, thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) 
    182185                return true; 
     
    210213bool JSCallbackObject::implementsConstruct() const 
    211214{ 
    212     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    213         if (jsClass->callbacks.callAsConstructor) 
     215    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     216        if (jsClass->callAsConstructor) 
    214217            return true; 
    215218 
     
    222225    JSObjectRef thisRef = toRef(this); 
    223226     
    224     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
    225         if (JSObjectCallAsConstructorCallback callAsConstructor = jsClass->callbacks.callAsConstructor) { 
     227    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     228        if (JSObjectCallAsConstructorCallback callAsConstructor = jsClass->callAsConstructor) { 
    226229            size_t argumentCount = args.size(); 
    227230            JSValueRef arguments[argumentCount]; 
     
    238241bool JSCallbackObject::implementsHasInstance() const 
    239242{ 
    240     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    241         if (jsClass->callbacks.hasInstance) 
     243    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     244        if (jsClass->hasInstance) 
    242245            return true; 
    243246 
     
    250253    JSObjectRef thisRef = toRef(this); 
    251254 
    252     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    253         if (JSObjectHasInstanceCallback hasInstance = jsClass->callbacks.hasInstance) 
     255    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     256        if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) 
    254257            return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot())); 
    255258 
     
    261264bool JSCallbackObject::implementsCall() const 
    262265{ 
    263     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    264         if (jsClass->callbacks.callAsFunction) 
     266    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     267        if (jsClass->callAsFunction) 
    265268            return true; 
    266269     
     
    274277    JSObjectRef thisObjRef = toRef(thisObj); 
    275278 
    276     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
    277         if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callbacks.callAsFunction) { 
     279    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     280        if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) { 
    278281            size_t argumentCount = args.size(); 
    279282            JSValueRef arguments[argumentCount]; 
     
    292295    JSObjectRef thisRef = toRef(this); 
    293296 
    294     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) { 
    295         if (JSObjectAddPropertiesToListCallback addPropertiesToList = jsClass->callbacks.addPropertiesToList) 
     297    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) { 
     298        if (JSObjectAddPropertiesToListCallback addPropertiesToList = jsClass->addPropertiesToList) 
    296299            addPropertiesToList(thisRef, toRef(&propertyList)); 
    297300 
     
    327330    JSObjectRef thisRef = toRef(this); 
    328331 
    329     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    330         if (JSObjectConvertToTypeCallback convertToType = jsClass->callbacks.convertToType) 
     332    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     333        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) 
    331334            if (JSValueRef value = convertToType(context, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot()))) 
    332335                return toJS(value)->getNumber(); 
     
    340343    JSObjectRef thisRef = toRef(this); 
    341344 
    342     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
    343         if (JSObjectConvertToTypeCallback convertToType = jsClass->callbacks.convertToType) 
     345    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
     346        if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) 
    344347            if (JSValueRef value = convertToType(context, thisRef, kJSTypeString, toRef(exec->exceptionSlot()))) 
    345348                return toJS(value)->getString(); 
     
    360363bool JSCallbackObject::inherits(JSClassRef c) const 
    361364{ 
    362     for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parent) 
     365    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) 
    363366        if (jsClass == c) 
    364367            return true; 
     
    382385    JSStringRef propertyNameRef = toRef(propertyName.ustring().rep()); 
    383386 
    384     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parent) 
     387    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) 
    385388        if (__JSClass::StaticValuesTable* staticValues = jsClass->staticValues) 
    386389            if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) 
     
    400403        return cachedOrOverrideValue; 
    401404 
    402     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parent) { 
     405    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) { 
    403406        if (__JSClass::StaticFunctionsTable* staticFunctions = jsClass->staticFunctions) { 
    404407            if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { 
     
    421424    JSStringRef propertyNameRef = toRef(propertyName.ustring().rep()); 
    422425 
    423     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parent) 
    424         if (JSObjectGetPropertyCallback getProperty = jsClass->callbacks.getProperty) 
     426    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) 
     427        if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) 
    425428            if (JSValueRef value = getProperty(toRef(exec), thisRef, propertyNameRef, toRef(exec->exceptionSlot()))) 
    426429                return toJS(value);