static JSBool StrictArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, MutableHandleValue vp) { if (!obj->isStrictArguments()) return true; unsigned attrs; if (!baseops::GetAttributes(cx, obj, id, &attrs)) return false; JS_ASSERT(!(attrs & JSPROP_READONLY)); attrs &= (JSPROP_ENUMERATE | JSPROP_PERMANENT); /* only valid attributes */ Rooted<StrictArgumentsObject*> argsobj(cx, &obj->asStrictArguments()); if (JSID_IS_INT(id)) { unsigned arg = unsigned(JSID_TO_INT(id)); if (arg < argsobj->initialLength()) { argsobj->setElement(arg, vp); return true; } } else { JS_ASSERT(JSID_IS_ATOM(id, cx->names().length)); } /* * For simplicity we use delete/define to replace the property with one * backed by the default Object getter and setter. Note that we rely on * args_delProperty to clear the corresponding reserved slot so the GC can * collect its value. */ RootedValue value(cx); return baseops::DeleteGeneric(cx, argsobj, id, &value, strict) && baseops::DefineGeneric(cx, argsobj, id, vp, NULL, NULL, attrs); }
static JSBool StrictArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, Value *vp) { if (!obj->isStrictArguments()) return true; Rooted<StrictArgumentsObject*> argsobj(cx, &obj->asStrictArguments()); if (JSID_IS_INT(id)) { unsigned arg = unsigned(JSID_TO_INT(id)); if (arg < argsobj->initialLength()) { argsobj->setElement(arg, *vp); return true; } } else { JS_ASSERT(JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom)); } /* * For simplicity we use delete/set to replace the property with one * backed by the default Object getter and setter. Note that we rely on * args_delProperty to clear the corresponding reserved slot so the GC can * collect its value. */ RootedValue value(cx); return baseops::DeleteGeneric(cx, argsobj, id, value.address(), strict) && baseops::SetPropertyHelper(cx, argsobj, id, 0, vp, strict); }
static JSBool StrictArgGetter(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp) { if (!obj->isStrictArguments()) return true; StrictArgumentsObject &argsobj = obj->asStrictArguments(); if (JSID_IS_INT(id)) { /* * arg can exceed the number of arguments if a script changed the * prototype to point to another Arguments object with a bigger argc. */ unsigned arg = unsigned(JSID_TO_INT(id)); if (arg < argsobj.initialLength() && !argsobj.isElementDeleted(arg)) vp.set(argsobj.element(arg)); } else { JS_ASSERT(JSID_IS_ATOM(id, cx->names().length)); if (!argsobj.hasOverriddenLength()) vp.setInt32(argsobj.initialLength()); } return true; }