Changeset 37799 in webkit for trunk/JavaScriptCore/kjs/JSObject.h
- Timestamp:
- Oct 22, 2008, 5:11:11 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/JSObject.h
r37747 r37799 56 56 friend class BatchedTransitionOptimizer; 57 57 friend class CTI; 58 friend class JSCell; 58 59 59 60 public: … … 184 185 static const size_t nonInlineBaseStorageCapacity = 16; 185 186 186 static PassRefPtr<StructureID> createStructureID(JSValuePtr proto) { return StructureID::create(proto, TypeInfo(ObjectType)); } 187 static PassRefPtr<StructureID> createStructureID(JSValuePtr prototype) 188 { 189 return StructureID::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot)); 190 } 187 191 188 192 protected: … … 190 194 191 195 private: 196 bool inlineGetOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); 197 192 198 const HashEntry* findPropertyHashEntry(ExecState*, const Identifier& propertyName) const; 193 199 StructureID* createInheritorID(); … … 267 273 } 268 274 269 inline JSValuePtr JSObject::get(ExecState* exec, const Identifier& propertyName) const 270 { 271 PropertySlot slot(this); 272 if (const_cast<JSObject*>(this)->getPropertySlot(exec, propertyName, slot)) 273 return slot.getValue(exec, propertyName); 274 275 return jsUndefined(); 276 } 277 278 inline JSValuePtr JSObject::get(ExecState* exec, unsigned propertyName) const 279 { 280 PropertySlot slot(this); 281 if (const_cast<JSObject*>(this)->getPropertySlot(exec, propertyName, slot)) 282 return slot.getValue(exec, propertyName); 283 284 return jsUndefined(); 285 } 286 287 // It may seem crazy to inline a function this large but it makes a big difference 288 // since this is function very hot in variable lookup 289 inline bool JSObject::getPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 290 { 291 JSObject* object = this; 292 while (true) { 293 if (object->getOwnPropertySlot(exec, propertyName, slot)) 294 return true; 295 296 JSValuePtr prototype = object->prototype(); 297 if (!prototype->isObject()) 298 return false; 299 300 object = asObject(prototype); 301 } 302 } 303 304 inline bool JSObject::getPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot) 305 { 306 JSObject* object = this; 307 308 while (true) { 309 if (object->getOwnPropertySlot(exec, propertyName, slot)) 310 return true; 311 312 JSValuePtr prototype = object->prototype(); 313 if (!prototype->isObject()) 314 break; 315 316 object = asObject(prototype); 275 ALWAYS_INLINE bool JSObject::inlineGetOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 276 { 277 if (JSValuePtr* location = getDirectLocation(propertyName)) { 278 if (m_structureID->hasGetterSetterProperties() && location[0]->isGetterSetter()) 279 fillGetterPropertySlot(slot, location); 280 else 281 slot.setValueSlot(this, location, offsetForLocation(location)); 282 return true; 283 } 284 285 // non-standard Netscape extension 286 if (propertyName == exec->propertyNames().underscoreProto) { 287 slot.setValue(prototype()); 288 return true; 317 289 } 318 290 … … 320 292 } 321 293 322 // It may seem crazy to inline a function this large, especially a virtual function,323 // but it makes a big difference to property lookup that derived classes can inline their324 // base class call to this.325 294 ALWAYS_INLINE bool JSObject::getOwnPropertySlotForWrite(ExecState* exec, const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) 326 295 { … … 352 321 ALWAYS_INLINE bool JSObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 353 322 { 354 if (JSValuePtr* location = getDirectLocation(propertyName)) { 355 if (m_structureID->hasGetterSetterProperties() && location[0]->isGetterSetter()) 356 fillGetterPropertySlot(slot, location); 357 else 358 slot.setValueSlot(this, location, offsetForLocation(location)); 359 return true; 360 } 361 362 // non-standard Netscape extension 363 if (propertyName == exec->propertyNames().underscoreProto) { 364 slot.setValue(prototype()); 365 return true; 366 } 367 368 return false; 323 return inlineGetOwnPropertySlot(exec, propertyName, slot); 324 } 325 326 ALWAYS_INLINE bool JSCell::fastGetOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 327 { 328 if (structureID()->typeInfo().hasStandardGetOwnPropertySlot()) 329 return asObject(this)->inlineGetOwnPropertySlot(exec, propertyName, slot); 330 return getOwnPropertySlot(exec, propertyName, slot); 331 } 332 333 // It may seem crazy to inline a function this large but it makes a big difference 334 // since this is function very hot in variable lookup 335 inline bool JSObject::getPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 336 { 337 JSObject* object = this; 338 while (true) { 339 if (object->fastGetOwnPropertySlot(exec, propertyName, slot)) 340 return true; 341 JSValuePtr prototype = object->prototype(); 342 if (!prototype->isObject()) 343 return false; 344 object = asObject(prototype); 345 } 346 } 347 348 inline bool JSObject::getPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot) 349 { 350 JSObject* object = this; 351 while (true) { 352 if (object->getOwnPropertySlot(exec, propertyName, slot)) 353 return true; 354 JSValuePtr prototype = object->prototype(); 355 if (!prototype->isObject()) 356 return false; 357 object = asObject(prototype); 358 } 359 } 360 361 inline JSValuePtr JSObject::get(ExecState* exec, const Identifier& propertyName) const 362 { 363 PropertySlot slot(this); 364 if (const_cast<JSObject*>(this)->getPropertySlot(exec, propertyName, slot)) 365 return slot.getValue(exec, propertyName); 366 367 return jsUndefined(); 368 } 369 370 inline JSValuePtr JSObject::get(ExecState* exec, unsigned propertyName) const 371 { 372 PropertySlot slot(this); 373 if (const_cast<JSObject*>(this)->getPropertySlot(exec, propertyName, slot)) 374 return slot.getValue(exec, propertyName); 375 376 return jsUndefined(); 369 377 } 370 378 … … 462 470 JSCell* cell = asCell(); 463 471 while (true) { 464 if (cell-> getOwnPropertySlot(exec, propertyName, slot))472 if (cell->fastGetOwnPropertySlot(exec, propertyName, slot)) 465 473 return slot.getValue(exec, propertyName); 466 474 ASSERT(cell->isObject());
Note:
See TracChangeset
for help on using the changeset viewer.