// Ideally, we would like to inline this, since it's ultra-hot, but with the large VM // loop, it seems like the code side gets the g++-4.3.x inliner in the paranoid mode, so not only // does it not inline this, but it also doesn't inline setValueSlot() and hasGetterSetterProperties() (!!!). bool JSObject::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot) { if (JSValue **location = getDirectLocation(propertyName)) { if (_prop.hasGetterSetterProperties() && location[0]->type() == GetterSetterType) fillGetterPropertySlot(slot, location); else slot.setValueSlot(this, location); return true; } // non-standard Netscape extension if (propertyName == exec->propertyNames().underscoreProto) { slot.setValueSlot(this, &_proto); return true; } return false; }
bool JSDOMWindow::customGetOwnPropertySlot(KJS::ExecState* exec, const KJS::Identifier& propertyName, KJS::PropertySlot& slot) { // we don't want any properties other than "closed" on a closed window if (!impl()->frame()) { if (propertyName == "closed") { const KJS::HashEntry* entry = KJS::Lookup::findEntry(classInfo()->propHashTable, propertyName); ASSERT(entry); if (entry) { slot.setStaticEntry(this, entry, KJS::staticValueGetter<JSDOMWindow>); return true; } } if (propertyName == "close") { KJS::JSValue* proto = prototype(); if (proto->isObject()) { const KJS::HashEntry* entry = KJS::Lookup::findEntry(static_cast<KJS::JSObject*>(proto)->classInfo()->propHashTable, propertyName); ASSERT(entry); if (entry) { slot.setStaticEntry(this, entry, KJS::staticFunctionGetter<JSDOMWindowPrototypeFunction>); return true; } } } slot.setUndefined(this); return true; } // Look for overrides first KJS::JSValue** val = getDirectLocation(propertyName); if (val) { if (!isSafeScript(exec)) { slot.setUndefined(this); return true; } // FIXME: Come up with a way of having JavaScriptCore handle getters/setters in this case if (_prop.hasGetterSetterProperties() && val[0]->type() == KJS::GetterSetterType) fillGetterPropertySlot(slot, val); else slot.setValueSlot(this, val); return true; } // FIXME: We need this to work around the blanket isSafeScript check in KJS::Window. Once we remove that, we // can move this to JSDOMWindowPrototype. KJS::JSValue* proto = prototype(); if (proto->isObject()) { const KJS::HashEntry* entry = KJS::Lookup::findEntry(static_cast<KJS::JSObject*>(proto)->classInfo()->propHashTable, propertyName); if (entry) { if (entry->attr & KJS::Function) { switch (entry->value) { case FocusFuncNum: case BlurFuncNum: case CloseFuncNum: slot.setStaticEntry(this, entry, KJS::staticFunctionGetter<JSDOMWindowPrototypeFunction>); return true; default: if (!isSafeScript(exec)) slot.setUndefined(this); else slot.setStaticEntry(this, entry, KJS::staticFunctionGetter<JSDOMWindowPrototypeFunction>); return true; } } } } return false; }