void JSBoundFunction::finishCreation(ExecState* exec, NativeExecutable* executable, int length, const Identifier& name) { Base::finishCreation(exec, executable, length, name); ASSERT(inherits(&s_info)); initializeGetterSetterProperty(exec, exec->propertyNames().arguments, globalObject()->throwTypeErrorGetterSetter(exec), DontDelete | DontEnum | Accessor); initializeGetterSetterProperty(exec, exec->propertyNames().caller, globalObject()->throwTypeErrorGetterSetter(exec), DontDelete | DontEnum | Accessor); }
bool JSFunction::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) { if (isHostFunction()) return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); if (propertyName == exec->propertyNames().prototype) { PropertySlot slot; getOwnPropertySlotVirtual(exec, propertyName, slot); return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); } if (propertyName == exec->propertyNames().arguments) { if (jsExecutable()->isStrictMode()) { bool result = Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); if (!result) { initializeGetterSetterProperty(exec, propertyName, globalObject()->throwTypeErrorGetterSetter(exec), DontDelete | DontEnum | Getter | Setter); result = Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); ASSERT(result); } return result; } descriptor.setDescriptor(exec->interpreter()->retrieveArguments(exec, this), ReadOnly | DontEnum | DontDelete); return true; } if (propertyName == exec->propertyNames().length) { descriptor.setDescriptor(jsNumber(jsExecutable()->parameterCount()), ReadOnly | DontEnum | DontDelete); return true; } if (propertyName == exec->propertyNames().caller) { if (jsExecutable()->isStrictMode()) { bool result = Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); if (!result) { initializeGetterSetterProperty(exec, propertyName, globalObject()->throwTypeErrorGetterSetter(exec), DontDelete | DontEnum | Getter | Setter); result = Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); ASSERT(result); } return result; } descriptor.setDescriptor(exec->interpreter()->retrieveCaller(exec, this), ReadOnly | DontEnum | DontDelete); return true; } return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); }