Backed out changeset 6031f4ce0f9c (bug 1141865)

This commit is contained in:
Carsten "Tomcat" Book 2015-06-03 12:42:16 +02:00
parent 2eae096d54
commit c06710b638
9 changed files with 87 additions and 13 deletions

View File

@ -465,6 +465,22 @@ js::DirectEvalStringFromIon(JSContext* cx,
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)
{

View File

@ -32,6 +32,11 @@ 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

View File

@ -3490,20 +3490,38 @@ typedef bool (*DirectEvalSFn)(JSContext*, HandleObject, HandleScript, HandleValu
static const VMFunction DirectEvalStringInfo = FunctionInfo<DirectEvalSFn>(DirectEvalStringFromIon);
void
CodeGenerator::visitCallDirectEval(LCallDirectEval* lir)
CodeGenerator::visitCallDirectEvalS(LCallDirectEvalS* lir)
{
Register scopeChain = ToRegister(lir->getScopeChain());
Register string = ToRegister(lir->getString());
pushArg(ImmPtr(lir->mir()->pc()));
pushArg(string);
pushArg(ToValue(lir, LCallDirectEval::ThisValue));
pushArg(ToValue(lir, LCallDirectEvalS::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)
{

View File

@ -148,7 +148,8 @@ class CodeGenerator : public CodeGeneratorSpecific
void visitGetDynamicName(LGetDynamicName* lir);
void visitFilterArgumentsOrEvalS(LFilterArgumentsOrEvalS* lir);
void visitFilterArgumentsOrEvalV(LFilterArgumentsOrEvalV* lir);
void visitCallDirectEval(LCallDirectEval* lir);
void visitCallDirectEvalS(LCallDirectEvalS* lir);
void visitCallDirectEvalV(LCallDirectEvalV* lir);
void visitDoubleToInt32(LDoubleToInt32* lir);
void visitFloat32ToInt32(LFloat32ToInt32* lir);
void visitNewArrayCallVM(LNewArray* lir);

View File

@ -1927,12 +1927,12 @@ class LFilterArgumentsOrEvalV : public LCallInstructionHelper<0, BOX_PIECES, 3>
}
};
class LCallDirectEval : public LCallInstructionHelper<BOX_PIECES, 2 + BOX_PIECES, 0>
class LCallDirectEvalS : public LCallInstructionHelper<BOX_PIECES, 2 + BOX_PIECES, 0>
{
public:
LIR_HEADER(CallDirectEval)
LIR_HEADER(CallDirectEvalS)
LCallDirectEval(const LAllocation& scopeChain, const LAllocation& string)
LCallDirectEvalS(const LAllocation& scopeChain, const LAllocation& string)
{
setOperand(0, scopeChain);
setOperand(1, string);
@ -1952,6 +1952,28 @@ class LCallDirectEval : public LCallInstructionHelper<BOX_PIECES, 2 + BOX_PIECES
}
};
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>
{

View File

@ -76,7 +76,8 @@
_(GetDynamicName) \
_(FilterArgumentsOrEvalS) \
_(FilterArgumentsOrEvalV) \
_(CallDirectEval) \
_(CallDirectEvalS) \
_(CallDirectEvalV) \
_(StackArgT) \
_(StackArgV) \
_(CreateThis) \

View File

@ -606,13 +606,24 @@ LIRGenerator::visitCallDirectEval(MCallDirectEval* ins)
MOZ_ASSERT(scopeChain->type() == MIRType_Object);
MDefinition* string = ins->getString();
MOZ_ASSERT(string->type() == MIRType_String);
MOZ_ASSERT(string->type() == MIRType_String || string->type() == MIRType_Value);
MDefinition* thisValue = ins->getThisValue();
LInstruction* lir = new(alloc()) LCallDirectEval(useRegisterAtStart(scopeChain),
useRegisterAtStart(string));
useBoxAtStart(lir, LCallDirectEval::ThisValue, thisValue);
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);
defineReturn(lir, ins);
assignSafepoint(lir, ins);

View File

@ -4071,7 +4071,7 @@ class MFilterArgumentsOrEval
class MCallDirectEval
: public MAryInstruction<3>,
public Mix3Policy<ObjectPolicy<0>,
StringPolicy<1>,
BoxExceptPolicy<1, MIRType_String>,
BoxPolicy<2> >::Data
{
protected:

View File

@ -1143,7 +1143,7 @@ FilterTypeSetPolicy::adjustInputs(TempAllocator& alloc, MInstruction* ins)
_(FloatingPointPolicy<0>) \
_(IntPolicy<0>) \
_(IntPolicy<1>) \
_(Mix3Policy<ObjectPolicy<0>, StringPolicy<1>, BoxPolicy<2> >) \
_(Mix3Policy<ObjectPolicy<0>, BoxExceptPolicy<1, MIRType_String>, BoxPolicy<2> >) \
_(Mix3Policy<ObjectPolicy<0>, BoxPolicy<1>, BoxPolicy<2> >) \
_(Mix3Policy<ObjectPolicy<0>, BoxPolicy<1>, ObjectPolicy<2> >) \
_(Mix3Policy<ObjectPolicy<0>, IntPolicy<1>, BoxPolicy<2> >) \