author | Eric Faust <efaust@mozilla.com> |
Tue, 24 Jul 2012 22:59:55 -0700 | |
changeset 100384 | 04e144fd16feb5c5ccf8f030f0e1e4e98be1f016 |
parent 100383 | eecd3aa199e690d5f42e64f16a631e500cb25f7c |
child 100385 | b61beb4ae24f5b9cc12cff2b98f8a7f4c7fbf15e |
push id | 23175 |
push user | emorley@mozilla.com |
push date | Wed, 25 Jul 2012 15:03:49 +0000 |
treeherder | mozilla-central@75d16b99e8ab [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | luke |
bugs | 749536 |
milestone | 17.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/dom/bindings/PrimitiveConversions.h +++ b/dom/bindings/PrimitiveConversions.h @@ -75,18 +75,19 @@ struct PrimitiveConversionTraits<int32_t template<> struct PrimitiveConversionTraits<uint32_t> : PrimitiveConversionTraits_smallInt { }; template<> struct PrimitiveConversionTraits<bool> { typedef JSBool jstype; typedef bool intermediateType; - static inline bool converter(JSContext* cx, JS::Value v, jstype* retval) { - return JS_ValueToBoolean(cx, v, retval); + static inline bool converter(JSContext* /* unused */, JS::Value v, jstype* retval) { + *retval = JS::ToBoolean(v); + return true; } }; template<> struct PrimitiveConversionTraits<int64_t> { typedef int64_t jstype; typedef int64_t intermediateType; static inline bool converter(JSContext* cx, JS::Value v, jstype* retval) {
--- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -458,17 +458,17 @@ GCPreserveCode(JSContext *cx, unsigned a static JSBool DeterministicGC(JSContext *cx, unsigned argc, jsval *vp) { if (argc != 1) { ReportUsageError(cx, &JS_CALLEE(cx, vp).toObject(), "Wrong number of arguments"); return JS_FALSE; } - gc::SetDeterministicGC(cx, js_ValueToBoolean(vp[2])); + gc::SetDeterministicGC(cx, ToBoolean(vp[2])); *vp = JSVAL_VOID; return JS_TRUE; } #endif /* JS_GC_ZEAL */ struct JSCountHeapNode { void *thing; JSGCTraceKind kind;
--- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -317,17 +317,17 @@ JS_ConvertArgumentsVA(JSContext *cx, uns } } return JS_FALSE; } break; } switch (c) { case 'b': - *va_arg(ap, JSBool *) = js_ValueToBoolean(*sp); + *va_arg(ap, JSBool *) = ToBoolean(*sp); break; case 'c': if (!JS_ValueToUint16(cx, *sp, va_arg(ap, uint16_t *))) return JS_FALSE; break; case 'i': if (!JS_ValueToECMAInt32(cx, *sp, va_arg(ap, int32_t *))) return JS_FALSE; @@ -475,17 +475,17 @@ JS_ConvertValue(JSContext *cx, jsval v, *vp = STRING_TO_JSVAL(str); break; case JSTYPE_NUMBER: ok = JS_ValueToNumber(cx, v, &d); if (ok) *vp = DOUBLE_TO_JSVAL(d); break; case JSTYPE_BOOLEAN: - *vp = BOOLEAN_TO_JSVAL(js_ValueToBoolean(v)); + *vp = BooleanValue(ToBoolean(v)); return JS_TRUE; default: { char numBuf[12]; JS_snprintf(numBuf, sizeof numBuf, "%d", (int)type); JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_TYPE, numBuf); ok = JS_FALSE; break; } @@ -627,17 +627,17 @@ JS_ValueToUint16(JSContext *cx, jsval v, } JS_PUBLIC_API(JSBool) JS_ValueToBoolean(JSContext *cx, jsval v, JSBool *bp) { AssertHeapIsIdle(cx); CHECK_REQUEST(cx); assertSameCompartment(cx, v); - *bp = js_ValueToBoolean(v); + *bp = ToBoolean(v); return JS_TRUE; } JS_PUBLIC_API(JSType) JS_TypeOfValue(JSContext *cx, jsval v) { AssertHeapIsIdle(cx); CHECK_REQUEST(cx);
--- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -2659,16 +2659,22 @@ JS_ValueToNumber(JSContext *cx, jsval v, #ifdef __cplusplus namespace js { /* * DO NOT CALL THIS. Use JS::ToNumber */ extern JS_PUBLIC_API(bool) ToNumberSlow(JSContext *cx, JS::Value v, double *dp); + +/* + * DO NOT CALL THIS. Use JS::ToBoolean + */ +extern JS_PUBLIC_API(bool) +ToBooleanSlow(const JS::Value &v); } /* namespace js */ namespace JS { /* ES5 9.3 ToNumber. */ JS_ALWAYS_INLINE bool ToNumber(JSContext *cx, const Value &v, double *out) { @@ -2677,16 +2683,36 @@ ToNumber(JSContext *cx, const Value &v, if (v.isNumber()) { *out = v.toNumber(); MaybeCheckStackRoots(cx); return true; } return js::ToNumberSlow(cx, v, out); } +JS_ALWAYS_INLINE bool +ToBoolean(const Value &v) +{ + if (v.isBoolean()) + return v.toBoolean(); + if (v.isInt32()) + return v.toInt32() != 0; + if (v.isObject()) + return true; + if (v.isNullOrUndefined()) + return false; + if (v.isDouble()) { + double d = v.toDouble(); + return !MOZ_DOUBLE_IS_NaN(d) && d != 0; + } + + /* Slow path. Handle Strings. */ + return js::ToBooleanSlow(v); +} + } /* namespace JS */ #endif /* __cplusplus */ extern JS_PUBLIC_API(JSBool) JS_DoubleIsInt32(double d, int32_t *ip); extern JS_PUBLIC_API(int32_t) JS_DoubleToInt32(double d);
--- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -3086,31 +3086,31 @@ class ArrayForEachBehavior static Value lateExitValue() { return UndefinedValue(); } }; class ArrayEveryBehavior { public: static bool shouldExit(Value &callval, Value *rval) { - if (!js_ValueToBoolean(callval)) { + if (!ToBoolean(callval)) { *rval = BooleanValue(false); return true; } return false; } static Value lateExitValue() { return BooleanValue(true); } }; class ArraySomeBehavior { public: static bool shouldExit(Value &callval, Value *rval) { - if (js_ValueToBoolean(callval)) { + if (ToBoolean(callval)) { *rval = BooleanValue(true); return true; } return false; } static Value lateExitValue() { return BooleanValue(false); } }; @@ -3342,17 +3342,17 @@ array_filter(JSContext *cx, unsigned arg ag.setCallee(ObjectValue(*callable)); ag.thisv() = thisv; ag[0] = kValue; ag[1] = NumberValue(k); ag[2] = ObjectValue(*obj); if (!Invoke(cx, ag)) return false; - if (js_ValueToBoolean(ag.rval())) { + if (ToBoolean(ag.rval())) { if(!SetArrayElement(cx, arr, to, kValue)) return false; to++; } } /* Step d. */ k++;
--- a/js/src/jsbool.cpp +++ b/js/src/jsbool.cpp @@ -124,17 +124,17 @@ static JSFunctionSpec boolean_methods[] JS_FS_END }; static JSBool Boolean(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); - bool b = args.length() != 0 ? js_ValueToBoolean(args[0]) : false; + bool b = args.length() != 0 ? JS::ToBoolean(args[0]) : false; if (IsConstructing(vp)) { JSObject *obj = BooleanObject::create(cx, b); if (!obj) return false; args.rval().setObject(*obj); } else { args.rval().setBoolean(b); @@ -186,44 +186,32 @@ js_InitBooleanClass(JSContext *cx, JSObj JSString * js_BooleanToString(JSContext *cx, JSBool b) { return cx->runtime->atomState.booleanAtoms[b ? 1 : 0]; } namespace js { +JS_PUBLIC_API(bool) +ToBooleanSlow(const Value &v) +{ + JS_ASSERT(v.isString()); + return v.toString()->length() != 0; +} + bool BooleanGetPrimitiveValueSlow(JSContext *cx, JSObject &obj, Value *vp) { InvokeArgsGuard ag; if (!cx->stack.pushInvokeArgs(cx, 0, &ag)) return false; ag.calleev() = cx->compartment->maybeGlobal()->booleanValueOf(); ag.thisv().setObject(obj); if (!Invoke(cx, ag)) return false; *vp = ag.rval(); return true; } } /* namespace js */ -JSBool -js_ValueToBoolean(const Value &v) -{ - if (v.isInt32()) - return v.toInt32() != 0; - if (v.isString()) - return v.toString()->length() != 0; - if (v.isObject()) - return JS_TRUE; - if (v.isNullOrUndefined()) - return JS_FALSE; - if (v.isDouble()) { - double d; - d = v.toDouble(); - return !MOZ_DOUBLE_IS_NaN(d) && d != 0; - } - JS_ASSERT(v.isBoolean()); - return v.toBoolean(); -}
--- a/js/src/jsbool.h +++ b/js/src/jsbool.h @@ -21,12 +21,9 @@ js_BooleanToString(JSContext *cx, JSBool namespace js { inline bool BooleanGetPrimitiveValue(JSContext *cx, JSObject &obj, Value *vp); } /* namespace js */ -extern JSBool -js_ValueToBoolean(const js::Value &v); - #endif /* jsbool_h___ */
--- a/js/src/jsinterp.cpp +++ b/js/src/jsinterp.cpp @@ -880,20 +880,18 @@ DoIncDec(JSContext *cx, HandleScript scr #define POP_COPY_TO(v) v = *--regs.sp #define POP_RETURN_VALUE() regs.fp()->setReturnValue(*--regs.sp) #define VALUE_TO_BOOLEAN(cx, vp, b) \ JS_BEGIN_MACRO \ vp = ®s.sp[-1]; \ if (vp->isNull()) { \ b = false; \ - } else if (vp->isBoolean()) { \ - b = vp->toBoolean(); \ } else { \ - b = !!js_ValueToBoolean(*vp); \ + b = ToBoolean(*vp); \ } \ JS_END_MACRO #define POP_BOOLEAN(cx, vp, b) do { VALUE_TO_BOOLEAN(cx, vp, b); regs.sp--; } while(0) #define FETCH_OBJECT(cx, n, obj) \ JS_BEGIN_MACRO \ Value *vp_ = ®s.sp[n]; \
--- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -730,17 +730,17 @@ Iterator(JSContext *cx, unsigned argc, V CallArgs args = CallArgsFromVp(argc, vp); if (args.length() == 0) { js_ReportMissingArg(cx, args.calleev(), 0); return false; } bool keyonly = false; if (args.length() >= 2) - keyonly = js_ValueToBoolean(args[1]); + keyonly = ToBoolean(args[1]); unsigned flags = JSITER_OWNONLY | (keyonly ? 0 : (JSITER_FOREACH | JSITER_KEYVALUE)); if (!ValueToIterator(cx, flags, &args[0])) return false; args.rval() = args[0]; return true; }
--- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1296,27 +1296,27 @@ PropDesc::initialize(JSContext *cx, cons RootedId id(cx); /* 8.10.5 step 3 */ id = NameToId(cx->runtime->atomState.enumerableAtom); if (!HasProperty(cx, desc, id, &v, &found)) return false; if (found) { hasEnumerable_ = true; - if (js_ValueToBoolean(v)) + if (ToBoolean(v)) attrs |= JSPROP_ENUMERATE; } /* 8.10.5 step 4 */ id = NameToId(cx->runtime->atomState.configurableAtom); if (!HasProperty(cx, desc, id, &v, &found)) return false; if (found) { hasConfigurable_ = true; - if (js_ValueToBoolean(v)) + if (ToBoolean(v)) attrs &= ~JSPROP_PERMANENT; } /* 8.10.5 step 5 */ id = NameToId(cx->runtime->atomState.valueAtom); if (!HasProperty(cx, desc, id, &v, &found)) return false; if (found) { @@ -1325,17 +1325,17 @@ PropDesc::initialize(JSContext *cx, cons } /* 8.10.6 step 6 */ id = NameToId(cx->runtime->atomState.writableAtom); if (!HasProperty(cx, desc, id, &v, &found)) return false; if (found) { hasWritable_ = true; - if (js_ValueToBoolean(v)) + if (ToBoolean(v)) attrs &= ~JSPROP_READONLY; } /* 8.10.7 step 7 */ id = NameToId(cx->runtime->atomState.getAtom); if (!HasProperty(cx, desc, id, &v, &found)) return false; if (found) {
--- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -687,17 +687,17 @@ IndicatePropertyNotFound(JSContext *cx, { desc->obj = NULL; return true; } static bool ValueToBool(JSContext *cx, const Value &v, bool *bp) { - *bp = !!js_ValueToBoolean(v); + *bp = ToBoolean(v); return true; } static bool ArrayToIdVector(JSContext *cx, const Value &array, AutoIdVector &props) { JS_ASSERT(props.length() == 0);
--- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -3192,17 +3192,17 @@ reflect_parse(JSContext *cx, uint32_t ar Value prop; /* config.loc */ RootedId locId(cx, NameToId(cx->runtime->atomState.locAtom)); if (!baseops::GetPropertyDefault(cx, config, locId, BooleanValue(true), &prop)) return JS_FALSE; - loc = js_ValueToBoolean(prop); + loc = ToBoolean(prop); if (loc) { /* config.source */ RootedId sourceId(cx, NameToId(cx->runtime->atomState.sourceAtom)); if (!baseops::GetPropertyDefault(cx, config, sourceId, NullValue(), &prop)) return JS_FALSE; if (!prop.isNullOrUndefined()) {
--- a/js/src/jstypedarray.cpp +++ b/js/src/jstypedarray.cpp @@ -2384,17 +2384,17 @@ DataViewObject::read(JSContext *cx, Hand JSMSG_MORE_ARGS_NEEDED, method, "0", "s"); return false; } uint8_t *data; if (!getDataPointer(cx, obj, args, sizeof(NativeType), &data)) return false; - bool fromLittleEndian = args.length() >= 2 && js_ValueToBoolean(args[1]); + bool fromLittleEndian = args.length() >= 2 && ToBoolean(args[1]); DataViewIO<NativeType>::fromBuffer(val, data, needToSwapBytes(fromLittleEndian)); return true; } template <typename NativeType> static inline bool WebIDLCast(JSContext *cx, const Value &value, NativeType *out) { @@ -2440,17 +2440,17 @@ DataViewObject::write(JSContext *cx, Han uint8_t *data; if (!getDataPointer(cx, obj, args, sizeof(NativeType), &data)) return false; NativeType value; if (!WebIDLCast(cx, args[1], &value)) return false; - bool toLittleEndian = args.length() >= 3 && js_ValueToBoolean(args[2]); + bool toLittleEndian = args.length() >= 3 && ToBoolean(args[2]); DataViewIO<NativeType>::toBuffer(data, &value, needToSwapBytes(toLittleEndian)); return true; } bool DataViewObject::getInt8Impl(JSContext *cx, CallArgs args) { JS_ASSERT(is(args.thisv()));
--- a/js/src/jsxml.cpp +++ b/js/src/jsxml.cpp @@ -7933,17 +7933,17 @@ js_StepXMLListFilter(JSContext *cx, JSBo } else { /* We have iterated at least once. */ JS_ASSERT(!JSVAL_IS_PRIMITIVE(sp[-2])); JS_ASSERT(JSVAL_TO_OBJECT(sp[-2])->getClass() == &js_XMLFilterClass); filter = (JSXMLFilter *) JSVAL_TO_OBJECT(sp[-2])->getPrivate(); JS_ASSERT(filter->kid); /* Check if the filter expression wants to append the element. */ - if (js_ValueToBoolean(sp[-1]) && + if (ToBoolean(sp[-1]) && !Append(cx, filter->result, filter->kid)) { return JS_FALSE; } } /* Do the iteration. */ filter->kid = filter->cursor.getNext(); if (!filter->kid) {
--- a/js/src/methodjit/FastOps.cpp +++ b/js/src/methodjit/FastOps.cpp @@ -565,17 +565,17 @@ mjit::Compiler::jsop_relational(JSOp op, void mjit::Compiler::jsop_not() { FrameEntry *top = frame.peek(-1); if (top->isConstant()) { const Value &v = top->getValue(); frame.pop(); - frame.push(BooleanValue(!js_ValueToBoolean(v))); + frame.push(BooleanValue(!ToBoolean(v))); return; } if (top->isTypeKnown()) { JSValueType type = top->getKnownType(); switch (type) { case JSVAL_TYPE_INT32: { @@ -841,17 +841,17 @@ mjit::Compiler::booleanJumpScript(JSOp o } bool mjit::Compiler::jsop_ifneq(JSOp op, jsbytecode *target) { FrameEntry *fe = frame.peek(-1); if (fe->isConstant()) { - JSBool b = js_ValueToBoolean(fe->getValue()); + JSBool b = ToBoolean(fe->getValue()); frame.pop(); if (op == JSOP_IFEQ) b = !b; if (b) { if (!frame.syncForBranch(target, Uses(0))) return false; @@ -868,17 +868,17 @@ mjit::Compiler::jsop_ifneq(JSOp op, jsby } bool mjit::Compiler::jsop_andor(JSOp op, jsbytecode *target) { FrameEntry *fe = frame.peek(-1); if (fe->isConstant()) { - JSBool b = js_ValueToBoolean(fe->getValue()); + JSBool b = ToBoolean(fe->getValue()); /* Short-circuit. */ if ((op == JSOP_OR && b == JS_TRUE) || (op == JSOP_AND && b == JS_FALSE)) { if (!frame.syncForBranch(target, Uses(0))) return false; if (!jumpAndRun(masm.jump(), target)) return false;
--- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -443,23 +443,23 @@ JSBool JS_FASTCALL stubs::GreaterEqual(VMFrame &f) { RELATIONAL(>=); } JSBool JS_FASTCALL stubs::ValueToBoolean(VMFrame &f) { - return js_ValueToBoolean(f.regs.sp[-1]); + return ToBoolean(f.regs.sp[-1]); } void JS_FASTCALL stubs::Not(VMFrame &f) { - JSBool b = !js_ValueToBoolean(f.regs.sp[-1]); + JSBool b = !ToBoolean(f.regs.sp[-1]); f.regs.sp[-1].setBoolean(b); } template <bool EQ> static inline bool StubEqualityOp(VMFrame &f) { JSContext *cx = f.cx;
--- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -1562,17 +1562,17 @@ Debugger::getEnabled(JSContext *cx, unsi return true; } JSBool Debugger::setEnabled(JSContext *cx, unsigned argc, Value *vp) { REQUIRE_ARGC("Debugger.set enabled", 1); THIS_DEBUGGER(cx, argc, vp, "set enabled", args, dbg); - bool enabled = js_ValueToBoolean(args[0]); + bool enabled = ToBoolean(args[0]); if (enabled != dbg->enabled) { for (Breakpoint *bp = dbg->firstBreakpoint(); bp; bp = bp->nextInDebugger()) { if (enabled) bp->site->inc(cx->runtime->defaultFreeOp()); else bp->site->dec(cx->runtime->defaultFreeOp()); } @@ -2068,17 +2068,17 @@ class Debugger::ScriptQuery { "neither undefined nor an integer"); return false; } /* Check for an 'innermost' property. */ Value innermostProperty; if (!query->getProperty(cx, cx->runtime->atomState.innermostAtom, &innermostProperty)) return false; - innermost = js_ValueToBoolean(innermostProperty); + innermost = ToBoolean(innermostProperty); if (innermost) { /* Technically, we need only check hasLine, but this is clearer. */ if (url.isUndefined() || !hasLine) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_QUERY_INNERMOST_WITHOUT_LINE_URL); return false; } }