Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 5e6b42ebd7c36ee9b0ad346ca2a77faf6750e924..f5955b937fb0399d302f021536ce568075f36a19 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2214,7 +2214,9 @@ HGraph* HGraphBuilder::CreateGraph() { |
} |
SetupScope(scope); |
VisitDeclarations(scope->declarations()); |
- AddInstruction(new(zone()) HStackCheck(HStackCheck::kFunctionEntry)); |
+ HValue* context = environment()->LookupContext(); |
+ AddInstruction( |
+ new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry)); |
// Add an edge to the body entry. This is warty: the graph's start |
// environment will be used by the Lithium translation as the initial |
@@ -2621,8 +2623,9 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
// Otherwise generate a compare and branch. |
CHECK_ALIVE(VisitForValue(clause->label())); |
HValue* label_value = Pop(); |
+ HValue* context = environment()->LookupContext(); |
HCompare* compare = |
- new(zone()) HCompare(tag_value, label_value, Token::EQ_STRICT); |
+ new(zone()) HCompare(context, tag_value, label_value, Token::EQ_STRICT); |
compare->SetInputRepresentation(Representation::Integer32()); |
ASSERT(!compare->HasSideEffects()); |
AddInstruction(compare); |
@@ -2747,8 +2750,9 @@ void HGraphBuilder::VisitLoopBody(Statement* body, |
HBasicBlock* loop_entry, |
BreakAndContinueInfo* break_info) { |
BreakAndContinueScope push(break_info, this); |
+ HValue* context = environment()->LookupContext(); |
HStackCheck* stack_check = |
- new(zone()) HStackCheck(HStackCheck::kBackwardsBranch); |
+ new(zone()) HStackCheck(context, HStackCheck::kBackwardsBranch); |
AddInstruction(stack_check); |
ASSERT(loop_entry->IsLoopHeader()); |
loop_entry->loop_information()->set_stack_check(stack_check); |
@@ -2957,8 +2961,9 @@ void HGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
} |
// We also have a stack overflow if the recursive compilation did. |
if (HasStackOverflow()) return; |
+ HValue* context = environment()->LookupContext(); |
HFunctionLiteral* instr = |
- new(zone()) HFunctionLiteral(shared_info, expr->pretenure()); |
+ new(zone()) HFunctionLiteral(context, shared_info, expr->pretenure()); |
ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -3111,7 +3116,10 @@ void HGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
ASSERT(!HasStackOverflow()); |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
- HRegExpLiteral* instr = new(zone()) HRegExpLiteral(expr->pattern(), |
+ HValue* context = environment()->LookupContext(); |
+ |
+ HRegExpLiteral* instr = new(zone()) HRegExpLiteral(context, |
+ expr->pattern(), |
expr->flags(), |
expr->literal_index()); |
ast_context()->ReturnInstruction(instr, expr->id()); |
@@ -3197,8 +3205,10 @@ void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
ASSERT(current_block()->HasPredecessor()); |
ZoneList<Expression*>* subexprs = expr->values(); |
int length = subexprs->length(); |
+ HValue* context = environment()->LookupContext(); |
- HArrayLiteral* literal = new(zone()) HArrayLiteral(expr->constant_elements(), |
+ HArrayLiteral* literal = new(zone()) HArrayLiteral(context, |
+ expr->constant_elements(), |
length, |
expr->literal_index(), |
expr->depth()); |
@@ -3723,8 +3733,9 @@ void HGraphBuilder::VisitThrow(Throw* expr) { |
ASSERT(ast_context()->IsEffect()); |
CHECK_ALIVE(VisitForValue(expr->exception())); |
+ HValue* context = environment()->LookupContext(); |
HValue* value = environment()->Pop(); |
- HThrow* instr = new(zone()) HThrow(value); |
+ HThrow* instr = new(zone()) HThrow(context, value); |
instr->set_position(expr->position()); |
AddInstruction(instr); |
AddSimulate(expr->id()); |
@@ -4132,9 +4143,11 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
CHECK_ALIVE(VisitForValue(expr->key())); |
HValue* index = Pop(); |
HValue* string = Pop(); |
- HStringCharCodeAt* char_code = BuildStringCharCodeAt(string, index); |
+ HValue* context = environment()->LookupContext(); |
+ HStringCharCodeAt* char_code = |
+ BuildStringCharCodeAt(context, string, index); |
AddInstruction(char_code); |
- instr = new(zone()) HStringCharFromCode(char_code); |
+ instr = new(zone()) HStringCharFromCode(context, char_code); |
} else if (expr->IsFunctionPrototype()) { |
HValue* function = Pop(); |
@@ -4150,7 +4163,8 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
instr = BuildLoadNamed(obj, expr, types->first(), name); |
} else if (types != NULL && types->length() > 1) { |
AddInstruction(new(zone()) HCheckNonSmi(obj)); |
- instr = new(zone()) HLoadNamedFieldPolymorphic(obj, types, name); |
+ HValue* context = environment()->LookupContext(); |
+ instr = new(zone()) HLoadNamedFieldPolymorphic(context, obj, types, name); |
} else { |
instr = BuildLoadNamedGeneric(obj, expr); |
} |
@@ -4549,18 +4563,20 @@ bool HGraphBuilder::TryInlineBuiltinFunction(Call* expr, |
if (argument_count == 2 && check_type == STRING_CHECK) { |
HValue* index = Pop(); |
HValue* string = Pop(); |
+ HValue* context = environment()->LookupContext(); |
ASSERT(!expr->holder().is_null()); |
AddInstruction(new(zone()) HCheckPrototypeMaps( |
oracle()->GetPrototypeForPrimitiveCheck(STRING_CHECK), |
expr->holder())); |
- HStringCharCodeAt* char_code = BuildStringCharCodeAt(string, index); |
+ HStringCharCodeAt* char_code = |
+ BuildStringCharCodeAt(context, string, index); |
if (id == kStringCharCodeAt) { |
ast_context()->ReturnInstruction(char_code, expr->id()); |
return true; |
} |
AddInstruction(char_code); |
HStringCharFromCode* result = |
- new(zone()) HStringCharFromCode(char_code); |
+ new(zone()) HStringCharFromCode(context, char_code); |
ast_context()->ReturnInstruction(result, expr->id()); |
return true; |
} |
@@ -4575,8 +4591,10 @@ bool HGraphBuilder::TryInlineBuiltinFunction(Call* expr, |
if (argument_count == 2 && check_type == RECEIVER_MAP_CHECK) { |
AddCheckConstantFunction(expr, receiver, receiver_map, true); |
HValue* argument = Pop(); |
+ HValue* context = environment()->LookupContext(); |
Drop(1); // Receiver. |
- HUnaryMathOperation* op = new(zone()) HUnaryMathOperation(argument, id); |
+ HUnaryMathOperation* op = |
+ new(zone()) HUnaryMathOperation(context, argument, id); |
op->set_position(expr->position()); |
ast_context()->ReturnInstruction(op, expr->id()); |
return true; |
@@ -4588,31 +4606,33 @@ bool HGraphBuilder::TryInlineBuiltinFunction(Call* expr, |
HValue* right = Pop(); |
HValue* left = Pop(); |
Pop(); // Pop receiver. |
+ HValue* context = environment()->LookupContext(); |
HInstruction* result = NULL; |
// Use sqrt() if exponent is 0.5 or -0.5. |
if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { |
double exponent = HConstant::cast(right)->DoubleValue(); |
if (exponent == 0.5) { |
- result = new(zone()) HUnaryMathOperation(left, kMathPowHalf); |
+ result = |
+ new(zone()) HUnaryMathOperation(context, left, kMathPowHalf); |
} else if (exponent == -0.5) { |
HConstant* double_one = |
new(zone()) HConstant(Handle<Object>(Smi::FromInt(1)), |
Representation::Double()); |
AddInstruction(double_one); |
HUnaryMathOperation* square_root = |
- new(zone()) HUnaryMathOperation(left, kMathPowHalf); |
+ new(zone()) HUnaryMathOperation(context, left, kMathPowHalf); |
AddInstruction(square_root); |
// MathPowHalf doesn't have side effects so there's no need for |
// an environment simulation here. |
ASSERT(!square_root->HasSideEffects()); |
- result = new(zone()) HDiv(double_one, square_root); |
+ result = new(zone()) HDiv(context, double_one, square_root); |
} else if (exponent == 2.0) { |
- result = new(zone()) HMul(left, left); |
+ result = new(zone()) HMul(context, left, left); |
} |
} else if (right->IsConstant() && |
HConstant::cast(right)->HasInteger32Value() && |
HConstant::cast(right)->Integer32Value() == 2) { |
- result = new(zone()) HMul(left, left); |
+ result = new(zone()) HMul(context, left, left); |
} |
if (result == NULL) { |
@@ -4898,10 +4918,11 @@ void HGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
ASSERT(function->intrinsic_type == Runtime::RUNTIME); |
CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
+ HValue* context = environment()->LookupContext(); |
Handle<String> name = expr->name(); |
int argument_count = expr->arguments()->length(); |
HCallRuntime* call = |
- new(zone()) HCallRuntime(name, function, argument_count); |
+ new(zone()) HCallRuntime(context, name, function, argument_count); |
call->set_position(RelocInfo::kNoPosition); |
Drop(argument_count); |
ast_context()->ReturnInstruction(call, expr->id()); |
@@ -4950,7 +4971,8 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(prop->key())); |
HValue* key = Pop(); |
HValue* obj = Pop(); |
- HDeleteProperty* instr = new(zone()) HDeleteProperty(obj, key); |
+ HValue* context = environment()->LookupContext(); |
+ HDeleteProperty* instr = new(zone()) HDeleteProperty(context, obj, key); |
ast_context()->ReturnInstruction(instr, expr->id()); |
} |
} else if (var->is_global()) { |
@@ -4970,14 +4992,18 @@ void HGraphBuilder::VisitVoid(UnaryOperation* expr) { |
void HGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForTypeOf(expr->expression())); |
HValue* value = Pop(); |
- ast_context()->ReturnInstruction(new(zone()) HTypeof(value), expr->id()); |
+ HValue* context = environment()->LookupContext(); |
+ HInstruction* instr = new(zone()) HTypeof(context, value); |
+ ast_context()->ReturnInstruction(instr, expr->id()); |
} |
void HGraphBuilder::VisitAdd(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* value = Pop(); |
- HInstruction* instr = new(zone()) HMul(value, graph_->GetConstant1()); |
+ HValue* context = environment()->LookupContext(); |
+ HInstruction* instr = |
+ new(zone()) HMul(context, value, graph_->GetConstant1()); |
ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -4985,7 +5011,9 @@ void HGraphBuilder::VisitAdd(UnaryOperation* expr) { |
void HGraphBuilder::VisitSub(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* value = Pop(); |
- HInstruction* instr = new(zone()) HMul(value, graph_->GetConstantMinus1()); |
+ HValue* context = environment()->LookupContext(); |
+ HInstruction* instr = |
+ new(zone()) HMul(context, value, graph_->GetConstantMinus1()); |
TypeInfo info = oracle()->UnaryType(expr); |
if (info.IsUninitialized()) { |
AddInstruction(new(zone()) HSoftDeoptimize); |
@@ -5082,7 +5110,8 @@ HInstruction* HGraphBuilder::BuildIncrement(bool returns_original_input, |
HConstant* delta = (expr->op() == Token::INC) |
? graph_->GetConstant1() |
: graph_->GetConstantMinus1(); |
- HInstruction* instr = new(zone()) HAdd(Top(), delta); |
+ HValue* context = environment()->LookupContext(); |
+ HInstruction* instr = new(zone()) HAdd(context, Top(), delta); |
TraceRepresentation(expr->op(), info, instr, rep); |
instr->AssumeRepresentation(rep); |
AddInstruction(instr); |
@@ -5232,7 +5261,8 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
} |
-HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* string, |
+HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* context, |
+ HValue* string, |
HValue* index) { |
AddInstruction(new(zone()) HCheckNonSmi(string)); |
AddInstruction(HCheckInstanceType::NewIsString(string)); |
@@ -5240,13 +5270,14 @@ HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* string, |
AddInstruction(length); |
HInstruction* checked_index = |
AddInstruction(new(zone()) HBoundsCheck(index, length)); |
- return new(zone()) HStringCharCodeAt(string, checked_index); |
+ return new(zone()) HStringCharCodeAt(context, string, checked_index); |
} |
HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
HValue* left, |
HValue* right) { |
+ HValue* context = environment()->LookupContext(); |
TypeInfo info = oracle()->BinaryType(expr); |
if (info.IsUninitialized()) { |
AddInstruction(new(zone()) HSoftDeoptimize); |
@@ -5261,40 +5292,40 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
AddInstruction(HCheckInstanceType::NewIsString(left)); |
AddInstruction(new(zone()) HCheckNonSmi(right)); |
AddInstruction(HCheckInstanceType::NewIsString(right)); |
- instr = new(zone()) HStringAdd(left, right); |
+ instr = new(zone()) HStringAdd(context, left, right); |
} else { |
- instr = new(zone()) HAdd(left, right); |
+ instr = new(zone()) HAdd(context, left, right); |
} |
break; |
case Token::SUB: |
- instr = new(zone()) HSub(left, right); |
+ instr = new(zone()) HSub(context, left, right); |
break; |
case Token::MUL: |
- instr = new(zone()) HMul(left, right); |
+ instr = new(zone()) HMul(context, left, right); |
break; |
case Token::MOD: |
- instr = new(zone()) HMod(left, right); |
+ instr = new(zone()) HMod(context, left, right); |
break; |
case Token::DIV: |
- instr = new(zone()) HDiv(left, right); |
+ instr = new(zone()) HDiv(context, left, right); |
break; |
case Token::BIT_XOR: |
- instr = new(zone()) HBitXor(left, right); |
+ instr = new(zone()) HBitXor(context, left, right); |
break; |
case Token::BIT_AND: |
- instr = new(zone()) HBitAnd(left, right); |
+ instr = new(zone()) HBitAnd(context, left, right); |
break; |
case Token::BIT_OR: |
- instr = new(zone()) HBitOr(left, right); |
+ instr = new(zone()) HBitOr(context, left, right); |
break; |
case Token::SAR: |
- instr = new(zone()) HSar(left, right); |
+ instr = new(zone()) HSar(context, left, right); |
break; |
case Token::SHR: |
- instr = new(zone()) HShr(left, right); |
+ instr = new(zone()) HShr(context, left, right); |
break; |
case Token::SHL: |
- instr = new(zone()) HShl(left, right); |
+ instr = new(zone()) HShl(context, left, right); |
break; |
default: |
UNREACHABLE(); |
@@ -5581,12 +5612,12 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
// If the target is not null we have found a known global function that is |
// assumed to stay the same for this instanceof. |
+ HValue* context = environment()->LookupContext(); |
if (target.is_null()) { |
- HValue* context = environment()->LookupContext(); |
instr = new(zone()) HInstanceOf(context, left, right); |
} else { |
AddInstruction(new(zone()) HCheckFunction(right, target)); |
- instr = new(zone()) HInstanceOfKnownGlobal(left, target); |
+ instr = new(zone()) HInstanceOfKnownGlobal(context, left, target); |
} |
} else if (op == Token::IN) { |
instr = new(zone()) HIn(left, right); |
@@ -5613,7 +5644,8 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
AddInstruction(HCheckInstanceType::NewIsSymbol(right)); |
instr = new(zone()) HCompareObjectEq(left, right); |
} else { |
- HCompare* compare = new(zone()) HCompare(left, right, op); |
+ HValue* context = environment()->LookupContext(); |
+ HCompare* compare = new(zone()) HCompare(context, left, right, op); |
Representation r = ToRepresentation(type_info); |
compare->SetInputRepresentation(r); |
instr = compare; |
@@ -5821,7 +5853,8 @@ void HGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { |
CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
HValue* index = Pop(); |
HValue* string = Pop(); |
- HStringCharCodeAt* result = BuildStringCharCodeAt(string, index); |
+ HValue* context = environment()->LookupContext(); |
+ HStringCharCodeAt* result = BuildStringCharCodeAt(context, string, index); |
ast_context()->ReturnInstruction(result, call->id()); |
} |
@@ -5831,7 +5864,9 @@ void HGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { |
ASSERT(call->arguments()->length() == 1); |
CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
HValue* char_code = Pop(); |
- HStringCharFromCode* result = new(zone()) HStringCharFromCode(char_code); |
+ HValue* context = environment()->LookupContext(); |
+ HStringCharFromCode* result = |
+ new(zone()) HStringCharFromCode(context, char_code); |
ast_context()->ReturnInstruction(result, call->id()); |
} |
@@ -5843,9 +5878,11 @@ void HGraphBuilder::GenerateStringCharAt(CallRuntime* call) { |
CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
HValue* index = Pop(); |
HValue* string = Pop(); |
- HStringCharCodeAt* char_code = BuildStringCharCodeAt(string, index); |
+ HValue* context = environment()->LookupContext(); |
+ HStringCharCodeAt* char_code = BuildStringCharCodeAt(context, string, index); |
AddInstruction(char_code); |
- HStringCharFromCode* result = new(zone()) HStringCharFromCode(char_code); |
+ HStringCharFromCode* result = |
+ new(zone()) HStringCharFromCode(context, char_code); |
ast_context()->ReturnInstruction(result, call->id()); |
} |