author | Boris Zbarsky <bzbarsky@mit.edu> |
Tue, 14 Jan 2014 21:46:44 -0500 | |
changeset 163443 | 675b925b575e3e46a037f66061813c360bce9693 |
parent 163442 | a1b7f52cccdb7fa2b4e5b27a0e5390ce079055f7 |
child 163444 | 4888ad4664d82680eeb2122c05c4e4b775714838 |
push id | 25996 |
push user | emorley@mozilla.com |
push date | Wed, 15 Jan 2014 15:54:39 +0000 |
treeherder | mozilla-central@dd2cf81c56b7 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | terrence |
bugs | 959695 |
milestone | 29.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -3981,17 +3981,18 @@ JS_CloneFunctionObject(JSContext *cx, JS assertSameCompartment(cx, parent); // Note that funobj can be in a different compartment. if (!parent) parent = cx->global(); if (!funobj->is<JSFunction>()) { AutoCompartment ac(cx, funobj); - ReportIsNotFunction(cx, ObjectValue(*funobj)); + RootedValue v(cx, ObjectValue(*funobj)); + ReportIsNotFunction(cx, v); return nullptr; } RootedFunction fun(cx, &funobj->as<JSFunction>()); if (fun->isInterpretedLazy()) { AutoCompartment ac(cx, funobj); if (!fun->getOrCreateScript(cx)) return nullptr;
--- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -1202,17 +1202,17 @@ js_DefineOwnProperty(JSContext *cx, JSOb assertSameCompartment(cx, descriptor.getterObject()); if (descriptor.hasSetterObject()) assertSameCompartment(cx, descriptor.setterObject()); return DefineOwnProperty(cx, HandleObject(obj), id, descriptor, bp); } JS_FRIEND_API(bool) -js_ReportIsNotFunction(JSContext *cx, const JS::Value& v) +js_ReportIsNotFunction(JSContext *cx, JS::HandleValue v) { return ReportIsNotFunction(cx, v); } #ifdef DEBUG JS_PUBLIC_API(bool) js::IsInRequest(JSContext *cx) {
--- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -1777,17 +1777,17 @@ CheckDefineProperty(JSContext *cx, JS::H } /* namespace js */ extern JS_FRIEND_API(bool) js_DefineOwnProperty(JSContext *cx, JSObject *objArg, jsid idArg, JS::Handle<JSPropertyDescriptor> descriptor, bool *bp); extern JS_FRIEND_API(bool) -js_ReportIsNotFunction(JSContext *cx, const JS::Value& v); +js_ReportIsNotFunction(JSContext *cx, JS::HandleValue v); #ifdef JSGC_GENERATIONAL extern JS_FRIEND_API(void) JS_StoreObjectPostBarrierCallback(JSContext* cx, void (*callback)(JSTracer *trc, void *key, void *data), JSObject *key, void *data); extern JS_FRIEND_API(void)
--- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -1300,17 +1300,18 @@ js::CallOrConstructBoundFunction(JSConte bool constructing = args.isConstructing(); if (constructing && fun->isArrow()) { /* * Per spec, arrow functions do not even have a [[Construct]] method. * So before anything else, if we are an arrow function, make sure we * don't even get here. You never saw me. Burn this comment. */ - return ReportIsNotFunction(cx, ObjectValue(*fun), -1, CONSTRUCT); + RootedValue v(cx, ObjectValue(*fun)); + return ReportIsNotFunction(cx, v, -1, CONSTRUCT); } /* 15.3.4.5.1 step 1, 15.3.4.5.2 step 3. */ unsigned argslen = fun->getBoundFunctionArgumentCount(); if (argc + argslen > ARGS_LENGTH_MAX) { js_ReportAllocationOverflow(cx); return false;
--- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -285,17 +285,18 @@ BaseProxyHandler::className(JSContext *c return proxy->isCallable() ? "Function" : "Object"; } JSString * BaseProxyHandler::fun_toString(JSContext *cx, HandleObject proxy, unsigned indent) { if (proxy->isCallable()) return JS_NewStringCopyZ(cx, "function () {\n [native code]\n}"); - ReportIsNotFunction(cx, ObjectValue(*proxy)); + RootedValue v(cx, ObjectValue(*proxy)); + ReportIsNotFunction(cx, v); return nullptr; } bool BaseProxyHandler::regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) { MOZ_ASSUME_UNREACHABLE("This should have been a wrapped regexp");
--- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -339,23 +339,22 @@ SetPropertyOperation(JSContext *cx, Hand if (!JSObject::setGeneric(cx, obj, obj, id, &rref, script->strict())) return false; } return true; } bool -js::ReportIsNotFunction(JSContext *cx, const Value &v, int numToSkip, MaybeConstruct construct) +js::ReportIsNotFunction(JSContext *cx, HandleValue v, int numToSkip, MaybeConstruct construct) { unsigned error = construct ? JSMSG_NOT_CONSTRUCTOR : JSMSG_NOT_FUNCTION; int spIndex = numToSkip >= 0 ? -(numToSkip + 1) : JSDVG_SEARCH_STACK; - RootedValue val(cx, v); - js_ReportValueError3(cx, error, spIndex, val, NullPtr(), nullptr, nullptr); + js_ReportValueError3(cx, error, spIndex, v, NullPtr(), nullptr, nullptr); return false; } JSObject * js::ValueToCallable(JSContext *cx, HandleValue v, int numToSkip, MaybeConstruct construct) { if (v.isObject()) { JSObject *callable = &v.toObject(); @@ -436,30 +435,30 @@ js::Invoke(JSContext *cx, CallArgs args, /* We should never enter a new script while cx->iterValue is live. */ JS_ASSERT(cx->iterValue.isMagic(JS_NO_ITER_VALUE)); /* MaybeConstruct is a subset of InitialFrameFlags */ InitialFrameFlags initial = (InitialFrameFlags) construct; if (args.calleev().isPrimitive()) - return ReportIsNotFunction(cx, args.calleev().get(), args.length() + 1, construct); + return ReportIsNotFunction(cx, args.calleev(), args.length() + 1, construct); JSObject &callee = args.callee(); const Class *clasp = callee.getClass(); /* Invoke non-functions. */ if (JS_UNLIKELY(clasp != &JSFunction::class_)) { #if JS_HAS_NO_SUCH_METHOD if (JS_UNLIKELY(clasp == &js_NoSuchMethodClass)) return NoSuchMethod(cx, args.length(), args.base()); #endif JS_ASSERT_IF(construct, !clasp->construct); if (!clasp->call) - return ReportIsNotFunction(cx, args.calleev().get(), args.length() + 1, construct); + return ReportIsNotFunction(cx, args.calleev(), args.length() + 1, construct); return CallJSNative(cx, clasp->call, args); } /* Invoke native functions. */ JSFunction *fun = &callee.as<JSFunction>(); JS_ASSERT_IF(construct, !fun->isNativeConstructor()); if (fun->isNative()) return CallJSNative(cx, fun->native(), args); @@ -528,40 +527,40 @@ js::Invoke(JSContext *cx, const Value &t bool js::InvokeConstructor(JSContext *cx, CallArgs args) { JS_ASSERT(!JSFunction::class_.construct); args.setThis(MagicValue(JS_IS_CONSTRUCTING)); if (!args.calleev().isObject()) - return ReportIsNotFunction(cx, args.calleev().get(), args.length() + 1, CONSTRUCT); + return ReportIsNotFunction(cx, args.calleev(), args.length() + 1, CONSTRUCT); JSObject &callee = args.callee(); if (callee.is<JSFunction>()) { RootedFunction fun(cx, &callee.as<JSFunction>()); if (fun->isNativeConstructor()) { bool ok = CallJSNativeConstructor(cx, fun->native(), args); return ok; } if (!fun->isInterpretedConstructor()) - return ReportIsNotFunction(cx, args.calleev().get(), args.length() + 1, CONSTRUCT); + return ReportIsNotFunction(cx, args.calleev(), args.length() + 1, CONSTRUCT); if (!Invoke(cx, args, CONSTRUCT)) return false; JS_ASSERT(args.rval().isObject()); return true; } const Class *clasp = callee.getClass(); if (!clasp->construct) - return ReportIsNotFunction(cx, args.calleev().get(), args.length() + 1, CONSTRUCT); + return ReportIsNotFunction(cx, args.calleev(), args.length() + 1, CONSTRUCT); return CallJSNativeConstructor(cx, clasp->construct, args); } bool js::InvokeConstructor(JSContext *cx, Value fval, unsigned argc, Value *argv, Value *rval) { InvokeArgs args(cx);
--- a/js/src/vm/Interpreter.h +++ b/js/src/vm/Interpreter.h @@ -103,17 +103,17 @@ enum MaybeConstruct { CONSTRUCT = INITIAL_CONSTRUCT }; /* * numToSkip is the number of stack values the expression decompiler should skip * before it reaches |v|. If it's -1, the decompiler will search the stack. */ extern bool -ReportIsNotFunction(JSContext *cx, const Value &v, int numToSkip = -1, +ReportIsNotFunction(JSContext *cx, HandleValue v, int numToSkip = -1, MaybeConstruct construct = NO_CONSTRUCT); /* See ReportIsNotFunction comment for the meaning of numToSkip. */ extern JSObject * ValueToCallable(JSContext *cx, HandleValue v, int numToSkip = -1, MaybeConstruct construct = NO_CONSTRUCT); /*
--- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -1113,17 +1113,18 @@ DOMXrayTraits::call(JSContext *cx, Handl // What we have is either a WebIDL interface object, a WebIDL prototype // object, or a WebIDL instance object. WebIDL prototype objects never have // a clasp->call. WebIDL interface objects we want to invoke on the xray // compartment. WebIDL instance objects either don't have a clasp->call or // are using "legacycaller", which basically means plug-ins. We want to // call those on the content compartment. if (clasp->flags & JSCLASS_IS_DOMIFACEANDPROTOJSCLASS) { if (!clasp->call) { - js_ReportIsNotFunction(cx, JS::ObjectValue(*wrapper)); + RootedValue v(cx, ObjectValue(*wrapper)); + js_ReportIsNotFunction(cx, v); return false; } // call it on the Xray compartment if (!clasp->call(cx, args.length(), args.base())) return false; } else { // This is only reached for WebIDL instance objects, and in practice // only for plugins. Just call them on the content compartment. @@ -1138,17 +1139,18 @@ DOMXrayTraits::construct(JSContext *cx, const JS::CallArgs &args, js::Wrapper& baseInstance) { RootedObject obj(cx, getTargetObject(wrapper)); MOZ_ASSERT(mozilla::dom::HasConstructor(obj)); const js::Class* clasp = js::GetObjectClass(obj); // See comments in DOMXrayTraits::call() explaining what's going on here. if (clasp->flags & JSCLASS_IS_DOMIFACEANDPROTOJSCLASS) { if (!clasp->construct) { - js_ReportIsNotFunction(cx, JS::ObjectValue(*wrapper)); + RootedValue v(cx, ObjectValue(*wrapper)); + js_ReportIsNotFunction(cx, v); return false; } if (!clasp->construct(cx, args.length(), args.base())) return false; } else { if (!baseInstance.construct(cx, wrapper, args)) return false; }