bool CreateThis(JSContext *cx, HandleObject callee, MutableHandleValue rval) { rval.set(MagicValue(JS_IS_CONSTRUCTING)); if (callee->isFunction()) { JSFunction *fun = callee->toFunction(); if (fun->isInterpreted()) { JSScript *script = fun->getOrCreateScript(cx); if (!script || !script->ensureHasTypes(cx)) return false; rval.set(ObjectValue(*CreateThisForFunction(cx, callee, false))); } } return true; }
bool CreateThis(JSContext *cx, HandleObject callee, MutableHandleValue rval) { rval.set(MagicValue(JS_IS_CONSTRUCTING)); if (callee->is<JSFunction>()) { JSFunction *fun = &callee->as<JSFunction>(); if (fun->isInterpretedConstructor()) { JSScript *script = fun->getOrCreateScript(cx); if (!script || !script->ensureHasTypes(cx)) return false; JSObject *thisObj = CreateThisForFunction(cx, callee, GenericObject); if (!thisObj) return false; rval.set(ObjectValue(*thisObj)); } } return true; }
JSBool CallObject::setArgOp(JSContext *cx, JSObject *obj, jsid id, JSBool strict, Value *vp) { CallObject &callobj = obj->asCall(); JS_ASSERT((int16_t) JSID_TO_INT(id) == JSID_TO_INT(id)); unsigned i = (uint16_t) JSID_TO_INT(id); if (StackFrame *fp = callobj.maybeStackFrame()) fp->formalArg(i) = *vp; else callobj.setArg(i, *vp); JSFunction *fun = callobj.getCalleeFunction(); JSScript *script = fun->script(); if (!script->ensureHasTypes(cx)) return false; TypeScript::SetArgument(cx, script, i, *vp); return true; }
static JSBool ArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, Value *vp) { if (!obj->isNormalArguments()) return true; NormalArgumentsObject &argsobj = obj->asNormalArguments(); JSScript *script = argsobj.containingScript(); if (JSID_IS_INT(id)) { unsigned arg = unsigned(JSID_TO_INT(id)); if (arg < argsobj.initialLength() && !argsobj.isElementDeleted(arg)) { argsobj.setElement(arg, *vp); if (arg < script->function()->nargs) { if (!script->ensureHasTypes(cx)) return false; types::TypeScript::SetArgument(cx, script, arg, *vp); } return true; } } else { JS_ASSERT(JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom) || JSID_IS_ATOM(id, cx->runtime->atomState.calleeAtom)); } /* * 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. Note also that we must define the property instead * of setting it in case the user has changed the prototype to an object * that has a setter for this id. */ RootedValue value(cx); return baseops::DeleteGeneric(cx, obj, id, value.address(), false) && baseops::DefineProperty(cx, obj, id, vp, NULL, NULL, JSPROP_ENUMERATE); }