| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "factory.h" | 5 #include "factory.h" |
| 6 | 6 |
| 7 #include "conversions.h" | 7 #include "conversions.h" |
| 8 #include "isolate-inl.h" | 8 #include "isolate-inl.h" |
| 9 #include "macro-assembler.h" | 9 #include "macro-assembler.h" |
| 10 | 10 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 Handle<String> first, | 411 Handle<String> first, |
| 412 Handle<String> second) { | 412 Handle<String> second) { |
| 413 DisallowHeapAllocation pointer_stays_valid; | 413 DisallowHeapAllocation pointer_stays_valid; |
| 414 SinkChar* sink = result->GetChars(); | 414 SinkChar* sink = result->GetChars(); |
| 415 String::WriteToFlat(*first, sink, 0, first->length()); | 415 String::WriteToFlat(*first, sink, 0, first->length()); |
| 416 String::WriteToFlat(*second, sink + first->length(), 0, second->length()); | 416 String::WriteToFlat(*second, sink + first->length(), 0, second->length()); |
| 417 return result; | 417 return result; |
| 418 } | 418 } |
| 419 | 419 |
| 420 | 420 |
| 421 Handle<ConsString> Factory::NewRawConsString(String::Encoding encoding) { | |
| 422 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) | |
| 423 ? cons_ascii_string_map() : cons_string_map(); | |
| 424 return New<ConsString>(map, NEW_SPACE); | |
| 425 } | |
| 426 | |
| 427 | |
| 428 MaybeHandle<String> Factory::NewConsString(Handle<String> left, | 421 MaybeHandle<String> Factory::NewConsString(Handle<String> left, |
| 429 Handle<String> right) { | 422 Handle<String> right) { |
| 430 int left_length = left->length(); | 423 int left_length = left->length(); |
| 431 if (left_length == 0) return right; | 424 if (left_length == 0) return right; |
| 432 int right_length = right->length(); | 425 int right_length = right->length(); |
| 433 if (right_length == 0) return left; | 426 if (right_length == 0) return left; |
| 434 | 427 |
| 435 int length = left_length + right_length; | 428 int length = left_length + right_length; |
| 436 | 429 |
| 437 if (length == 2) { | 430 if (length == 2) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 return result; | 480 return result; |
| 488 } | 481 } |
| 489 | 482 |
| 490 return (is_one_byte_data_in_two_byte_string) | 483 return (is_one_byte_data_in_two_byte_string) |
| 491 ? ConcatStringContent<uint8_t>( | 484 ? ConcatStringContent<uint8_t>( |
| 492 NewRawOneByteString(length).ToHandleChecked(), left, right) | 485 NewRawOneByteString(length).ToHandleChecked(), left, right) |
| 493 : ConcatStringContent<uc16>( | 486 : ConcatStringContent<uc16>( |
| 494 NewRawTwoByteString(length).ToHandleChecked(), left, right); | 487 NewRawTwoByteString(length).ToHandleChecked(), left, right); |
| 495 } | 488 } |
| 496 | 489 |
| 497 Handle<ConsString> result = NewRawConsString( | 490 Handle<Map> map = (is_one_byte || is_one_byte_data_in_two_byte_string) |
| 498 (is_one_byte || is_one_byte_data_in_two_byte_string) | 491 ? cons_ascii_string_map() : cons_string_map(); |
| 499 ? String::ONE_BYTE_ENCODING | 492 Handle<ConsString> result = New<ConsString>(map, NEW_SPACE); |
| 500 : String::TWO_BYTE_ENCODING); | |
| 501 | 493 |
| 502 DisallowHeapAllocation no_gc; | 494 DisallowHeapAllocation no_gc; |
| 503 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | 495 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
| 504 | 496 |
| 505 result->set_hash_field(String::kEmptyHashField); | 497 result->set_hash_field(String::kEmptyHashField); |
| 506 result->set_length(length); | 498 result->set_length(length); |
| 507 result->set_first(*left, mode); | 499 result->set_first(*left, mode); |
| 508 result->set_second(*right, mode); | 500 result->set_second(*right, mode); |
| 509 return result; | 501 return result; |
| 510 } | 502 } |
| 511 | 503 |
| 512 | 504 |
| 513 Handle<String> Factory::NewFlatConcatString(Handle<String> first, | 505 Handle<String> Factory::NewFlatConcatString(Handle<String> first, |
| 514 Handle<String> second) { | 506 Handle<String> second) { |
| 515 int total_length = first->length() + second->length(); | 507 int total_length = first->length() + second->length(); |
| 516 if (first->IsOneByteRepresentation() && second->IsOneByteRepresentation()) { | 508 if (first->IsOneByteRepresentation() && second->IsOneByteRepresentation()) { |
| 517 return ConcatStringContent<uint8_t>( | 509 return ConcatStringContent<uint8_t>( |
| 518 NewRawOneByteString(total_length).ToHandleChecked(), first, second); | 510 NewRawOneByteString(total_length).ToHandleChecked(), first, second); |
| 519 } else { | 511 } else { |
| 520 return ConcatStringContent<uc16>( | 512 return ConcatStringContent<uc16>( |
| 521 NewRawTwoByteString(total_length).ToHandleChecked(), first, second); | 513 NewRawTwoByteString(total_length).ToHandleChecked(), first, second); |
| 522 } | 514 } |
| 523 } | 515 } |
| 524 | 516 |
| 525 | 517 |
| 526 Handle<SlicedString> Factory::NewRawSlicedString(String::Encoding encoding) { | |
| 527 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) | |
| 528 ? sliced_ascii_string_map() : sliced_string_map(); | |
| 529 return New<SlicedString>(map, NEW_SPACE); | |
| 530 } | |
| 531 | |
| 532 | |
| 533 Handle<String> Factory::NewProperSubString(Handle<String> str, | 518 Handle<String> Factory::NewProperSubString(Handle<String> str, |
| 534 int begin, | 519 int begin, |
| 535 int end) { | 520 int end) { |
| 536 #if VERIFY_HEAP | 521 #if VERIFY_HEAP |
| 537 if (FLAG_verify_heap) str->StringVerify(); | 522 if (FLAG_verify_heap) str->StringVerify(); |
| 538 #endif | 523 #endif |
| 539 ASSERT(begin > 0 || end < str->length()); | 524 ASSERT(begin > 0 || end < str->length()); |
| 540 | 525 |
| 541 str = String::Flatten(str); | 526 str = String::Flatten(str); |
| 542 | 527 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 | 559 |
| 575 int offset = begin; | 560 int offset = begin; |
| 576 | 561 |
| 577 if (str->IsSlicedString()) { | 562 if (str->IsSlicedString()) { |
| 578 Handle<SlicedString> slice = Handle<SlicedString>::cast(str); | 563 Handle<SlicedString> slice = Handle<SlicedString>::cast(str); |
| 579 str = Handle<String>(slice->parent(), isolate()); | 564 str = Handle<String>(slice->parent(), isolate()); |
| 580 offset += slice->offset(); | 565 offset += slice->offset(); |
| 581 } | 566 } |
| 582 | 567 |
| 583 ASSERT(str->IsSeqString() || str->IsExternalString()); | 568 ASSERT(str->IsSeqString() || str->IsExternalString()); |
| 584 Handle<SlicedString> slice = NewRawSlicedString( | 569 Handle<Map> map = str->IsOneByteRepresentation() ? sliced_ascii_string_map() |
| 585 str->IsOneByteRepresentation() ? String::ONE_BYTE_ENCODING | 570 : sliced_string_map(); |
| 586 : String::TWO_BYTE_ENCODING); | 571 Handle<SlicedString> slice = New<SlicedString>(map, NEW_SPACE); |
| 587 | 572 |
| 588 slice->set_hash_field(String::kEmptyHashField); | 573 slice->set_hash_field(String::kEmptyHashField); |
| 589 slice->set_length(length); | 574 slice->set_length(length); |
| 590 slice->set_parent(*str); | 575 slice->set_parent(*str); |
| 591 slice->set_offset(offset); | 576 slice->set_offset(offset); |
| 592 return slice; | 577 return slice; |
| 593 } | 578 } |
| 594 | 579 |
| 595 | 580 |
| 596 MaybeHandle<String> Factory::NewExternalStringFromAscii( | 581 MaybeHandle<String> Factory::NewExternalStringFromAscii( |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 JSObject::SetLocalPropertyIgnoreAttributes(prototype, | 931 JSObject::SetLocalPropertyIgnoreAttributes(prototype, |
| 947 constructor_string(), | 932 constructor_string(), |
| 948 function, | 933 function, |
| 949 DONT_ENUM).Assert(); | 934 DONT_ENUM).Assert(); |
| 950 } | 935 } |
| 951 | 936 |
| 952 return prototype; | 937 return prototype; |
| 953 } | 938 } |
| 954 | 939 |
| 955 | 940 |
| 941 Handle<JSObject> Factory::CopyJSObject(Handle<JSObject> object) { |
| 942 CALL_HEAP_FUNCTION(isolate(), |
| 943 isolate()->heap()->CopyJSObject(*object, NULL), |
| 944 JSObject); |
| 945 } |
| 946 |
| 947 |
| 948 Handle<JSObject> Factory::CopyJSObjectWithAllocationSite( |
| 949 Handle<JSObject> object, |
| 950 Handle<AllocationSite> site) { |
| 951 CALL_HEAP_FUNCTION(isolate(), |
| 952 isolate()->heap()->CopyJSObject( |
| 953 *object, |
| 954 site.is_null() ? NULL : *site), |
| 955 JSObject); |
| 956 } |
| 957 |
| 958 |
| 956 Handle<FixedArray> Factory::CopyFixedArrayWithMap(Handle<FixedArray> array, | 959 Handle<FixedArray> Factory::CopyFixedArrayWithMap(Handle<FixedArray> array, |
| 957 Handle<Map> map) { | 960 Handle<Map> map) { |
| 958 CALL_HEAP_FUNCTION(isolate(), | 961 CALL_HEAP_FUNCTION(isolate(), |
| 959 isolate()->heap()->CopyFixedArrayWithMap(*array, *map), | 962 isolate()->heap()->CopyFixedArrayWithMap(*array, *map), |
| 960 FixedArray); | 963 FixedArray); |
| 961 } | 964 } |
| 962 | 965 |
| 963 | 966 |
| 964 Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { | 967 Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { |
| 965 CALL_HEAP_FUNCTION(isolate(), | 968 CALL_HEAP_FUNCTION(isolate(), |
| (...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2309 return Handle<Object>::null(); | 2312 return Handle<Object>::null(); |
| 2310 } | 2313 } |
| 2311 | 2314 |
| 2312 | 2315 |
| 2313 Handle<Object> Factory::ToBoolean(bool value) { | 2316 Handle<Object> Factory::ToBoolean(bool value) { |
| 2314 return value ? true_value() : false_value(); | 2317 return value ? true_value() : false_value(); |
| 2315 } | 2318 } |
| 2316 | 2319 |
| 2317 | 2320 |
| 2318 } } // namespace v8::internal | 2321 } } // namespace v8::internal |
| OLD | NEW |