OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/hydrogen.h" | 5 #include "src/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 10470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10481 if (right_type->Is(Type::Number())) { | 10481 if (right_type->Is(Type::Number())) { |
10482 DCHECK(left_type->Is(Type::String())); | 10482 DCHECK(left_type->Is(Type::String())); |
10483 right = BuildNumberToString(right, right_type); | 10483 right = BuildNumberToString(right, right_type); |
10484 } else if (!right_type->Is(Type::String())) { | 10484 } else if (!right_type->Is(Type::String())) { |
10485 DCHECK(left_type->Is(Type::String())); | 10485 DCHECK(left_type->Is(Type::String())); |
10486 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); | 10486 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); |
10487 Add<HPushArguments>(left, right); | 10487 Add<HPushArguments>(left, right); |
10488 return AddUncasted<HInvokeFunction>(function, 2); | 10488 return AddUncasted<HInvokeFunction>(function, 2); |
10489 } | 10489 } |
10490 | 10490 |
10491 // Fast path for empty constant strings. | 10491 // Fast paths for empty constant strings. |
10492 if (left->IsConstant() && | 10492 Handle<String> left_string = |
10493 HConstant::cast(left)->HasStringValue() && | 10493 left->IsConstant() && HConstant::cast(left)->HasStringValue() |
10494 HConstant::cast(left)->StringValue()->length() == 0) { | 10494 ? HConstant::cast(left)->StringValue() |
10495 return right; | 10495 : Handle<String>(); |
10496 } | 10496 Handle<String> right_string = |
10497 if (right->IsConstant() && | 10497 right->IsConstant() && HConstant::cast(right)->HasStringValue() |
10498 HConstant::cast(right)->HasStringValue() && | 10498 ? HConstant::cast(right)->StringValue() |
10499 HConstant::cast(right)->StringValue()->length() == 0) { | 10499 : Handle<String>(); |
10500 return left; | 10500 if (!left_string.is_null() && left_string->length() == 0) return right; |
| 10501 if (!right_string.is_null() && right_string->length() == 0) return left; |
| 10502 if (!left_string.is_null() && !right_string.is_null()) { |
| 10503 return AddUncasted<HStringAdd>( |
| 10504 left, right, allocation_mode.GetPretenureMode(), |
| 10505 STRING_ADD_CHECK_NONE, allocation_mode.feedback_site()); |
10501 } | 10506 } |
10502 | 10507 |
10503 // Register the dependent code with the allocation site. | 10508 // Register the dependent code with the allocation site. |
10504 if (!allocation_mode.feedback_site().is_null()) { | 10509 if (!allocation_mode.feedback_site().is_null()) { |
10505 DCHECK(!graph()->info()->IsStub()); | 10510 DCHECK(!graph()->info()->IsStub()); |
10506 Handle<AllocationSite> site(allocation_mode.feedback_site()); | 10511 Handle<AllocationSite> site(allocation_mode.feedback_site()); |
10507 AllocationSite::RegisterForDeoptOnTenureChange(site, top_info()); | 10512 AllocationSite::RegisterForDeoptOnTenureChange(site, top_info()); |
10508 } | 10513 } |
10509 | 10514 |
10510 // Inline the string addition into the stub when creating allocation | 10515 // Inline the string addition into the stub when creating allocation |
(...skipping 2923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13434 if (ShouldProduceTraceOutput()) { | 13439 if (ShouldProduceTraceOutput()) { |
13435 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13440 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13436 } | 13441 } |
13437 | 13442 |
13438 #ifdef DEBUG | 13443 #ifdef DEBUG |
13439 graph_->Verify(false); // No full verify. | 13444 graph_->Verify(false); // No full verify. |
13440 #endif | 13445 #endif |
13441 } | 13446 } |
13442 | 13447 |
13443 } } // namespace v8::internal | 13448 } } // namespace v8::internal |
OLD | NEW |