Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index f66a9e3a27a37834927eb3322f82789c63265e61..374f55f06879ffe12ecf7685f39f450d4eaa98dc 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -911,6 +911,7 @@ HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
(state.HasSideEffects() || !result_type->Is(Type::None()))); |
HValue* result = NULL; |
+ HAllocationMode allocation_mode(NOT_TENURED); |
if (state.op() == Token::ADD && |
(left_type->Maybe(Type::String()) || right_type->Maybe(Type::String())) && |
!left_type->Is(Type::String()) && !right_type->Is(Type::String())) { |
@@ -924,14 +925,15 @@ HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
Push(BuildBinaryOperation( |
state.op(), left, right, |
handle(Type::String(), isolate()), right_type, |
- result_type, state.fixed_right_arg())); |
+ result_type, state.fixed_right_arg(), |
+ allocation_mode)); |
} |
if_leftisstring.Else(); |
{ |
Push(BuildBinaryOperation( |
state.op(), left, right, |
left_type, right_type, result_type, |
- state.fixed_right_arg())); |
+ state.fixed_right_arg(), allocation_mode)); |
} |
if_leftisstring.End(); |
result = Pop(); |
@@ -943,14 +945,15 @@ HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
Push(BuildBinaryOperation( |
state.op(), left, right, |
left_type, handle(Type::String(), isolate()), |
- result_type, state.fixed_right_arg())); |
+ result_type, state.fixed_right_arg(), |
+ allocation_mode)); |
} |
if_rightisstring.Else(); |
{ |
Push(BuildBinaryOperation( |
state.op(), left, right, |
left_type, right_type, result_type, |
- state.fixed_right_arg())); |
+ state.fixed_right_arg(), allocation_mode)); |
} |
if_rightisstring.End(); |
result = Pop(); |
@@ -959,7 +962,7 @@ HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
result = BuildBinaryOperation( |
state.op(), left, right, |
left_type, right_type, result_type, |
- state.fixed_right_arg()); |
+ state.fixed_right_arg(), allocation_mode); |
} |
// If we encounter a generic argument, the number conversion is |
@@ -1007,6 +1010,31 @@ Handle<Code> BinaryOpICStub::GenerateCode(Isolate* isolate) { |
template <> |
+HValue* CodeStubGraphBuilder<BinaryOpWithAllocationSiteStub>::BuildCodeStub() { |
+ BinaryOpIC::State state = casted_stub()->state(); |
+ |
+ HValue* allocation_site = GetParameter( |
+ BinaryOpWithAllocationSiteStub::kAllocationSite); |
+ HValue* left = GetParameter(BinaryOpWithAllocationSiteStub::kLeft); |
+ HValue* right = GetParameter(BinaryOpWithAllocationSiteStub::kRight); |
+ |
+ Handle<Type> left_type = state.GetLeftType(isolate()); |
+ Handle<Type> right_type = state.GetRightType(isolate()); |
+ Handle<Type> result_type = state.GetResultType(isolate()); |
+ HAllocationMode allocation_mode(allocation_site); |
+ |
+ return BuildBinaryOperation(state.op(), left, right, |
+ left_type, right_type, result_type, |
+ state.fixed_right_arg(), allocation_mode); |
+} |
+ |
+ |
+Handle<Code> BinaryOpWithAllocationSiteStub::GenerateCode(Isolate* isolate) { |
+ return DoGenerateCode(isolate, this); |
+} |
+ |
+ |
+template <> |
HValue* CodeStubGraphBuilder<NewStringAddStub>::BuildCodeInitializedStub() { |
NewStringAddStub* stub = casted_stub(); |
StringAddFlags flags = stub->flags(); |
@@ -1023,7 +1051,7 @@ HValue* CodeStubGraphBuilder<NewStringAddStub>::BuildCodeInitializedStub() { |
right = BuildCheckString(right); |
} |
- return BuildStringAdd(left, right, pretenure_flag); |
+ return BuildStringAdd(left, right, HAllocationMode(pretenure_flag)); |
} |