author | Eric Faust <efaustbmo@mozilla.com> |
Wed, 03 Jun 2015 02:01:15 -0700 | |
changeset 247083 | 4d30f8210cd6661bafc9482bfad857452c252ee6 |
parent 247082 | 7fff120d6bef3b663f32e2432d45411b5a9f3975 |
child 247084 | d1d159eb02b1a1422d372fdc3b826ff3d9759c75 |
push id | 28852 |
push user | ryanvm@gmail.com |
push date | Thu, 04 Jun 2015 12:39:12 +0000 |
treeherder | mozilla-central@b2ad2f9f8e53 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jandem |
bugs | 1141865 |
milestone | 41.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/builtin/Eval.cpp +++ b/js/src/builtin/Eval.cpp @@ -461,32 +461,16 @@ js::DirectEvalStringFromIon(JSContext* c nthisValue = ObjectValue(*obj); } return ExecuteKernel(cx, esg.script(), *scopeobj, nthisValue, ExecuteType(DIRECT_EVAL), NullFramePtr() /* evalInFrame */, vp.address()); } bool -js::DirectEvalValueFromIon(JSContext* cx, - HandleObject scopeobj, HandleScript callerScript, - HandleValue thisValue, HandleValue evalArg, - jsbytecode* pc, MutableHandleValue vp) -{ - // Act as identity on non-strings per ES5 15.1.2.1 step 1. - if (!evalArg.isString()) { - vp.set(evalArg); - return true; - } - - RootedString string(cx, evalArg.toString()); - return DirectEvalStringFromIon(cx, scopeobj, callerScript, thisValue, string, pc, vp); -} - -bool js::IndirectEval(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); Rooted<GlobalObject*> global(cx, &args.callee().global()); return EvalKernel(cx, args, INDIRECT_EVAL, NullFramePtr(), global, nullptr); } bool
--- a/js/src/builtin/Eval.h +++ b/js/src/builtin/Eval.h @@ -27,20 +27,15 @@ extern bool DirectEval(JSContext* cx, const CallArgs& args); // Performs a direct eval called from Ion code. extern bool DirectEvalStringFromIon(JSContext* cx, HandleObject scopeObj, HandleScript callerScript, HandleValue thisValue, HandleString str, jsbytecode * pc, MutableHandleValue vp); -extern bool -DirectEvalValueFromIon(JSContext* cx, - HandleObject scopeObj, HandleScript callerScript, - HandleValue thisValue, HandleValue evalArg, - jsbytecode * pc, MutableHandleValue vp); // True iff fun is a built-in eval function. extern bool IsAnyBuiltinEval(JSFunction* fun); } // namespace js #endif /* builtin_Eval_h */
--- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -3485,48 +3485,30 @@ CodeGenerator::visitFilterArgumentsOrEva masm.bind(&done); } typedef bool (*DirectEvalSFn)(JSContext*, HandleObject, HandleScript, HandleValue, HandleString, jsbytecode*, MutableHandleValue); static const VMFunction DirectEvalStringInfo = FunctionInfo<DirectEvalSFn>(DirectEvalStringFromIon); void -CodeGenerator::visitCallDirectEvalS(LCallDirectEvalS* lir) +CodeGenerator::visitCallDirectEval(LCallDirectEval* lir) { Register scopeChain = ToRegister(lir->getScopeChain()); Register string = ToRegister(lir->getString()); pushArg(ImmPtr(lir->mir()->pc())); pushArg(string); - pushArg(ToValue(lir, LCallDirectEvalS::ThisValue)); + pushArg(ToValue(lir, LCallDirectEval::ThisValue)); pushArg(ImmGCPtr(gen->info().script())); pushArg(scopeChain); callVM(DirectEvalStringInfo, lir); } -typedef bool (*DirectEvalVFn)(JSContext*, HandleObject, HandleScript, HandleValue, HandleValue, - jsbytecode*, MutableHandleValue); -static const VMFunction DirectEvalValueInfo = FunctionInfo<DirectEvalVFn>(DirectEvalValueFromIon); - -void -CodeGenerator::visitCallDirectEvalV(LCallDirectEvalV* lir) -{ - Register scopeChain = ToRegister(lir->getScopeChain()); - - pushArg(ImmPtr(lir->mir()->pc())); - pushArg(ToValue(lir, LCallDirectEvalV::Argument)); - pushArg(ToValue(lir, LCallDirectEvalV::ThisValue)); - pushArg(ImmGCPtr(gen->info().script())); - pushArg(scopeChain); - - callVM(DirectEvalValueInfo, lir); -} - void CodeGenerator::generateArgumentsChecks(bool bailout) { // Registers safe for use before generatePrologue(). static const uint32_t EntryTempMask = Registers::TempMask & ~(1 << OsrFrameReg.code()); // This function can be used the normal way to check the argument types, // before entering the function and bailout when arguments don't match.
--- a/js/src/jit/CodeGenerator.h +++ b/js/src/jit/CodeGenerator.h @@ -143,18 +143,17 @@ class CodeGenerator : public CodeGenerat void emitPopArguments(LApplyArgsGeneric* apply, Register extraStackSize); void visitApplyArgsGeneric(LApplyArgsGeneric* apply); void visitBail(LBail* lir); void visitUnreachable(LUnreachable* unreachable); void visitEncodeSnapshot(LEncodeSnapshot* lir); void visitGetDynamicName(LGetDynamicName* lir); void visitFilterArgumentsOrEvalS(LFilterArgumentsOrEvalS* lir); void visitFilterArgumentsOrEvalV(LFilterArgumentsOrEvalV* lir); - void visitCallDirectEvalS(LCallDirectEvalS* lir); - void visitCallDirectEvalV(LCallDirectEvalV* lir); + void visitCallDirectEval(LCallDirectEval* lir); void visitDoubleToInt32(LDoubleToInt32* lir); void visitFloat32ToInt32(LFloat32ToInt32* lir); void visitNewArrayCallVM(LNewArray* lir); void visitNewArray(LNewArray* lir); void visitOutOfLineNewArray(OutOfLineNewArray* ool); void visitNewArrayCopyOnWrite(LNewArrayCopyOnWrite* lir); void visitNewArrayDynamicLength(LNewArrayDynamicLength* lir); void visitNewObjectVMCall(LNewObject* lir);
--- a/js/src/jit/LIR-Common.h +++ b/js/src/jit/LIR-Common.h @@ -1922,22 +1922,22 @@ class LFilterArgumentsOrEvalV : public L const LDefinition* temp2() { return getTemp(1); } const LDefinition* temp3() { return getTemp(2); } }; -class LCallDirectEvalS : public LCallInstructionHelper<BOX_PIECES, 2 + BOX_PIECES, 0> -{ - public: - LIR_HEADER(CallDirectEvalS) - - LCallDirectEvalS(const LAllocation& scopeChain, const LAllocation& string) +class LCallDirectEval : public LCallInstructionHelper<BOX_PIECES, 2 + BOX_PIECES, 0> +{ + public: + LIR_HEADER(CallDirectEval) + + LCallDirectEval(const LAllocation& scopeChain, const LAllocation& string) { setOperand(0, scopeChain); setOperand(1, string); } static const size_t ThisValue = 2; MCallDirectEval* mir() const { @@ -1947,38 +1947,16 @@ class LCallDirectEvalS : public LCallIns const LAllocation* getScopeChain() { return getOperand(0); } const LAllocation* getString() { return getOperand(1); } }; -class LCallDirectEvalV : public LCallInstructionHelper<BOX_PIECES, 1 + (2 * BOX_PIECES), 0> -{ - public: - LIR_HEADER(CallDirectEvalV) - - explicit LCallDirectEvalV(const LAllocation& scopeChain) - { - setOperand(0, scopeChain); - } - - static const size_t Argument = 1; - static const size_t ThisValue = 1 + BOX_PIECES; - - MCallDirectEval* mir() const { - return mir_->toCallDirectEval(); - } - - const LAllocation* getScopeChain() { - return getOperand(0); - } -}; - // Takes in either an integer or boolean input and tests it for truthiness. class LTestIAndBranch : public LControlInstructionHelper<2, 1, 0> { public: LIR_HEADER(TestIAndBranch) LTestIAndBranch(const LAllocation& in, MBasicBlock* ifTrue, MBasicBlock* ifFalse) {
--- a/js/src/jit/LOpcodes.h +++ b/js/src/jit/LOpcodes.h @@ -71,18 +71,17 @@ _(CallNative) \ _(ApplyArgsGeneric) \ _(Bail) \ _(Unreachable) \ _(EncodeSnapshot) \ _(GetDynamicName) \ _(FilterArgumentsOrEvalS) \ _(FilterArgumentsOrEvalV) \ - _(CallDirectEvalS) \ - _(CallDirectEvalV) \ + _(CallDirectEval) \ _(StackArgT) \ _(StackArgV) \ _(CreateThis) \ _(CreateThisWithProto) \ _(CreateThisWithTemplate) \ _(CreateArgumentsObject) \ _(GetArgumentsObjectArg) \ _(SetArgumentsObjectArg) \
--- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -601,34 +601,23 @@ LIRGenerator::visitFilterArgumentsOrEval void LIRGenerator::visitCallDirectEval(MCallDirectEval* ins) { MDefinition* scopeChain = ins->getScopeChain(); MOZ_ASSERT(scopeChain->type() == MIRType_Object); MDefinition* string = ins->getString(); - MOZ_ASSERT(string->type() == MIRType_String || string->type() == MIRType_Value); + MOZ_ASSERT(string->type() == MIRType_String); MDefinition* thisValue = ins->getThisValue(); - - LInstruction* lir; - if (string->type() == MIRType_String) { - lir = new(alloc()) LCallDirectEvalS(useRegisterAtStart(scopeChain), - useRegisterAtStart(string)); - } else { - lir = new(alloc()) LCallDirectEvalV(useRegisterAtStart(scopeChain)); - useBoxAtStart(lir, LCallDirectEvalV::Argument, string); - } - - if (string->type() == MIRType_String) - useBoxAtStart(lir, LCallDirectEvalS::ThisValue, thisValue); - else - useBoxAtStart(lir, LCallDirectEvalV::ThisValue, thisValue); + LInstruction* lir = new(alloc()) LCallDirectEval(useRegisterAtStart(scopeChain), + useRegisterAtStart(string)); + useBoxAtStart(lir, LCallDirectEval::ThisValue, thisValue); defineReturn(lir, ins); assignSafepoint(lir, ins); } static JSOp ReorderComparison(JSOp op, MDefinition** lhsp, MDefinition** rhsp) {
--- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -4066,17 +4066,17 @@ class MFilterArgumentsOrEval bool possiblyCalls() const override { return true; } }; class MCallDirectEval : public MAryInstruction<3>, public Mix3Policy<ObjectPolicy<0>, - BoxExceptPolicy<1, MIRType_String>, + StringPolicy<1>, BoxPolicy<2> >::Data { protected: MCallDirectEval(MDefinition* scopeChain, MDefinition* string, MDefinition* thisValue, jsbytecode* pc) : pc_(pc) { initOperand(0, scopeChain);
--- a/js/src/jit/TypePolicy.cpp +++ b/js/src/jit/TypePolicy.cpp @@ -1138,17 +1138,17 @@ FilterTypeSetPolicy::adjustInputs(TempAl _(BoxPolicy<0>) \ _(ConvertToInt32Policy<0>) \ _(ConvertToStringPolicy<0>) \ _(ConvertToStringPolicy<2>) \ _(DoublePolicy<0>) \ _(FloatingPointPolicy<0>) \ _(IntPolicy<0>) \ _(IntPolicy<1>) \ - _(Mix3Policy<ObjectPolicy<0>, BoxExceptPolicy<1, MIRType_String>, BoxPolicy<2> >) \ + _(Mix3Policy<ObjectPolicy<0>, StringPolicy<1>, BoxPolicy<2> >) \ _(Mix3Policy<ObjectPolicy<0>, BoxPolicy<1>, BoxPolicy<2> >) \ _(Mix3Policy<ObjectPolicy<0>, BoxPolicy<1>, ObjectPolicy<2> >) \ _(Mix3Policy<ObjectPolicy<0>, IntPolicy<1>, BoxPolicy<2> >) \ _(Mix3Policy<ObjectPolicy<0>, IntPolicy<1>, IntPolicy<2> >) \ _(Mix3Policy<ObjectPolicy<0>, ObjectPolicy<1>, IntPolicy<2> >) \ _(Mix3Policy<StringPolicy<0>, IntPolicy<1>, IntPolicy<2>>) \ _(Mix3Policy<StringPolicy<0>, ObjectPolicy<1>, StringPolicy<2> >) \ _(Mix3Policy<StringPolicy<0>, StringPolicy<1>, StringPolicy<2> >) \