bool CreateThis(JSContext *cx, HandleObject callee, MutableHandleValue rval) { rval.set(MagicValue(JS_IS_CONSTRUCTING)); if (callee->isFunction()) { JSFunction *fun = callee->toFunction(); if (fun->isInterpreted()) rval.set(ObjectValue(*js_CreateThisForFunction(cx, callee, false))); } return true; }
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; }
static RawObject CloneObject(JSContext *cx, HandleObject srcObj, CloneMemory &clonedObjects) { CloneMemory::AddPtr p = clonedObjects.lookupForAdd(srcObj.get()); if (p) return p->value; RootedObject clone(cx); if (srcObj->isFunction()) { RootedFunction fun(cx, srcObj->toFunction()); clone = CloneFunctionObject(cx, fun, cx->global(), fun->getAllocKind()); } else if (srcObj->isRegExp()) { RegExpObject &reobj = srcObj->asRegExp(); RootedAtom source(cx, reobj.getSource()); clone = RegExpObject::createNoStatics(cx, source, reobj.getFlags(), NULL); } else if (srcObj->isDate()) { clone = JS_NewDateObjectMsec(cx, srcObj->getDateUTCTime().toNumber()); } else if (srcObj->isBoolean()) { clone = BooleanObject::create(cx, srcObj->asBoolean().unbox()); } else if (srcObj->isNumber()) { clone = NumberObject::create(cx, srcObj->asNumber().unbox()); } else if (srcObj->isString()) { Rooted<JSStableString*> str(cx, srcObj->asString().unbox()->ensureStable(cx)); if (!str) return NULL; str = js_NewStringCopyN(cx, str->chars().get(), str->length())->ensureStable(cx); if (!str) return NULL; clone = StringObject::create(cx, str); } else if (srcObj->isDenseArray()) { return CloneDenseArray(cx, srcObj, clonedObjects); } else { if (srcObj->isArray()) { clone = NewDenseEmptyArray(cx); } else { JS_ASSERT(srcObj->isNative()); clone = NewObjectWithClassProto(cx, srcObj->getClass(), NULL, cx->global(), srcObj->getAllocKind()); } } if (!clone || !clonedObjects.relookupOrAdd(p, srcObj.get(), clone.get()) || !CloneProperties(cx, srcObj, clone, clonedObjects)) { return NULL; } return clone; }
static JSBool fun_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags, JSObject **objp) { if (!JSID_IS_ATOM(id)) return true; RootedFunction fun(cx); fun = obj->toFunction(); if (JSID_IS_ATOM(id, cx->runtime->atomState.classPrototypeAtom)) { /* * Native or "built-in" functions do not have a .prototype property per * ECMA-262, or (Object.prototype, Function.prototype, etc.) have that * property created eagerly. * * ES5 15.3.4: the non-native function object named Function.prototype * does not have a .prototype property. * * ES5 15.3.4.5: bound functions don't have a prototype property. The * isNative() test covers this case because bound functions are native * functions by definition/construction. */ if (fun->isNative() || fun->isFunctionPrototype()) return true; if (!ResolveInterpretedFunctionPrototype(cx, fun)) return false; *objp = fun; return true; } if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom) || JSID_IS_ATOM(id, cx->runtime->atomState.nameAtom)) { JS_ASSERT(!IsInternalFunctionObject(obj)); Value v; if (JSID_IS_ATOM(id, cx->runtime->atomState.lengthAtom)) v.setInt32(fun->nargs - fun->hasRest()); else v.setString(fun->atom ? fun->atom : cx->runtime->emptyString); if (!DefineNativeProperty(cx, fun, id, v, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_PERMANENT | JSPROP_READONLY, 0, 0)) { return false; } *objp = fun; return true; } for (unsigned i = 0; i < ArrayLength(poisonPillProps); i++) { const uint16_t offset = poisonPillProps[i]; if (JSID_IS_ATOM(id, OFFSET_TO_NAME(cx->runtime, offset))) { JS_ASSERT(!IsInternalFunctionObject(fun)); PropertyOp getter; StrictPropertyOp setter; unsigned attrs = JSPROP_PERMANENT; if (fun->isInterpreted() ? fun->inStrictMode() : fun->isBoundFunction()) { JSObject *throwTypeError = fun->global().getThrowTypeError(); getter = CastAsPropertyOp(throwTypeError); setter = CastAsStrictPropertyOp(throwTypeError); attrs |= JSPROP_GETTER | JSPROP_SETTER; } else { getter = fun_getProperty; setter = JS_StrictPropertyStub; } if (!DefineNativeProperty(cx, fun, id, UndefinedValue(), getter, setter, attrs, 0, 0)) { return false; } *objp = fun; return true; } } return true; }