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/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
10 #include "src/ast-numbering.h" | 10 #include "src/ast-numbering.h" |
(...skipping 2393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2404 Push(string_map); | 2404 Push(string_map); |
2405 } | 2405 } |
2406 if_onebyte.End(); | 2406 if_onebyte.End(); |
2407 HValue* map = Pop(); | 2407 HValue* map = Pop(); |
2408 | 2408 |
2409 // Calculate the number of bytes needed for the characters in the | 2409 // Calculate the number of bytes needed for the characters in the |
2410 // string while observing object alignment. | 2410 // string while observing object alignment. |
2411 STATIC_ASSERT((SeqString::kHeaderSize & kObjectAlignmentMask) == 0); | 2411 STATIC_ASSERT((SeqString::kHeaderSize & kObjectAlignmentMask) == 0); |
2412 HValue* size = BuildObjectSizeAlignment(Pop(), SeqString::kHeaderSize); | 2412 HValue* size = BuildObjectSizeAlignment(Pop(), SeqString::kHeaderSize); |
2413 | 2413 |
2414 // Allocate the string object. HAllocate does not care whether we pass | 2414 IfBuilder if_size(this); |
2415 // STRING_TYPE or ONE_BYTE_STRING_TYPE here, so we just use STRING_TYPE. | 2415 if_size.If<HCompareNumericAndBranch>( |
2416 HAllocate* result = BuildAllocate( | 2416 size, Add<HConstant>(Page::kMaxRegularHeapObjectSize), Token::LT); |
2417 size, HType::String(), STRING_TYPE, allocation_mode); | 2417 if_size.Then(); |
2418 Add<HStoreNamedField>(result, HObjectAccess::ForMap(), map); | 2418 { |
| 2419 // Allocate the string object. HAllocate does not care whether we pass |
| 2420 // STRING_TYPE or ONE_BYTE_STRING_TYPE here, so we just use STRING_TYPE. |
| 2421 HAllocate* result = |
| 2422 BuildAllocate(size, HType::String(), STRING_TYPE, allocation_mode); |
| 2423 Add<HStoreNamedField>(result, HObjectAccess::ForMap(), map); |
2419 | 2424 |
2420 // Initialize the string fields. | 2425 // Initialize the string fields. |
2421 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), | 2426 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), |
2422 Add<HConstant>(String::kEmptyHashField)); | 2427 Add<HConstant>(String::kEmptyHashField)); |
2423 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); | 2428 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); |
2424 | 2429 |
2425 // Copy characters to the result string. | 2430 // Copy characters to the result string. |
2426 IfBuilder if_twobyte(this); | 2431 IfBuilder if_twobyte(this); |
2427 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map); | 2432 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map); |
2428 if_twobyte.Then(); | 2433 if_twobyte.Then(); |
| 2434 { |
| 2435 // Copy characters from the left string. |
| 2436 BuildCopySeqStringChars( |
| 2437 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, result, |
| 2438 graph()->GetConstant0(), String::TWO_BYTE_ENCODING, left_length); |
| 2439 |
| 2440 // Copy characters from the right string. |
| 2441 BuildCopySeqStringChars( |
| 2442 right, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, result, |
| 2443 left_length, String::TWO_BYTE_ENCODING, right_length); |
| 2444 } |
| 2445 if_twobyte.Else(); |
| 2446 { |
| 2447 // Copy characters from the left string. |
| 2448 BuildCopySeqStringChars( |
| 2449 left, graph()->GetConstant0(), String::ONE_BYTE_ENCODING, result, |
| 2450 graph()->GetConstant0(), String::ONE_BYTE_ENCODING, left_length); |
| 2451 |
| 2452 // Copy characters from the right string. |
| 2453 BuildCopySeqStringChars( |
| 2454 right, graph()->GetConstant0(), String::ONE_BYTE_ENCODING, result, |
| 2455 left_length, String::ONE_BYTE_ENCODING, right_length); |
| 2456 } |
| 2457 if_twobyte.End(); |
| 2458 |
| 2459 // Count the native string addition. |
| 2460 AddIncrementCounter(isolate()->counters()->string_add_native()); |
| 2461 |
| 2462 // Return the sequential string. |
| 2463 Push(result); |
| 2464 } |
| 2465 if_size.Else(); |
2429 { | 2466 { |
2430 // Copy characters from the left string. | 2467 // Fallback to the runtime to add the two strings. The string has to be |
2431 BuildCopySeqStringChars( | 2468 // allocated in LO space. |
2432 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, | 2469 Add<HPushArguments>(left, right); |
2433 result, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, | 2470 Push(Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kStringAdd), 2)); |
2434 left_length); | |
2435 | |
2436 // Copy characters from the right string. | |
2437 BuildCopySeqStringChars( | |
2438 right, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, | |
2439 result, left_length, String::TWO_BYTE_ENCODING, | |
2440 right_length); | |
2441 } | 2471 } |
2442 if_twobyte.Else(); | 2472 if_size.End(); |
2443 { | |
2444 // Copy characters from the left string. | |
2445 BuildCopySeqStringChars( | |
2446 left, graph()->GetConstant0(), String::ONE_BYTE_ENCODING, | |
2447 result, graph()->GetConstant0(), String::ONE_BYTE_ENCODING, | |
2448 left_length); | |
2449 | |
2450 // Copy characters from the right string. | |
2451 BuildCopySeqStringChars( | |
2452 right, graph()->GetConstant0(), String::ONE_BYTE_ENCODING, | |
2453 result, left_length, String::ONE_BYTE_ENCODING, | |
2454 right_length); | |
2455 } | |
2456 if_twobyte.End(); | |
2457 | |
2458 // Count the native string addition. | |
2459 AddIncrementCounter(isolate()->counters()->string_add_native()); | |
2460 | |
2461 // Return the sequential string. | |
2462 Push(result); | |
2463 } | 2473 } |
2464 if_sameencodingandsequential.Else(); | 2474 if_sameencodingandsequential.Else(); |
2465 { | 2475 { |
2466 // Fallback to the runtime to add the two strings. | 2476 // Fallback to the runtime to add the two strings. |
2467 Add<HPushArguments>(left, right); | 2477 Add<HPushArguments>(left, right); |
2468 Push(Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kStringAdd), 2)); | 2478 Push(Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kStringAdd), 2)); |
2469 } | 2479 } |
2470 if_sameencodingandsequential.End(); | 2480 if_sameencodingandsequential.End(); |
2471 } | 2481 } |
2472 if_createcons.End(); | 2482 if_createcons.End(); |
(...skipping 11188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13661 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13671 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13662 } | 13672 } |
13663 | 13673 |
13664 #ifdef DEBUG | 13674 #ifdef DEBUG |
13665 graph_->Verify(false); // No full verify. | 13675 graph_->Verify(false); // No full verify. |
13666 #endif | 13676 #endif |
13667 } | 13677 } |
13668 | 13678 |
13669 } // namespace internal | 13679 } // namespace internal |
13670 } // namespace v8 | 13680 } // namespace v8 |
OLD | NEW |