-void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunction, unsigned attributes)
-{
- JSValue object = getDirect(exec->globalData(), propertyName);
- if (object && object.isGetterSetter()) {
- ASSERT(m_structure->hasGetterSetterProperties());
- asGetterSetter(object)->setGetter(exec->globalData(), getterFunction);
- return;
- }
-
- JSGlobalData& globalData = exec->globalData();
- PutPropertySlot slot;
- GetterSetter* getterSetter = new (exec) GetterSetter(exec);
- putDirectInternal(globalData, propertyName, getterSetter, attributes | Getter, true, slot);
-
- // putDirect will change our Structure if we add a new property. For
- // getters and setters, though, we also need to change our Structure
- // if we override an existing non-getter or non-setter.
- if (slot.type() != PutPropertySlot::NewProperty) {
- if (!m_structure->isDictionary())
- setStructure(exec->globalData(), Structure::getterSetterTransition(globalData, m_structure.get()));
- }
-
- m_structure->setHasGetterSetterProperties(true);
- getterSetter->setGetter(globalData, getterFunction);
-}
-
-void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunction, unsigned attributes)
-{
- JSValue object = getDirect(exec->globalData(), propertyName);
- if (object && object.isGetterSetter()) {
- ASSERT(m_structure->hasGetterSetterProperties());
- asGetterSetter(object)->setSetter(exec->globalData(), setterFunction);
- return;
- }
-
- PutPropertySlot slot;
- GetterSetter* getterSetter = new (exec) GetterSetter(exec);
- putDirectInternal(exec->globalData(), propertyName, getterSetter, attributes | Setter, true, slot);
-
- // putDirect will change our Structure if we add a new property. For
- // getters and setters, though, we also need to change our Structure
- // if we override an existing non-getter or non-setter.
- if (slot.type() != PutPropertySlot::NewProperty) {
- if (!m_structure->isDictionary())
- setStructure(exec->globalData(), Structure::getterSetterTransition(exec->globalData(), m_structure.get()));
- }
-
- m_structure->setHasGetterSetterProperties(true);
- getterSetter->setSetter(exec->globalData(), setterFunction);
-}
-
-JSValue JSObject::lookupGetter(ExecState* exec, const Identifier& propertyName)
-{
- JSObject* object = this;
- while (true) {
- if (JSValue value = object->getDirect(exec->globalData(), propertyName)) {
- if (!value.isGetterSetter())
- return jsUndefined();
- JSObject* functionObject = asGetterSetter(value)->getter();
- if (!functionObject)
- return jsUndefined();
- return functionObject;
- }
-
- if (!object->prototype() || !object->prototype().isObject())
- return jsUndefined();
- object = asObject(object->prototype());
- }
-}
-
-JSValue JSObject::lookupSetter(ExecState* exec, const Identifier& propertyName)
-{
- JSObject* object = this;
- while (true) {
- if (JSValue value = object->getDirect(exec->globalData(), propertyName)) {
- if (!value.isGetterSetter())
- return jsUndefined();
- JSObject* functionObject = asGetterSetter(value)->setter();
- if (!functionObject)
- return jsUndefined();
- return functionObject;
- }
-
- if (!object->prototype() || !object->prototype().isObject())
- return jsUndefined();
- object = asObject(object->prototype());
- }
-}
-
-bool JSObject::hasInstance(ExecState* exec, JSValue value, JSValue proto)