Changeset 440 for trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h
- Timestamp:
- 08/18/08 11:14:49 (5 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h
r427 r440 34 34 #include "JSString.h" 35 35 #include "JSStringRef.h" 36 #include "OpaqueJSString.h" 36 37 #include "PropertyNameArray.h" 37 38 #include <wtf/Vector.h> … … 42 43 JSCallbackObject<Base>::JSCallbackObject(ExecState* exec, JSClassRef jsClass, JSValue* prototype, void* data) 43 44 : Base(prototype) 44 , m_privateData(data) 45 , m_class(JSClassRetain(jsClass)) 45 , m_callbackObjectData(new JSCallbackObjectData(data, jsClass)) 46 46 { 47 47 init(exec); … … 52 52 template <class Base> 53 53 JSCallbackObject<Base>::JSCallbackObject(JSClassRef jsClass) 54 : m_privateData(0) 55 , m_class(JSClassRetain(jsClass)) 54 : m_callbackObjectData(new JSCallbackObjectData(0, jsClass)) 56 55 { 57 56 ASSERT(Base::isGlobalObject()); … … 65 64 66 65 Vector<JSObjectInitializeCallback, 16> initRoutines; 67 JSClassRef jsClass = m_class;66 JSClassRef jsClass = classRef(); 68 67 do { 69 68 if (JSObjectInitializeCallback initialize = jsClass->initialize) … … 83 82 JSObjectRef thisRef = toRef(this); 84 83 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) 87 86 finalize(thisRef); 88 }89 90 JSClassRelease(m_class);91 87 } 92 88 … … 94 90 UString JSCallbackObject<Base>::className() const 95 91 { 96 UString thisClassName = m_class->className();92 UString thisClassName = classRef()->className(); 97 93 if (!thisClassName.isNull()) 98 94 return thisClassName; … … 106 102 JSContextRef ctx = toRef(exec); 107 103 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) { 111 107 // optional optimization to bypass getProperty in cases when we only need to know if the property exists 112 108 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())) { 114 112 slot.setCustom(this, callbackGetter); 115 113 return true; 116 114 } 117 115 } 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()))) { 119 119 // cache the value so we don't have to compute it again 120 120 // FIXME: This violates the PropertySlot design a little bit. … … 154 154 JSContextRef ctx = toRef(exec); 155 155 JSObjectRef thisRef = toRef(this); 156 JSStringRef propertyNameRef = toRef(propertyName.ustring().rep());156 RefPtr<OpaqueJSString> propertyNameRef; 157 157 JSValueRef valueRef = toRef(value); 158 158 159 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {159 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 160 160 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()))) 162 164 return; 163 165 } … … 168 170 return; 169 171 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()))) 171 175 return; 172 176 } else … … 199 203 JSContextRef ctx = toRef(exec); 200 204 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) { 204 208 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()))) 206 212 return true; 207 213 } … … 236 242 ConstructType JSCallbackObject<Base>::getConstructData(ConstructData& constructData) 237 243 { 238 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {244 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 239 245 if (jsClass->callAsConstructor) { 240 246 constructData.native.function = construct; … … 268 274 bool JSCallbackObject<Base>::implementsHasInstance() const 269 275 { 270 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)276 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 271 277 if (jsClass->hasInstance) 272 278 return true; … … 281 287 JSObjectRef thisRef = toRef(this); 282 288 283 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {289 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 284 290 if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) 285 291 return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot())); … … 292 298 CallType JSCallbackObject<Base>::getCallData(CallData& callData) 293 299 { 294 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {300 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 295 301 if (jsClass->callAsFunction) { 296 302 callData.native.function = call; … … 308 314 JSObjectRef thisObjRef = toRef(thisValue->toThisObject(exec)); 309 315 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) { 311 317 if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) { 312 318 int argumentCount = static_cast<int>(args.size()); … … 328 334 JSObjectRef thisRef = toRef(this); 329 335 330 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {336 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { 331 337 if (JSObjectGetPropertyNamesCallback getPropertyNames = jsClass->getPropertyNames) 332 338 getPropertyNames(execRef, thisRef, toRef(&propertyNames)); … … 369 375 JSObjectRef thisRef = toRef(this); 370 376 371 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)377 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 372 378 if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { 373 379 if (JSValueRef value = convertToType(ctx, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot()))) … … 384 390 JSObjectRef thisRef = toRef(this); 385 391 386 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)392 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 387 393 if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) { 388 394 JSValueRef value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot())); … … 397 403 void JSCallbackObject<Base>::setPrivate(void* data) 398 404 { 399 m_ privateData = data;405 m_callbackObjectData->privateData = data; 400 406 } 401 407 … … 403 409 void* JSCallbackObject<Base>::getPrivate() 404 410 { 405 return m_ privateData;411 return m_callbackObjectData->privateData; 406 412 } 407 413 … … 409 415 bool JSCallbackObject<Base>::inherits(JSClassRef c) const 410 416 { 411 for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)417 for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) 412 418 if (jsClass == c) 413 419 return true; … … 431 437 432 438 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) 436 442 if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) 437 443 if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) 438 444 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()))) 440 448 return toJS(value); 441 449 } … … 455 463 return slot2.getValue(exec, propertyName); 456 464 457 for (JSClassRef jsClass = thisObj-> m_class; jsClass; jsClass = jsClass->parentClass) {465 for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) { 458 466 if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { 459 467 if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { … … 477 485 478 486 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) 482 490 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()))) 484 494 return toJS(value); 485 495 }
