| 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 "src/factory.h" | 5 #include "src/factory.h" |
| 6 | 6 |
| 7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 const char* to_string, | 54 const char* to_string, |
| 55 Handle<Object> to_number, | 55 Handle<Object> to_number, |
| 56 byte kind) { | 56 byte kind) { |
| 57 Handle<Oddball> oddball = New<Oddball>(map, OLD_POINTER_SPACE); | 57 Handle<Oddball> oddball = New<Oddball>(map, OLD_POINTER_SPACE); |
| 58 Oddball::Initialize(isolate(), oddball, to_string, to_number, kind); | 58 Oddball::Initialize(isolate(), oddball, to_string, to_number, kind); |
| 59 return oddball; | 59 return oddball; |
| 60 } | 60 } |
| 61 | 61 |
| 62 | 62 |
| 63 Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { | 63 Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { |
| 64 ASSERT(0 <= size); | 64 DCHECK(0 <= size); |
| 65 CALL_HEAP_FUNCTION( | 65 CALL_HEAP_FUNCTION( |
| 66 isolate(), | 66 isolate(), |
| 67 isolate()->heap()->AllocateFixedArray(size, pretenure), | 67 isolate()->heap()->AllocateFixedArray(size, pretenure), |
| 68 FixedArray); | 68 FixedArray); |
| 69 } | 69 } |
| 70 | 70 |
| 71 | 71 |
| 72 Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size, | 72 Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size, |
| 73 PretenureFlag pretenure) { | 73 PretenureFlag pretenure) { |
| 74 ASSERT(0 <= size); | 74 DCHECK(0 <= size); |
| 75 CALL_HEAP_FUNCTION( | 75 CALL_HEAP_FUNCTION( |
| 76 isolate(), | 76 isolate(), |
| 77 isolate()->heap()->AllocateFixedArrayWithFiller(size, | 77 isolate()->heap()->AllocateFixedArrayWithFiller(size, |
| 78 pretenure, | 78 pretenure, |
| 79 *the_hole_value()), | 79 *the_hole_value()), |
| 80 FixedArray); | 80 FixedArray); |
| 81 } | 81 } |
| 82 | 82 |
| 83 | 83 |
| 84 Handle<FixedArray> Factory::NewUninitializedFixedArray(int size) { | 84 Handle<FixedArray> Factory::NewUninitializedFixedArray(int size) { |
| 85 CALL_HEAP_FUNCTION( | 85 CALL_HEAP_FUNCTION( |
| 86 isolate(), | 86 isolate(), |
| 87 isolate()->heap()->AllocateUninitializedFixedArray(size), | 87 isolate()->heap()->AllocateUninitializedFixedArray(size), |
| 88 FixedArray); | 88 FixedArray); |
| 89 } | 89 } |
| 90 | 90 |
| 91 | 91 |
| 92 Handle<FixedArrayBase> Factory::NewFixedDoubleArray(int size, | 92 Handle<FixedArrayBase> Factory::NewFixedDoubleArray(int size, |
| 93 PretenureFlag pretenure) { | 93 PretenureFlag pretenure) { |
| 94 ASSERT(0 <= size); | 94 DCHECK(0 <= size); |
| 95 CALL_HEAP_FUNCTION( | 95 CALL_HEAP_FUNCTION( |
| 96 isolate(), | 96 isolate(), |
| 97 isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure), | 97 isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure), |
| 98 FixedArrayBase); | 98 FixedArrayBase); |
| 99 } | 99 } |
| 100 | 100 |
| 101 | 101 |
| 102 Handle<FixedArrayBase> Factory::NewFixedDoubleArrayWithHoles( | 102 Handle<FixedArrayBase> Factory::NewFixedDoubleArrayWithHoles( |
| 103 int size, | 103 int size, |
| 104 PretenureFlag pretenure) { | 104 PretenureFlag pretenure) { |
| 105 ASSERT(0 <= size); | 105 DCHECK(0 <= size); |
| 106 Handle<FixedArrayBase> array = NewFixedDoubleArray(size, pretenure); | 106 Handle<FixedArrayBase> array = NewFixedDoubleArray(size, pretenure); |
| 107 if (size > 0) { | 107 if (size > 0) { |
| 108 Handle<FixedDoubleArray> double_array = | 108 Handle<FixedDoubleArray> double_array = |
| 109 Handle<FixedDoubleArray>::cast(array); | 109 Handle<FixedDoubleArray>::cast(array); |
| 110 for (int i = 0; i < size; ++i) { | 110 for (int i = 0; i < size; ++i) { |
| 111 double_array->set_the_hole(i); | 111 double_array->set_the_hole(i); |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 return array; | 114 return array; |
| 115 } | 115 } |
| 116 | 116 |
| 117 | 117 |
| 118 Handle<ConstantPoolArray> Factory::NewConstantPoolArray( | 118 Handle<ConstantPoolArray> Factory::NewConstantPoolArray( |
| 119 const ConstantPoolArray::NumberOfEntries& small) { | 119 const ConstantPoolArray::NumberOfEntries& small) { |
| 120 ASSERT(small.total_count() > 0); | 120 DCHECK(small.total_count() > 0); |
| 121 CALL_HEAP_FUNCTION( | 121 CALL_HEAP_FUNCTION( |
| 122 isolate(), | 122 isolate(), |
| 123 isolate()->heap()->AllocateConstantPoolArray(small), | 123 isolate()->heap()->AllocateConstantPoolArray(small), |
| 124 ConstantPoolArray); | 124 ConstantPoolArray); |
| 125 } | 125 } |
| 126 | 126 |
| 127 | 127 |
| 128 Handle<ConstantPoolArray> Factory::NewExtendedConstantPoolArray( | 128 Handle<ConstantPoolArray> Factory::NewExtendedConstantPoolArray( |
| 129 const ConstantPoolArray::NumberOfEntries& small, | 129 const ConstantPoolArray::NumberOfEntries& small, |
| 130 const ConstantPoolArray::NumberOfEntries& extended) { | 130 const ConstantPoolArray::NumberOfEntries& extended) { |
| 131 ASSERT(small.total_count() > 0); | 131 DCHECK(small.total_count() > 0); |
| 132 ASSERT(extended.total_count() > 0); | 132 DCHECK(extended.total_count() > 0); |
| 133 CALL_HEAP_FUNCTION( | 133 CALL_HEAP_FUNCTION( |
| 134 isolate(), | 134 isolate(), |
| 135 isolate()->heap()->AllocateExtendedConstantPoolArray(small, extended), | 135 isolate()->heap()->AllocateExtendedConstantPoolArray(small, extended), |
| 136 ConstantPoolArray); | 136 ConstantPoolArray); |
| 137 } | 137 } |
| 138 | 138 |
| 139 | 139 |
| 140 Handle<OrderedHashSet> Factory::NewOrderedHashSet() { | 140 Handle<OrderedHashSet> Factory::NewOrderedHashSet() { |
| 141 return OrderedHashSet::Allocate(isolate(), 4); | 141 return OrderedHashSet::Allocate(isolate(), 4); |
| 142 } | 142 } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 // since UTF8 is backwards compatible with ASCII. | 239 // since UTF8 is backwards compatible with ASCII. |
| 240 return NewStringFromOneByte(Vector<const uint8_t>::cast(string), pretenure); | 240 return NewStringFromOneByte(Vector<const uint8_t>::cast(string), pretenure); |
| 241 } | 241 } |
| 242 | 242 |
| 243 // Non-ASCII and we need to decode. | 243 // Non-ASCII and we need to decode. |
| 244 Access<UnicodeCache::Utf8Decoder> | 244 Access<UnicodeCache::Utf8Decoder> |
| 245 decoder(isolate()->unicode_cache()->utf8_decoder()); | 245 decoder(isolate()->unicode_cache()->utf8_decoder()); |
| 246 decoder->Reset(string.start() + non_ascii_start, | 246 decoder->Reset(string.start() + non_ascii_start, |
| 247 length - non_ascii_start); | 247 length - non_ascii_start); |
| 248 int utf16_length = decoder->Utf16Length(); | 248 int utf16_length = decoder->Utf16Length(); |
| 249 ASSERT(utf16_length > 0); | 249 DCHECK(utf16_length > 0); |
| 250 // Allocate string. | 250 // Allocate string. |
| 251 Handle<SeqTwoByteString> result; | 251 Handle<SeqTwoByteString> result; |
| 252 ASSIGN_RETURN_ON_EXCEPTION( | 252 ASSIGN_RETURN_ON_EXCEPTION( |
| 253 isolate(), result, | 253 isolate(), result, |
| 254 NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), | 254 NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), |
| 255 String); | 255 String); |
| 256 // Copy ascii portion. | 256 // Copy ascii portion. |
| 257 uint16_t* data = result->GetChars(); | 257 uint16_t* data = result->GetChars(); |
| 258 const char* ascii_data = string.start(); | 258 const char* ascii_data = string.start(); |
| 259 for (int i = 0; i < non_ascii_start; i++) { | 259 for (int i = 0; i < non_ascii_start; i++) { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 return handle(String::cast(value), isolate()); | 390 return handle(String::cast(value), isolate()); |
| 391 } | 391 } |
| 392 } | 392 } |
| 393 uint8_t buffer[1]; | 393 uint8_t buffer[1]; |
| 394 buffer[0] = static_cast<uint8_t>(code); | 394 buffer[0] = static_cast<uint8_t>(code); |
| 395 Handle<String> result = | 395 Handle<String> result = |
| 396 InternalizeOneByteString(Vector<const uint8_t>(buffer, 1)); | 396 InternalizeOneByteString(Vector<const uint8_t>(buffer, 1)); |
| 397 single_character_string_cache()->set(code, *result); | 397 single_character_string_cache()->set(code, *result); |
| 398 return result; | 398 return result; |
| 399 } | 399 } |
| 400 ASSERT(code <= String::kMaxUtf16CodeUnitU); | 400 DCHECK(code <= String::kMaxUtf16CodeUnitU); |
| 401 | 401 |
| 402 Handle<SeqTwoByteString> result = NewRawTwoByteString(1).ToHandleChecked(); | 402 Handle<SeqTwoByteString> result = NewRawTwoByteString(1).ToHandleChecked(); |
| 403 result->SeqTwoByteStringSet(0, static_cast<uint16_t>(code)); | 403 result->SeqTwoByteStringSet(0, static_cast<uint16_t>(code)); |
| 404 return result; | 404 return result; |
| 405 } | 405 } |
| 406 | 406 |
| 407 | 407 |
| 408 // Returns true for a character in a range. Both limits are inclusive. | 408 // Returns true for a character in a range. Both limits are inclusive. |
| 409 static inline bool Between(uint32_t character, uint32_t from, uint32_t to) { | 409 static inline bool Between(uint32_t character, uint32_t from, uint32_t to) { |
| 410 // This makes uses of the the unsigned wraparound. | 410 // This makes uses of the the unsigned wraparound. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 422 if (StringTable::LookupTwoCharsStringIfExists(isolate, c1, c2). | 422 if (StringTable::LookupTwoCharsStringIfExists(isolate, c1, c2). |
| 423 ToHandle(&result)) { | 423 ToHandle(&result)) { |
| 424 return result; | 424 return result; |
| 425 } | 425 } |
| 426 } | 426 } |
| 427 | 427 |
| 428 // Now we know the length is 2, we might as well make use of that fact | 428 // Now we know the length is 2, we might as well make use of that fact |
| 429 // when building the new string. | 429 // when building the new string. |
| 430 if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) { | 430 if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) { |
| 431 // We can do this. | 431 // We can do this. |
| 432 ASSERT(IsPowerOf2(String::kMaxOneByteCharCodeU + 1)); // because of this. | 432 DCHECK(IsPowerOf2(String::kMaxOneByteCharCodeU + 1)); // because of this. |
| 433 Handle<SeqOneByteString> str = | 433 Handle<SeqOneByteString> str = |
| 434 isolate->factory()->NewRawOneByteString(2).ToHandleChecked(); | 434 isolate->factory()->NewRawOneByteString(2).ToHandleChecked(); |
| 435 uint8_t* dest = str->GetChars(); | 435 uint8_t* dest = str->GetChars(); |
| 436 dest[0] = static_cast<uint8_t>(c1); | 436 dest[0] = static_cast<uint8_t>(c1); |
| 437 dest[1] = static_cast<uint8_t>(c2); | 437 dest[1] = static_cast<uint8_t>(c2); |
| 438 return str; | 438 return str; |
| 439 } else { | 439 } else { |
| 440 Handle<SeqTwoByteString> str = | 440 Handle<SeqTwoByteString> str = |
| 441 isolate->factory()->NewRawTwoByteString(2).ToHandleChecked(); | 441 isolate->factory()->NewRawTwoByteString(2).ToHandleChecked(); |
| 442 uc16* dest = str->GetChars(); | 442 uc16* dest = str->GetChars(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 left->HasOnlyOneByteChars() && right->HasOnlyOneByteChars(); | 492 left->HasOnlyOneByteChars() && right->HasOnlyOneByteChars(); |
| 493 if (is_one_byte_data_in_two_byte_string) { | 493 if (is_one_byte_data_in_two_byte_string) { |
| 494 isolate()->counters()->string_add_runtime_ext_to_ascii()->Increment(); | 494 isolate()->counters()->string_add_runtime_ext_to_ascii()->Increment(); |
| 495 } | 495 } |
| 496 } | 496 } |
| 497 | 497 |
| 498 // If the resulting string is small make a flat string. | 498 // If the resulting string is small make a flat string. |
| 499 if (length < ConsString::kMinLength) { | 499 if (length < ConsString::kMinLength) { |
| 500 // Note that neither of the two inputs can be a slice because: | 500 // Note that neither of the two inputs can be a slice because: |
| 501 STATIC_ASSERT(ConsString::kMinLength <= SlicedString::kMinLength); | 501 STATIC_ASSERT(ConsString::kMinLength <= SlicedString::kMinLength); |
| 502 ASSERT(left->IsFlat()); | 502 DCHECK(left->IsFlat()); |
| 503 ASSERT(right->IsFlat()); | 503 DCHECK(right->IsFlat()); |
| 504 | 504 |
| 505 STATIC_ASSERT(ConsString::kMinLength <= String::kMaxLength); | 505 STATIC_ASSERT(ConsString::kMinLength <= String::kMaxLength); |
| 506 if (is_one_byte) { | 506 if (is_one_byte) { |
| 507 Handle<SeqOneByteString> result = | 507 Handle<SeqOneByteString> result = |
| 508 NewRawOneByteString(length).ToHandleChecked(); | 508 NewRawOneByteString(length).ToHandleChecked(); |
| 509 DisallowHeapAllocation no_gc; | 509 DisallowHeapAllocation no_gc; |
| 510 uint8_t* dest = result->GetChars(); | 510 uint8_t* dest = result->GetChars(); |
| 511 // Copy left part. | 511 // Copy left part. |
| 512 const uint8_t* src = left->IsExternalString() | 512 const uint8_t* src = left->IsExternalString() |
| 513 ? Handle<ExternalAsciiString>::cast(left)->GetChars() | 513 ? Handle<ExternalAsciiString>::cast(left)->GetChars() |
| (...skipping 28 matching lines...) Expand all Loading... |
| 542 return result; | 542 return result; |
| 543 } | 543 } |
| 544 | 544 |
| 545 | 545 |
| 546 Handle<String> Factory::NewProperSubString(Handle<String> str, | 546 Handle<String> Factory::NewProperSubString(Handle<String> str, |
| 547 int begin, | 547 int begin, |
| 548 int end) { | 548 int end) { |
| 549 #if VERIFY_HEAP | 549 #if VERIFY_HEAP |
| 550 if (FLAG_verify_heap) str->StringVerify(); | 550 if (FLAG_verify_heap) str->StringVerify(); |
| 551 #endif | 551 #endif |
| 552 ASSERT(begin > 0 || end < str->length()); | 552 DCHECK(begin > 0 || end < str->length()); |
| 553 | 553 |
| 554 str = String::Flatten(str); | 554 str = String::Flatten(str); |
| 555 | 555 |
| 556 int length = end - begin; | 556 int length = end - begin; |
| 557 if (length <= 0) return empty_string(); | 557 if (length <= 0) return empty_string(); |
| 558 if (length == 1) { | 558 if (length == 1) { |
| 559 return LookupSingleCharacterStringFromCode(str->Get(begin)); | 559 return LookupSingleCharacterStringFromCode(str->Get(begin)); |
| 560 } | 560 } |
| 561 if (length == 2) { | 561 if (length == 2) { |
| 562 // Optimization for 2-byte strings often used as keys in a decompression | 562 // Optimization for 2-byte strings often used as keys in a decompression |
| (...skipping 23 matching lines...) Expand all Loading... |
| 586 } | 586 } |
| 587 | 587 |
| 588 int offset = begin; | 588 int offset = begin; |
| 589 | 589 |
| 590 if (str->IsSlicedString()) { | 590 if (str->IsSlicedString()) { |
| 591 Handle<SlicedString> slice = Handle<SlicedString>::cast(str); | 591 Handle<SlicedString> slice = Handle<SlicedString>::cast(str); |
| 592 str = Handle<String>(slice->parent(), isolate()); | 592 str = Handle<String>(slice->parent(), isolate()); |
| 593 offset += slice->offset(); | 593 offset += slice->offset(); |
| 594 } | 594 } |
| 595 | 595 |
| 596 ASSERT(str->IsSeqString() || str->IsExternalString()); | 596 DCHECK(str->IsSeqString() || str->IsExternalString()); |
| 597 Handle<Map> map = str->IsOneByteRepresentation() ? sliced_ascii_string_map() | 597 Handle<Map> map = str->IsOneByteRepresentation() ? sliced_ascii_string_map() |
| 598 : sliced_string_map(); | 598 : sliced_string_map(); |
| 599 Handle<SlicedString> slice = New<SlicedString>(map, NEW_SPACE); | 599 Handle<SlicedString> slice = New<SlicedString>(map, NEW_SPACE); |
| 600 | 600 |
| 601 slice->set_hash_field(String::kEmptyHashField); | 601 slice->set_hash_field(String::kEmptyHashField); |
| 602 slice->set_length(length); | 602 slice->set_length(length); |
| 603 slice->set_parent(*str); | 603 slice->set_parent(*str); |
| 604 slice->set_offset(offset); | 604 slice->set_offset(offset); |
| 605 return slice; | 605 return slice; |
| 606 } | 606 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 symbol->set_is_private(true); | 661 symbol->set_is_private(true); |
| 662 return symbol; | 662 return symbol; |
| 663 } | 663 } |
| 664 | 664 |
| 665 | 665 |
| 666 Handle<Context> Factory::NewNativeContext() { | 666 Handle<Context> Factory::NewNativeContext() { |
| 667 Handle<FixedArray> array = NewFixedArray(Context::NATIVE_CONTEXT_SLOTS); | 667 Handle<FixedArray> array = NewFixedArray(Context::NATIVE_CONTEXT_SLOTS); |
| 668 array->set_map_no_write_barrier(*native_context_map()); | 668 array->set_map_no_write_barrier(*native_context_map()); |
| 669 Handle<Context> context = Handle<Context>::cast(array); | 669 Handle<Context> context = Handle<Context>::cast(array); |
| 670 context->set_js_array_maps(*undefined_value()); | 670 context->set_js_array_maps(*undefined_value()); |
| 671 ASSERT(context->IsNativeContext()); | 671 DCHECK(context->IsNativeContext()); |
| 672 return context; | 672 return context; |
| 673 } | 673 } |
| 674 | 674 |
| 675 | 675 |
| 676 Handle<Context> Factory::NewGlobalContext(Handle<JSFunction> function, | 676 Handle<Context> Factory::NewGlobalContext(Handle<JSFunction> function, |
| 677 Handle<ScopeInfo> scope_info) { | 677 Handle<ScopeInfo> scope_info) { |
| 678 Handle<FixedArray> array = | 678 Handle<FixedArray> array = |
| 679 NewFixedArray(scope_info->ContextLength(), TENURED); | 679 NewFixedArray(scope_info->ContextLength(), TENURED); |
| 680 array->set_map_no_write_barrier(*global_context_map()); | 680 array->set_map_no_write_barrier(*global_context_map()); |
| 681 Handle<Context> context = Handle<Context>::cast(array); | 681 Handle<Context> context = Handle<Context>::cast(array); |
| 682 context->set_closure(*function); | 682 context->set_closure(*function); |
| 683 context->set_previous(function->context()); | 683 context->set_previous(function->context()); |
| 684 context->set_extension(*scope_info); | 684 context->set_extension(*scope_info); |
| 685 context->set_global_object(function->context()->global_object()); | 685 context->set_global_object(function->context()->global_object()); |
| 686 ASSERT(context->IsGlobalContext()); | 686 DCHECK(context->IsGlobalContext()); |
| 687 return context; | 687 return context; |
| 688 } | 688 } |
| 689 | 689 |
| 690 | 690 |
| 691 Handle<Context> Factory::NewModuleContext(Handle<ScopeInfo> scope_info) { | 691 Handle<Context> Factory::NewModuleContext(Handle<ScopeInfo> scope_info) { |
| 692 Handle<FixedArray> array = | 692 Handle<FixedArray> array = |
| 693 NewFixedArray(scope_info->ContextLength(), TENURED); | 693 NewFixedArray(scope_info->ContextLength(), TENURED); |
| 694 array->set_map_no_write_barrier(*module_context_map()); | 694 array->set_map_no_write_barrier(*module_context_map()); |
| 695 // Instance link will be set later. | 695 // Instance link will be set later. |
| 696 Handle<Context> context = Handle<Context>::cast(array); | 696 Handle<Context> context = Handle<Context>::cast(array); |
| 697 context->set_extension(Smi::FromInt(0)); | 697 context->set_extension(Smi::FromInt(0)); |
| 698 return context; | 698 return context; |
| 699 } | 699 } |
| 700 | 700 |
| 701 | 701 |
| 702 Handle<Context> Factory::NewFunctionContext(int length, | 702 Handle<Context> Factory::NewFunctionContext(int length, |
| 703 Handle<JSFunction> function) { | 703 Handle<JSFunction> function) { |
| 704 ASSERT(length >= Context::MIN_CONTEXT_SLOTS); | 704 DCHECK(length >= Context::MIN_CONTEXT_SLOTS); |
| 705 Handle<FixedArray> array = NewFixedArray(length); | 705 Handle<FixedArray> array = NewFixedArray(length); |
| 706 array->set_map_no_write_barrier(*function_context_map()); | 706 array->set_map_no_write_barrier(*function_context_map()); |
| 707 Handle<Context> context = Handle<Context>::cast(array); | 707 Handle<Context> context = Handle<Context>::cast(array); |
| 708 context->set_closure(*function); | 708 context->set_closure(*function); |
| 709 context->set_previous(function->context()); | 709 context->set_previous(function->context()); |
| 710 context->set_extension(Smi::FromInt(0)); | 710 context->set_extension(Smi::FromInt(0)); |
| 711 context->set_global_object(function->context()->global_object()); | 711 context->set_global_object(function->context()->global_object()); |
| 712 return context; | 712 return context; |
| 713 } | 713 } |
| 714 | 714 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 Foreign); | 842 Foreign); |
| 843 } | 843 } |
| 844 | 844 |
| 845 | 845 |
| 846 Handle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) { | 846 Handle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) { |
| 847 return NewForeign((Address) desc, TENURED); | 847 return NewForeign((Address) desc, TENURED); |
| 848 } | 848 } |
| 849 | 849 |
| 850 | 850 |
| 851 Handle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) { | 851 Handle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) { |
| 852 ASSERT(0 <= length); | 852 DCHECK(0 <= length); |
| 853 CALL_HEAP_FUNCTION( | 853 CALL_HEAP_FUNCTION( |
| 854 isolate(), | 854 isolate(), |
| 855 isolate()->heap()->AllocateByteArray(length, pretenure), | 855 isolate()->heap()->AllocateByteArray(length, pretenure), |
| 856 ByteArray); | 856 ByteArray); |
| 857 } | 857 } |
| 858 | 858 |
| 859 | 859 |
| 860 Handle<ExternalArray> Factory::NewExternalArray(int length, | 860 Handle<ExternalArray> Factory::NewExternalArray(int length, |
| 861 ExternalArrayType array_type, | 861 ExternalArrayType array_type, |
| 862 void* external_pointer, | 862 void* external_pointer, |
| 863 PretenureFlag pretenure) { | 863 PretenureFlag pretenure) { |
| 864 ASSERT(0 <= length && length <= Smi::kMaxValue); | 864 DCHECK(0 <= length && length <= Smi::kMaxValue); |
| 865 CALL_HEAP_FUNCTION( | 865 CALL_HEAP_FUNCTION( |
| 866 isolate(), | 866 isolate(), |
| 867 isolate()->heap()->AllocateExternalArray(length, | 867 isolate()->heap()->AllocateExternalArray(length, |
| 868 array_type, | 868 array_type, |
| 869 external_pointer, | 869 external_pointer, |
| 870 pretenure), | 870 pretenure), |
| 871 ExternalArray); | 871 ExternalArray); |
| 872 } | 872 } |
| 873 | 873 |
| 874 | 874 |
| 875 Handle<FixedTypedArrayBase> Factory::NewFixedTypedArray( | 875 Handle<FixedTypedArrayBase> Factory::NewFixedTypedArray( |
| 876 int length, | 876 int length, |
| 877 ExternalArrayType array_type, | 877 ExternalArrayType array_type, |
| 878 PretenureFlag pretenure) { | 878 PretenureFlag pretenure) { |
| 879 ASSERT(0 <= length && length <= Smi::kMaxValue); | 879 DCHECK(0 <= length && length <= Smi::kMaxValue); |
| 880 CALL_HEAP_FUNCTION( | 880 CALL_HEAP_FUNCTION( |
| 881 isolate(), | 881 isolate(), |
| 882 isolate()->heap()->AllocateFixedTypedArray(length, | 882 isolate()->heap()->AllocateFixedTypedArray(length, |
| 883 array_type, | 883 array_type, |
| 884 pretenure), | 884 pretenure), |
| 885 FixedTypedArrayBase); | 885 FixedTypedArrayBase); |
| 886 } | 886 } |
| 887 | 887 |
| 888 | 888 |
| 889 Handle<Cell> Factory::NewCell(Handle<Object> value) { | 889 Handle<Cell> Factory::NewCell(Handle<Object> value) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 | 961 |
| 962 Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { | 962 Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { |
| 963 CALL_HEAP_FUNCTION(isolate(), | 963 CALL_HEAP_FUNCTION(isolate(), |
| 964 isolate()->heap()->CopyFixedArray(*array), | 964 isolate()->heap()->CopyFixedArray(*array), |
| 965 FixedArray); | 965 FixedArray); |
| 966 } | 966 } |
| 967 | 967 |
| 968 | 968 |
| 969 Handle<FixedArray> Factory::CopyAndTenureFixedCOWArray( | 969 Handle<FixedArray> Factory::CopyAndTenureFixedCOWArray( |
| 970 Handle<FixedArray> array) { | 970 Handle<FixedArray> array) { |
| 971 ASSERT(isolate()->heap()->InNewSpace(*array)); | 971 DCHECK(isolate()->heap()->InNewSpace(*array)); |
| 972 CALL_HEAP_FUNCTION(isolate(), | 972 CALL_HEAP_FUNCTION(isolate(), |
| 973 isolate()->heap()->CopyAndTenureFixedCOWArray(*array), | 973 isolate()->heap()->CopyAndTenureFixedCOWArray(*array), |
| 974 FixedArray); | 974 FixedArray); |
| 975 } | 975 } |
| 976 | 976 |
| 977 | 977 |
| 978 Handle<FixedDoubleArray> Factory::CopyFixedDoubleArray( | 978 Handle<FixedDoubleArray> Factory::CopyFixedDoubleArray( |
| 979 Handle<FixedDoubleArray> array) { | 979 Handle<FixedDoubleArray> array) { |
| 980 CALL_HEAP_FUNCTION(isolate(), | 980 CALL_HEAP_FUNCTION(isolate(), |
| 981 isolate()->heap()->CopyFixedDoubleArray(*array), | 981 isolate()->heap()->CopyFixedDoubleArray(*array), |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 InitializeFunction(result, info, context); | 1230 InitializeFunction(result, info, context); |
| 1231 return result; | 1231 return result; |
| 1232 } | 1232 } |
| 1233 | 1233 |
| 1234 | 1234 |
| 1235 Handle<JSFunction> Factory::NewFunction(Handle<Map> map, | 1235 Handle<JSFunction> Factory::NewFunction(Handle<Map> map, |
| 1236 Handle<String> name, | 1236 Handle<String> name, |
| 1237 MaybeHandle<Code> code) { | 1237 MaybeHandle<Code> code) { |
| 1238 Handle<Context> context(isolate()->native_context()); | 1238 Handle<Context> context(isolate()->native_context()); |
| 1239 Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name, code); | 1239 Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name, code); |
| 1240 ASSERT((info->strict_mode() == SLOPPY) && | 1240 DCHECK((info->strict_mode() == SLOPPY) && |
| 1241 (map.is_identical_to(isolate()->sloppy_function_map()) || | 1241 (map.is_identical_to(isolate()->sloppy_function_map()) || |
| 1242 map.is_identical_to( | 1242 map.is_identical_to( |
| 1243 isolate()->sloppy_function_without_prototype_map()) || | 1243 isolate()->sloppy_function_without_prototype_map()) || |
| 1244 map.is_identical_to( | 1244 map.is_identical_to( |
| 1245 isolate()->sloppy_function_with_readonly_prototype_map()))); | 1245 isolate()->sloppy_function_with_readonly_prototype_map()))); |
| 1246 return NewFunction(map, info, context); | 1246 return NewFunction(map, info, context); |
| 1247 } | 1247 } |
| 1248 | 1248 |
| 1249 | 1249 |
| 1250 Handle<JSFunction> Factory::NewFunction(Handle<String> name) { | 1250 Handle<JSFunction> Factory::NewFunction(Handle<String> name) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 Handle<Context> native_context(function->context()->native_context()); | 1310 Handle<Context> native_context(function->context()->native_context()); |
| 1311 Handle<Map> new_map; | 1311 Handle<Map> new_map; |
| 1312 if (function->shared()->is_generator()) { | 1312 if (function->shared()->is_generator()) { |
| 1313 // Generator prototypes can share maps since they don't have "constructor" | 1313 // Generator prototypes can share maps since they don't have "constructor" |
| 1314 // properties. | 1314 // properties. |
| 1315 new_map = handle(native_context->generator_object_prototype_map()); | 1315 new_map = handle(native_context->generator_object_prototype_map()); |
| 1316 } else { | 1316 } else { |
| 1317 // Each function prototype gets a fresh map to avoid unwanted sharing of | 1317 // Each function prototype gets a fresh map to avoid unwanted sharing of |
| 1318 // maps between prototypes of different constructors. | 1318 // maps between prototypes of different constructors. |
| 1319 Handle<JSFunction> object_function(native_context->object_function()); | 1319 Handle<JSFunction> object_function(native_context->object_function()); |
| 1320 ASSERT(object_function->has_initial_map()); | 1320 DCHECK(object_function->has_initial_map()); |
| 1321 new_map = Map::Copy(handle(object_function->initial_map())); | 1321 new_map = Map::Copy(handle(object_function->initial_map())); |
| 1322 } | 1322 } |
| 1323 | 1323 |
| 1324 Handle<JSObject> prototype = NewJSObjectFromMap(new_map); | 1324 Handle<JSObject> prototype = NewJSObjectFromMap(new_map); |
| 1325 | 1325 |
| 1326 if (!function->shared()->is_generator()) { | 1326 if (!function->shared()->is_generator()) { |
| 1327 JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM); | 1327 JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM); |
| 1328 } | 1328 } |
| 1329 | 1329 |
| 1330 return prototype; | 1330 return prototype; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1357 context->native_context()); | 1357 context->native_context()); |
| 1358 } | 1358 } |
| 1359 result->set_literals(*literals); | 1359 result->set_literals(*literals); |
| 1360 } | 1360 } |
| 1361 | 1361 |
| 1362 if (index > 0) { | 1362 if (index > 0) { |
| 1363 // Caching of optimized code enabled and optimized code found. | 1363 // Caching of optimized code enabled and optimized code found. |
| 1364 FixedArray* literals = info->GetLiteralsFromOptimizedCodeMap(index); | 1364 FixedArray* literals = info->GetLiteralsFromOptimizedCodeMap(index); |
| 1365 if (literals != NULL) result->set_literals(literals); | 1365 if (literals != NULL) result->set_literals(literals); |
| 1366 Code* code = info->GetCodeFromOptimizedCodeMap(index); | 1366 Code* code = info->GetCodeFromOptimizedCodeMap(index); |
| 1367 ASSERT(!code->marked_for_deoptimization()); | 1367 DCHECK(!code->marked_for_deoptimization()); |
| 1368 result->ReplaceCode(code); | 1368 result->ReplaceCode(code); |
| 1369 return result; | 1369 return result; |
| 1370 } | 1370 } |
| 1371 | 1371 |
| 1372 if (isolate()->use_crankshaft() && | 1372 if (isolate()->use_crankshaft() && |
| 1373 FLAG_always_opt && | 1373 FLAG_always_opt && |
| 1374 result->is_compiled() && | 1374 result->is_compiled() && |
| 1375 !info->is_toplevel() && | 1375 !info->is_toplevel() && |
| 1376 info->allows_lazy_compilation() && | 1376 info->allows_lazy_compilation() && |
| 1377 !info->optimization_disabled() && | 1377 !info->optimization_disabled() && |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 bool is_debug) { | 1414 bool is_debug) { |
| 1415 Handle<ByteArray> reloc_info = NewByteArray(desc.reloc_size, TENURED); | 1415 Handle<ByteArray> reloc_info = NewByteArray(desc.reloc_size, TENURED); |
| 1416 Handle<ConstantPoolArray> constant_pool = | 1416 Handle<ConstantPoolArray> constant_pool = |
| 1417 desc.origin->NewConstantPool(isolate()); | 1417 desc.origin->NewConstantPool(isolate()); |
| 1418 | 1418 |
| 1419 // Compute size. | 1419 // Compute size. |
| 1420 int body_size = RoundUp(desc.instr_size, kObjectAlignment); | 1420 int body_size = RoundUp(desc.instr_size, kObjectAlignment); |
| 1421 int obj_size = Code::SizeFor(body_size); | 1421 int obj_size = Code::SizeFor(body_size); |
| 1422 | 1422 |
| 1423 Handle<Code> code = NewCodeRaw(obj_size, immovable); | 1423 Handle<Code> code = NewCodeRaw(obj_size, immovable); |
| 1424 ASSERT(isolate()->code_range() == NULL || | 1424 DCHECK(isolate()->code_range() == NULL || |
| 1425 !isolate()->code_range()->valid() || | 1425 !isolate()->code_range()->valid() || |
| 1426 isolate()->code_range()->contains(code->address())); | 1426 isolate()->code_range()->contains(code->address())); |
| 1427 | 1427 |
| 1428 // The code object has not been fully initialized yet. We rely on the | 1428 // The code object has not been fully initialized yet. We rely on the |
| 1429 // fact that no allocation will happen from this point on. | 1429 // fact that no allocation will happen from this point on. |
| 1430 DisallowHeapAllocation no_gc; | 1430 DisallowHeapAllocation no_gc; |
| 1431 code->set_gc_metadata(Smi::FromInt(0)); | 1431 code->set_gc_metadata(Smi::FromInt(0)); |
| 1432 code->set_ic_age(isolate()->heap()->global_ic_age()); | 1432 code->set_ic_age(isolate()->heap()->global_ic_age()); |
| 1433 code->set_instruction_size(desc.instr_size); | 1433 code->set_instruction_size(desc.instr_size); |
| 1434 code->set_relocation_info(*reloc_info); | 1434 code->set_relocation_info(*reloc_info); |
| 1435 code->set_flags(flags); | 1435 code->set_flags(flags); |
| 1436 code->set_raw_kind_specific_flags1(0); | 1436 code->set_raw_kind_specific_flags1(0); |
| 1437 code->set_raw_kind_specific_flags2(0); | 1437 code->set_raw_kind_specific_flags2(0); |
| 1438 code->set_is_crankshafted(crankshafted); | 1438 code->set_is_crankshafted(crankshafted); |
| 1439 code->set_deoptimization_data(*empty_fixed_array(), SKIP_WRITE_BARRIER); | 1439 code->set_deoptimization_data(*empty_fixed_array(), SKIP_WRITE_BARRIER); |
| 1440 code->set_raw_type_feedback_info(Smi::FromInt(0)); | 1440 code->set_raw_type_feedback_info(Smi::FromInt(0)); |
| 1441 code->set_next_code_link(*undefined_value()); | 1441 code->set_next_code_link(*undefined_value()); |
| 1442 code->set_handler_table(*empty_fixed_array(), SKIP_WRITE_BARRIER); | 1442 code->set_handler_table(*empty_fixed_array(), SKIP_WRITE_BARRIER); |
| 1443 code->set_prologue_offset(prologue_offset); | 1443 code->set_prologue_offset(prologue_offset); |
| 1444 if (code->kind() == Code::OPTIMIZED_FUNCTION) { | 1444 if (code->kind() == Code::OPTIMIZED_FUNCTION) { |
| 1445 code->set_marked_for_deoptimization(false); | 1445 code->set_marked_for_deoptimization(false); |
| 1446 } | 1446 } |
| 1447 | 1447 |
| 1448 if (is_debug) { | 1448 if (is_debug) { |
| 1449 ASSERT(code->kind() == Code::FUNCTION); | 1449 DCHECK(code->kind() == Code::FUNCTION); |
| 1450 code->set_has_debug_break_slots(true); | 1450 code->set_has_debug_break_slots(true); |
| 1451 } | 1451 } |
| 1452 | 1452 |
| 1453 desc.origin->PopulateConstantPool(*constant_pool); | 1453 desc.origin->PopulateConstantPool(*constant_pool); |
| 1454 code->set_constant_pool(*constant_pool); | 1454 code->set_constant_pool(*constant_pool); |
| 1455 | 1455 |
| 1456 // Allow self references to created code object by patching the handle to | 1456 // Allow self references to created code object by patching the handle to |
| 1457 // point to the newly allocated Code object. | 1457 // point to the newly allocated Code object. |
| 1458 if (!self_ref.is_null()) *(self_ref.location()) = *code; | 1458 if (!self_ref.is_null()) *(self_ref.location()) = *code; |
| 1459 | 1459 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1512 // Allocate the object based on the map. | 1512 // Allocate the object based on the map. |
| 1513 Handle<JSModule> module = | 1513 Handle<JSModule> module = |
| 1514 Handle<JSModule>::cast(NewJSObjectFromMap(map, TENURED)); | 1514 Handle<JSModule>::cast(NewJSObjectFromMap(map, TENURED)); |
| 1515 module->set_context(*context); | 1515 module->set_context(*context); |
| 1516 module->set_scope_info(*scope_info); | 1516 module->set_scope_info(*scope_info); |
| 1517 return module; | 1517 return module; |
| 1518 } | 1518 } |
| 1519 | 1519 |
| 1520 | 1520 |
| 1521 Handle<GlobalObject> Factory::NewGlobalObject(Handle<JSFunction> constructor) { | 1521 Handle<GlobalObject> Factory::NewGlobalObject(Handle<JSFunction> constructor) { |
| 1522 ASSERT(constructor->has_initial_map()); | 1522 DCHECK(constructor->has_initial_map()); |
| 1523 Handle<Map> map(constructor->initial_map()); | 1523 Handle<Map> map(constructor->initial_map()); |
| 1524 ASSERT(map->is_dictionary_map()); | 1524 DCHECK(map->is_dictionary_map()); |
| 1525 | 1525 |
| 1526 // Make sure no field properties are described in the initial map. | 1526 // Make sure no field properties are described in the initial map. |
| 1527 // This guarantees us that normalizing the properties does not | 1527 // This guarantees us that normalizing the properties does not |
| 1528 // require us to change property values to PropertyCells. | 1528 // require us to change property values to PropertyCells. |
| 1529 ASSERT(map->NextFreePropertyIndex() == 0); | 1529 DCHECK(map->NextFreePropertyIndex() == 0); |
| 1530 | 1530 |
| 1531 // Make sure we don't have a ton of pre-allocated slots in the | 1531 // Make sure we don't have a ton of pre-allocated slots in the |
| 1532 // global objects. They will be unused once we normalize the object. | 1532 // global objects. They will be unused once we normalize the object. |
| 1533 ASSERT(map->unused_property_fields() == 0); | 1533 DCHECK(map->unused_property_fields() == 0); |
| 1534 ASSERT(map->inobject_properties() == 0); | 1534 DCHECK(map->inobject_properties() == 0); |
| 1535 | 1535 |
| 1536 // Initial size of the backing store to avoid resize of the storage during | 1536 // Initial size of the backing store to avoid resize of the storage during |
| 1537 // bootstrapping. The size differs between the JS global object ad the | 1537 // bootstrapping. The size differs between the JS global object ad the |
| 1538 // builtins object. | 1538 // builtins object. |
| 1539 int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512; | 1539 int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512; |
| 1540 | 1540 |
| 1541 // Allocate a dictionary object for backing storage. | 1541 // Allocate a dictionary object for backing storage. |
| 1542 int at_least_space_for = map->NumberOfOwnDescriptors() * 2 + initial_size; | 1542 int at_least_space_for = map->NumberOfOwnDescriptors() * 2 + initial_size; |
| 1543 Handle<NameDictionary> dictionary = | 1543 Handle<NameDictionary> dictionary = |
| 1544 NameDictionary::New(isolate(), at_least_space_for); | 1544 NameDictionary::New(isolate(), at_least_space_for); |
| 1545 | 1545 |
| 1546 // The global object might be created from an object template with accessors. | 1546 // The global object might be created from an object template with accessors. |
| 1547 // Fill these accessors into the dictionary. | 1547 // Fill these accessors into the dictionary. |
| 1548 Handle<DescriptorArray> descs(map->instance_descriptors()); | 1548 Handle<DescriptorArray> descs(map->instance_descriptors()); |
| 1549 for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) { | 1549 for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) { |
| 1550 PropertyDetails details = descs->GetDetails(i); | 1550 PropertyDetails details = descs->GetDetails(i); |
| 1551 ASSERT(details.type() == CALLBACKS); // Only accessors are expected. | 1551 DCHECK(details.type() == CALLBACKS); // Only accessors are expected. |
| 1552 PropertyDetails d = PropertyDetails(details.attributes(), CALLBACKS, i + 1); | 1552 PropertyDetails d = PropertyDetails(details.attributes(), CALLBACKS, i + 1); |
| 1553 Handle<Name> name(descs->GetKey(i)); | 1553 Handle<Name> name(descs->GetKey(i)); |
| 1554 Handle<Object> value(descs->GetCallbacksObject(i), isolate()); | 1554 Handle<Object> value(descs->GetCallbacksObject(i), isolate()); |
| 1555 Handle<PropertyCell> cell = NewPropertyCell(value); | 1555 Handle<PropertyCell> cell = NewPropertyCell(value); |
| 1556 // |dictionary| already contains enough space for all properties. | 1556 // |dictionary| already contains enough space for all properties. |
| 1557 USE(NameDictionary::Add(dictionary, name, cell, d)); | 1557 USE(NameDictionary::Add(dictionary, name, cell, d)); |
| 1558 } | 1558 } |
| 1559 | 1559 |
| 1560 // Allocate the global object and initialize it with the backing store. | 1560 // Allocate the global object and initialize it with the backing store. |
| 1561 Handle<GlobalObject> global = New<GlobalObject>(map, OLD_POINTER_SPACE); | 1561 Handle<GlobalObject> global = New<GlobalObject>(map, OLD_POINTER_SPACE); |
| 1562 isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map); | 1562 isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map); |
| 1563 | 1563 |
| 1564 // Create a new map for the global object. | 1564 // Create a new map for the global object. |
| 1565 Handle<Map> new_map = Map::CopyDropDescriptors(map); | 1565 Handle<Map> new_map = Map::CopyDropDescriptors(map); |
| 1566 new_map->set_dictionary_map(true); | 1566 new_map->set_dictionary_map(true); |
| 1567 | 1567 |
| 1568 // Set up the global object as a normalized object. | 1568 // Set up the global object as a normalized object. |
| 1569 global->set_map(*new_map); | 1569 global->set_map(*new_map); |
| 1570 global->set_properties(*dictionary); | 1570 global->set_properties(*dictionary); |
| 1571 | 1571 |
| 1572 // Make sure result is a global object with properties in dictionary. | 1572 // Make sure result is a global object with properties in dictionary. |
| 1573 ASSERT(global->IsGlobalObject() && !global->HasFastProperties()); | 1573 DCHECK(global->IsGlobalObject() && !global->HasFastProperties()); |
| 1574 return global; | 1574 return global; |
| 1575 } | 1575 } |
| 1576 | 1576 |
| 1577 | 1577 |
| 1578 Handle<JSObject> Factory::NewJSObjectFromMap( | 1578 Handle<JSObject> Factory::NewJSObjectFromMap( |
| 1579 Handle<Map> map, | 1579 Handle<Map> map, |
| 1580 PretenureFlag pretenure, | 1580 PretenureFlag pretenure, |
| 1581 bool alloc_props, | 1581 bool alloc_props, |
| 1582 Handle<AllocationSite> allocation_site) { | 1582 Handle<AllocationSite> allocation_site) { |
| 1583 CALL_HEAP_FUNCTION( | 1583 CALL_HEAP_FUNCTION( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1610 Handle<JSArray> array = NewJSArray(elements_kind, pretenure); | 1610 Handle<JSArray> array = NewJSArray(elements_kind, pretenure); |
| 1611 NewJSArrayStorage(array, length, capacity, mode); | 1611 NewJSArrayStorage(array, length, capacity, mode); |
| 1612 return array; | 1612 return array; |
| 1613 } | 1613 } |
| 1614 | 1614 |
| 1615 | 1615 |
| 1616 Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements, | 1616 Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements, |
| 1617 ElementsKind elements_kind, | 1617 ElementsKind elements_kind, |
| 1618 int length, | 1618 int length, |
| 1619 PretenureFlag pretenure) { | 1619 PretenureFlag pretenure) { |
| 1620 ASSERT(length <= elements->length()); | 1620 DCHECK(length <= elements->length()); |
| 1621 Handle<JSArray> array = NewJSArray(elements_kind, pretenure); | 1621 Handle<JSArray> array = NewJSArray(elements_kind, pretenure); |
| 1622 | 1622 |
| 1623 array->set_elements(*elements); | 1623 array->set_elements(*elements); |
| 1624 array->set_length(Smi::FromInt(length)); | 1624 array->set_length(Smi::FromInt(length)); |
| 1625 JSObject::ValidateElements(array); | 1625 JSObject::ValidateElements(array); |
| 1626 return array; | 1626 return array; |
| 1627 } | 1627 } |
| 1628 | 1628 |
| 1629 | 1629 |
| 1630 void Factory::NewJSArrayStorage(Handle<JSArray> array, | 1630 void Factory::NewJSArrayStorage(Handle<JSArray> array, |
| 1631 int length, | 1631 int length, |
| 1632 int capacity, | 1632 int capacity, |
| 1633 ArrayStorageAllocationMode mode) { | 1633 ArrayStorageAllocationMode mode) { |
| 1634 ASSERT(capacity >= length); | 1634 DCHECK(capacity >= length); |
| 1635 | 1635 |
| 1636 if (capacity == 0) { | 1636 if (capacity == 0) { |
| 1637 array->set_length(Smi::FromInt(0)); | 1637 array->set_length(Smi::FromInt(0)); |
| 1638 array->set_elements(*empty_fixed_array()); | 1638 array->set_elements(*empty_fixed_array()); |
| 1639 return; | 1639 return; |
| 1640 } | 1640 } |
| 1641 | 1641 |
| 1642 Handle<FixedArrayBase> elms; | 1642 Handle<FixedArrayBase> elms; |
| 1643 ElementsKind elements_kind = array->GetElementsKind(); | 1643 ElementsKind elements_kind = array->GetElementsKind(); |
| 1644 if (IsFastDoubleElementsKind(elements_kind)) { | 1644 if (IsFastDoubleElementsKind(elements_kind)) { |
| 1645 if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { | 1645 if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { |
| 1646 elms = NewFixedDoubleArray(capacity); | 1646 elms = NewFixedDoubleArray(capacity); |
| 1647 } else { | 1647 } else { |
| 1648 ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); | 1648 DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
| 1649 elms = NewFixedDoubleArrayWithHoles(capacity); | 1649 elms = NewFixedDoubleArrayWithHoles(capacity); |
| 1650 } | 1650 } |
| 1651 } else { | 1651 } else { |
| 1652 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind)); | 1652 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind)); |
| 1653 if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { | 1653 if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { |
| 1654 elms = NewUninitializedFixedArray(capacity); | 1654 elms = NewUninitializedFixedArray(capacity); |
| 1655 } else { | 1655 } else { |
| 1656 ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); | 1656 DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
| 1657 elms = NewFixedArrayWithHoles(capacity); | 1657 elms = NewFixedArrayWithHoles(capacity); |
| 1658 } | 1658 } |
| 1659 } | 1659 } |
| 1660 | 1660 |
| 1661 array->set_elements(*elms); | 1661 array->set_elements(*elms); |
| 1662 array->set_length(Smi::FromInt(length)); | 1662 array->set_length(Smi::FromInt(length)); |
| 1663 } | 1663 } |
| 1664 | 1664 |
| 1665 | 1665 |
| 1666 Handle<JSGeneratorObject> Factory::NewJSGeneratorObject( | 1666 Handle<JSGeneratorObject> Factory::NewJSGeneratorObject( |
| 1667 Handle<JSFunction> function) { | 1667 Handle<JSFunction> function) { |
| 1668 ASSERT(function->shared()->is_generator()); | 1668 DCHECK(function->shared()->is_generator()); |
| 1669 JSFunction::EnsureHasInitialMap(function); | 1669 JSFunction::EnsureHasInitialMap(function); |
| 1670 Handle<Map> map(function->initial_map()); | 1670 Handle<Map> map(function->initial_map()); |
| 1671 ASSERT(map->instance_type() == JS_GENERATOR_OBJECT_TYPE); | 1671 DCHECK(map->instance_type() == JS_GENERATOR_OBJECT_TYPE); |
| 1672 CALL_HEAP_FUNCTION( | 1672 CALL_HEAP_FUNCTION( |
| 1673 isolate(), | 1673 isolate(), |
| 1674 isolate()->heap()->AllocateJSObjectFromMap(*map), | 1674 isolate()->heap()->AllocateJSObjectFromMap(*map), |
| 1675 JSGeneratorObject); | 1675 JSGeneratorObject); |
| 1676 } | 1676 } |
| 1677 | 1677 |
| 1678 | 1678 |
| 1679 Handle<JSArrayBuffer> Factory::NewJSArrayBuffer() { | 1679 Handle<JSArrayBuffer> Factory::NewJSArrayBuffer() { |
| 1680 Handle<JSFunction> array_buffer_fun( | 1680 Handle<JSFunction> array_buffer_fun( |
| 1681 isolate()->native_context()->array_buffer_fun()); | 1681 isolate()->native_context()->array_buffer_fun()); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1758 result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER); | 1758 result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER); |
| 1759 result->set_call_trap(*call_trap); | 1759 result->set_call_trap(*call_trap); |
| 1760 result->set_construct_trap(*construct_trap); | 1760 result->set_construct_trap(*construct_trap); |
| 1761 return result; | 1761 return result; |
| 1762 } | 1762 } |
| 1763 | 1763 |
| 1764 | 1764 |
| 1765 void Factory::ReinitializeJSReceiver(Handle<JSReceiver> object, | 1765 void Factory::ReinitializeJSReceiver(Handle<JSReceiver> object, |
| 1766 InstanceType type, | 1766 InstanceType type, |
| 1767 int size) { | 1767 int size) { |
| 1768 ASSERT(type >= FIRST_JS_OBJECT_TYPE); | 1768 DCHECK(type >= FIRST_JS_OBJECT_TYPE); |
| 1769 | 1769 |
| 1770 // Allocate fresh map. | 1770 // Allocate fresh map. |
| 1771 // TODO(rossberg): Once we optimize proxies, cache these maps. | 1771 // TODO(rossberg): Once we optimize proxies, cache these maps. |
| 1772 Handle<Map> map = NewMap(type, size); | 1772 Handle<Map> map = NewMap(type, size); |
| 1773 | 1773 |
| 1774 // Check that the receiver has at least the size of the fresh object. | 1774 // Check that the receiver has at least the size of the fresh object. |
| 1775 int size_difference = object->map()->instance_size() - map->instance_size(); | 1775 int size_difference = object->map()->instance_size() - map->instance_size(); |
| 1776 ASSERT(size_difference >= 0); | 1776 DCHECK(size_difference >= 0); |
| 1777 | 1777 |
| 1778 map->set_prototype(object->map()->prototype()); | 1778 map->set_prototype(object->map()->prototype()); |
| 1779 | 1779 |
| 1780 // Allocate the backing storage for the properties. | 1780 // Allocate the backing storage for the properties. |
| 1781 int prop_size = map->InitialPropertiesLength(); | 1781 int prop_size = map->InitialPropertiesLength(); |
| 1782 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); | 1782 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); |
| 1783 | 1783 |
| 1784 Heap* heap = isolate()->heap(); | 1784 Heap* heap = isolate()->heap(); |
| 1785 MaybeHandle<SharedFunctionInfo> shared; | 1785 MaybeHandle<SharedFunctionInfo> shared; |
| 1786 if (type == JS_FUNCTION_TYPE) { | 1786 if (type == JS_FUNCTION_TYPE) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1813 map->set_function_with_prototype(true); | 1813 map->set_function_with_prototype(true); |
| 1814 Handle<JSFunction> js_function = Handle<JSFunction>::cast(object); | 1814 Handle<JSFunction> js_function = Handle<JSFunction>::cast(object); |
| 1815 Handle<Context> context(isolate()->native_context()); | 1815 Handle<Context> context(isolate()->native_context()); |
| 1816 InitializeFunction(js_function, shared.ToHandleChecked(), context); | 1816 InitializeFunction(js_function, shared.ToHandleChecked(), context); |
| 1817 } | 1817 } |
| 1818 } | 1818 } |
| 1819 | 1819 |
| 1820 | 1820 |
| 1821 void Factory::ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> object, | 1821 void Factory::ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> object, |
| 1822 Handle<JSFunction> constructor) { | 1822 Handle<JSFunction> constructor) { |
| 1823 ASSERT(constructor->has_initial_map()); | 1823 DCHECK(constructor->has_initial_map()); |
| 1824 Handle<Map> map(constructor->initial_map(), isolate()); | 1824 Handle<Map> map(constructor->initial_map(), isolate()); |
| 1825 | 1825 |
| 1826 // The proxy's hash should be retained across reinitialization. | 1826 // The proxy's hash should be retained across reinitialization. |
| 1827 Handle<Object> hash(object->hash(), isolate()); | 1827 Handle<Object> hash(object->hash(), isolate()); |
| 1828 | 1828 |
| 1829 // Check that the already allocated object has the same size and type as | 1829 // Check that the already allocated object has the same size and type as |
| 1830 // objects allocated using the constructor. | 1830 // objects allocated using the constructor. |
| 1831 ASSERT(map->instance_size() == object->map()->instance_size()); | 1831 DCHECK(map->instance_size() == object->map()->instance_size()); |
| 1832 ASSERT(map->instance_type() == object->map()->instance_type()); | 1832 DCHECK(map->instance_type() == object->map()->instance_type()); |
| 1833 | 1833 |
| 1834 // Allocate the backing storage for the properties. | 1834 // Allocate the backing storage for the properties. |
| 1835 int prop_size = map->InitialPropertiesLength(); | 1835 int prop_size = map->InitialPropertiesLength(); |
| 1836 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); | 1836 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); |
| 1837 | 1837 |
| 1838 // In order to keep heap in consistent state there must be no allocations | 1838 // In order to keep heap in consistent state there must be no allocations |
| 1839 // before object re-initialization is finished. | 1839 // before object re-initialization is finished. |
| 1840 DisallowHeapAllocation no_allocation; | 1840 DisallowHeapAllocation no_allocation; |
| 1841 | 1841 |
| 1842 // Reset the map for the object. | 1842 // Reset the map for the object. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1856 } | 1856 } |
| 1857 | 1857 |
| 1858 | 1858 |
| 1859 void Factory::BecomeJSFunction(Handle<JSReceiver> object) { | 1859 void Factory::BecomeJSFunction(Handle<JSReceiver> object) { |
| 1860 ReinitializeJSReceiver(object, JS_FUNCTION_TYPE, JSFunction::kSize); | 1860 ReinitializeJSReceiver(object, JS_FUNCTION_TYPE, JSFunction::kSize); |
| 1861 } | 1861 } |
| 1862 | 1862 |
| 1863 | 1863 |
| 1864 Handle<FixedArray> Factory::NewTypeFeedbackVector(int slot_count) { | 1864 Handle<FixedArray> Factory::NewTypeFeedbackVector(int slot_count) { |
| 1865 // Ensure we can skip the write barrier | 1865 // Ensure we can skip the write barrier |
| 1866 ASSERT_EQ(isolate()->heap()->uninitialized_symbol(), | 1866 DCHECK_EQ(isolate()->heap()->uninitialized_symbol(), |
| 1867 *TypeFeedbackInfo::UninitializedSentinel(isolate())); | 1867 *TypeFeedbackInfo::UninitializedSentinel(isolate())); |
| 1868 | 1868 |
| 1869 CALL_HEAP_FUNCTION( | 1869 CALL_HEAP_FUNCTION( |
| 1870 isolate(), | 1870 isolate(), |
| 1871 isolate()->heap()->AllocateFixedArrayWithFiller( | 1871 isolate()->heap()->AllocateFixedArrayWithFiller( |
| 1872 slot_count, | 1872 slot_count, |
| 1873 TENURED, | 1873 TENURED, |
| 1874 *TypeFeedbackInfo::UninitializedSentinel(isolate())), | 1874 *TypeFeedbackInfo::UninitializedSentinel(isolate())), |
| 1875 FixedArray); | 1875 FixedArray); |
| 1876 } | 1876 } |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1997 Handle<String> string) { | 1997 Handle<String> string) { |
| 1998 int hash = NumberCacheHash(number_string_cache(), number); | 1998 int hash = NumberCacheHash(number_string_cache(), number); |
| 1999 if (number_string_cache()->get(hash * 2) != *undefined_value()) { | 1999 if (number_string_cache()->get(hash * 2) != *undefined_value()) { |
| 2000 int full_size = isolate()->heap()->FullSizeNumberStringCacheLength(); | 2000 int full_size = isolate()->heap()->FullSizeNumberStringCacheLength(); |
| 2001 if (number_string_cache()->length() != full_size) { | 2001 if (number_string_cache()->length() != full_size) { |
| 2002 // The first time we have a hash collision, we move to the full sized | 2002 // The first time we have a hash collision, we move to the full sized |
| 2003 // number string cache. The idea is to have a small number string | 2003 // number string cache. The idea is to have a small number string |
| 2004 // cache in the snapshot to keep boot-time memory usage down. | 2004 // cache in the snapshot to keep boot-time memory usage down. |
| 2005 // If we expand the number string cache already while creating | 2005 // If we expand the number string cache already while creating |
| 2006 // the snapshot then that didn't work out. | 2006 // the snapshot then that didn't work out. |
| 2007 ASSERT(!isolate()->serializer_enabled() || FLAG_extra_code != NULL); | 2007 DCHECK(!isolate()->serializer_enabled() || FLAG_extra_code != NULL); |
| 2008 Handle<FixedArray> new_cache = NewFixedArray(full_size, TENURED); | 2008 Handle<FixedArray> new_cache = NewFixedArray(full_size, TENURED); |
| 2009 isolate()->heap()->set_number_string_cache(*new_cache); | 2009 isolate()->heap()->set_number_string_cache(*new_cache); |
| 2010 return; | 2010 return; |
| 2011 } | 2011 } |
| 2012 } | 2012 } |
| 2013 number_string_cache()->set(hash * 2, *number); | 2013 number_string_cache()->set(hash * 2, *number); |
| 2014 number_string_cache()->set(hash * 2 + 1, *string); | 2014 number_string_cache()->set(hash * 2 + 1, *string); |
| 2015 } | 2015 } |
| 2016 | 2016 |
| 2017 | 2017 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 | 2074 |
| 2075 | 2075 |
| 2076 Handle<JSObject> Factory::NewArgumentsObject(Handle<JSFunction> callee, | 2076 Handle<JSObject> Factory::NewArgumentsObject(Handle<JSFunction> callee, |
| 2077 int length) { | 2077 int length) { |
| 2078 bool strict_mode_callee = callee->shared()->strict_mode() == STRICT; | 2078 bool strict_mode_callee = callee->shared()->strict_mode() == STRICT; |
| 2079 Handle<Map> map = strict_mode_callee ? isolate()->strict_arguments_map() | 2079 Handle<Map> map = strict_mode_callee ? isolate()->strict_arguments_map() |
| 2080 : isolate()->sloppy_arguments_map(); | 2080 : isolate()->sloppy_arguments_map(); |
| 2081 | 2081 |
| 2082 AllocationSiteUsageContext context(isolate(), Handle<AllocationSite>(), | 2082 AllocationSiteUsageContext context(isolate(), Handle<AllocationSite>(), |
| 2083 false); | 2083 false); |
| 2084 ASSERT(!isolate()->has_pending_exception()); | 2084 DCHECK(!isolate()->has_pending_exception()); |
| 2085 Handle<JSObject> result = NewJSObjectFromMap(map); | 2085 Handle<JSObject> result = NewJSObjectFromMap(map); |
| 2086 Handle<Smi> value(Smi::FromInt(length), isolate()); | 2086 Handle<Smi> value(Smi::FromInt(length), isolate()); |
| 2087 Object::SetProperty(result, length_string(), value, STRICT).Assert(); | 2087 Object::SetProperty(result, length_string(), value, STRICT).Assert(); |
| 2088 if (!strict_mode_callee) { | 2088 if (!strict_mode_callee) { |
| 2089 Object::SetProperty(result, callee_string(), callee, STRICT).Assert(); | 2089 Object::SetProperty(result, callee_string(), callee, STRICT).Assert(); |
| 2090 } | 2090 } |
| 2091 return result; | 2091 return result; |
| 2092 } | 2092 } |
| 2093 | 2093 |
| 2094 | 2094 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2143 Handle<Object> class_name(obj->class_name(), isolate()); | 2143 Handle<Object> class_name(obj->class_name(), isolate()); |
| 2144 if (class_name->IsString()) { | 2144 if (class_name->IsString()) { |
| 2145 result->shared()->set_instance_class_name(*class_name); | 2145 result->shared()->set_instance_class_name(*class_name); |
| 2146 result->shared()->set_name(*class_name); | 2146 result->shared()->set_name(*class_name); |
| 2147 } | 2147 } |
| 2148 result->shared()->set_function_data(*obj); | 2148 result->shared()->set_function_data(*obj); |
| 2149 result->shared()->set_construct_stub(*construct_stub); | 2149 result->shared()->set_construct_stub(*construct_stub); |
| 2150 result->shared()->DontAdaptArguments(); | 2150 result->shared()->DontAdaptArguments(); |
| 2151 | 2151 |
| 2152 if (obj->remove_prototype()) { | 2152 if (obj->remove_prototype()) { |
| 2153 ASSERT(result->shared()->IsApiFunction()); | 2153 DCHECK(result->shared()->IsApiFunction()); |
| 2154 ASSERT(!result->has_initial_map()); | 2154 DCHECK(!result->has_initial_map()); |
| 2155 ASSERT(!result->has_prototype()); | 2155 DCHECK(!result->has_prototype()); |
| 2156 return result; | 2156 return result; |
| 2157 } | 2157 } |
| 2158 | 2158 |
| 2159 if (prototype->IsTheHole()) { | 2159 if (prototype->IsTheHole()) { |
| 2160 #ifdef DEBUG | 2160 #ifdef DEBUG |
| 2161 LookupIterator it(handle(JSObject::cast(result->prototype())), | 2161 LookupIterator it(handle(JSObject::cast(result->prototype())), |
| 2162 constructor_string(), | 2162 constructor_string(), |
| 2163 LookupIterator::CHECK_OWN_REAL); | 2163 LookupIterator::CHECK_OWN_REAL); |
| 2164 MaybeHandle<Object> maybe_prop = Object::GetProperty(&it); | 2164 MaybeHandle<Object> maybe_prop = Object::GetProperty(&it); |
| 2165 ASSERT(it.IsFound()); | 2165 DCHECK(it.IsFound()); |
| 2166 ASSERT(maybe_prop.ToHandleChecked().is_identical_to(result)); | 2166 DCHECK(maybe_prop.ToHandleChecked().is_identical_to(result)); |
| 2167 #endif | 2167 #endif |
| 2168 } else { | 2168 } else { |
| 2169 JSObject::AddProperty(handle(JSObject::cast(result->prototype())), | 2169 JSObject::AddProperty(handle(JSObject::cast(result->prototype())), |
| 2170 constructor_string(), result, DONT_ENUM); | 2170 constructor_string(), result, DONT_ENUM); |
| 2171 } | 2171 } |
| 2172 | 2172 |
| 2173 // Down from here is only valid for API functions that can be used as a | 2173 // Down from here is only valid for API functions that can be used as a |
| 2174 // constructor (don't set the "remove prototype" flag). | 2174 // constructor (don't set the "remove prototype" flag). |
| 2175 | 2175 |
| 2176 Handle<Map> map(result->initial_map()); | 2176 Handle<Map> map(result->initial_map()); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2265 if (parent->IsUndefined()) break; | 2265 if (parent->IsUndefined()) break; |
| 2266 obj = Handle<FunctionTemplateInfo>::cast(parent); | 2266 obj = Handle<FunctionTemplateInfo>::cast(parent); |
| 2267 } | 2267 } |
| 2268 | 2268 |
| 2269 // Install accumulated static accessors | 2269 // Install accumulated static accessors |
| 2270 for (int i = 0; i < valid_descriptors; i++) { | 2270 for (int i = 0; i < valid_descriptors; i++) { |
| 2271 Handle<AccessorInfo> accessor(AccessorInfo::cast(array->get(i))); | 2271 Handle<AccessorInfo> accessor(AccessorInfo::cast(array->get(i))); |
| 2272 JSObject::SetAccessor(result, accessor).Assert(); | 2272 JSObject::SetAccessor(result, accessor).Assert(); |
| 2273 } | 2273 } |
| 2274 | 2274 |
| 2275 ASSERT(result->shared()->IsApiFunction()); | 2275 DCHECK(result->shared()->IsApiFunction()); |
| 2276 return result; | 2276 return result; |
| 2277 } | 2277 } |
| 2278 | 2278 |
| 2279 | 2279 |
| 2280 Handle<MapCache> Factory::AddToMapCache(Handle<Context> context, | 2280 Handle<MapCache> Factory::AddToMapCache(Handle<Context> context, |
| 2281 Handle<FixedArray> keys, | 2281 Handle<FixedArray> keys, |
| 2282 Handle<Map> map) { | 2282 Handle<Map> map) { |
| 2283 Handle<MapCache> map_cache = handle(MapCache::cast(context->map_cache())); | 2283 Handle<MapCache> map_cache = handle(MapCache::cast(context->map_cache())); |
| 2284 Handle<MapCache> result = MapCache::Put(map_cache, keys, map); | 2284 Handle<MapCache> result = MapCache::Put(map_cache, keys, map); |
| 2285 context->set_map_cache(*result); | 2285 context->set_map_cache(*result); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2365 return Handle<Object>::null(); | 2365 return Handle<Object>::null(); |
| 2366 } | 2366 } |
| 2367 | 2367 |
| 2368 | 2368 |
| 2369 Handle<Object> Factory::ToBoolean(bool value) { | 2369 Handle<Object> Factory::ToBoolean(bool value) { |
| 2370 return value ? true_value() : false_value(); | 2370 return value ? true_value() : false_value(); |
| 2371 } | 2371 } |
| 2372 | 2372 |
| 2373 | 2373 |
| 2374 } } // namespace v8::internal | 2374 } } // namespace v8::internal |
| OLD | NEW |