| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2849 } | 2849 } |
| 2850 | 2850 |
| 2851 #define ALLOCATE_VARSIZE_MAP(instance_type, field_name) \ | 2851 #define ALLOCATE_VARSIZE_MAP(instance_type, field_name) \ |
| 2852 ALLOCATE_MAP(instance_type, kVariableSizeSentinel, field_name) | 2852 ALLOCATE_MAP(instance_type, kVariableSizeSentinel, field_name) |
| 2853 | 2853 |
| 2854 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, fixed_cow_array) | 2854 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, fixed_cow_array) |
| 2855 ASSERT(fixed_array_map() != fixed_cow_array_map()); | 2855 ASSERT(fixed_array_map() != fixed_cow_array_map()); |
| 2856 | 2856 |
| 2857 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, scope_info) | 2857 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, scope_info) |
| 2858 ALLOCATE_MAP(HEAP_NUMBER_TYPE, HeapNumber::kSize, heap_number) | 2858 ALLOCATE_MAP(HEAP_NUMBER_TYPE, HeapNumber::kSize, heap_number) |
| 2859 ALLOCATE_MAP( |
| 2860 MUTABLE_HEAP_NUMBER_TYPE, HeapNumber::kSize, mutable_heap_number) |
| 2859 ALLOCATE_MAP(SYMBOL_TYPE, Symbol::kSize, symbol) | 2861 ALLOCATE_MAP(SYMBOL_TYPE, Symbol::kSize, symbol) |
| 2860 ALLOCATE_MAP(FOREIGN_TYPE, Foreign::kSize, foreign) | 2862 ALLOCATE_MAP(FOREIGN_TYPE, Foreign::kSize, foreign) |
| 2861 | 2863 |
| 2862 for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { | 2864 for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { |
| 2863 const StringTypeTable& entry = string_type_table[i]; | 2865 const StringTypeTable& entry = string_type_table[i]; |
| 2864 { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); | 2866 { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
| 2865 if (!maybe_obj->ToObject(&obj)) return false; | 2867 if (!maybe_obj->ToObject(&obj)) return false; |
| 2866 } | 2868 } |
| 2867 roots_[entry.index] = Map::cast(obj); | 2869 roots_[entry.index] = Map::cast(obj); |
| 2868 } | 2870 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2959 } | 2961 } |
| 2960 | 2962 |
| 2961 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY) | 2963 TYPED_ARRAYS(ALLOCATE_EMPTY_FIXED_TYPED_ARRAY) |
| 2962 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY | 2964 #undef ALLOCATE_EMPTY_FIXED_TYPED_ARRAY |
| 2963 } | 2965 } |
| 2964 ASSERT(!InNewSpace(empty_fixed_array())); | 2966 ASSERT(!InNewSpace(empty_fixed_array())); |
| 2965 return true; | 2967 return true; |
| 2966 } | 2968 } |
| 2967 | 2969 |
| 2968 | 2970 |
| 2969 MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { | 2971 MaybeObject* Heap::AllocateHeapNumber(double value, |
| 2972 MutableMode mode, |
| 2973 PretenureFlag pretenure) { |
| 2970 // Statically ensure that it is safe to allocate heap numbers in paged | 2974 // Statically ensure that it is safe to allocate heap numbers in paged |
| 2971 // spaces. | 2975 // spaces. |
| 2972 int size = HeapNumber::kSize; | 2976 int size = HeapNumber::kSize; |
| 2973 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); | 2977 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); |
| 2974 | 2978 |
| 2975 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); | 2979 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
| 2976 | 2980 |
| 2977 Object* result; | 2981 Object* result; |
| 2978 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2982 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 2979 if (!maybe_result->ToObject(&result)) return maybe_result; | 2983 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 2980 } | 2984 } |
| 2981 | 2985 |
| 2982 HeapObject::cast(result)->set_map_no_write_barrier(heap_number_map()); | 2986 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); |
| 2987 HeapObject::cast(result)->set_map_no_write_barrier(map); |
| 2983 HeapNumber::cast(result)->set_value(value); | 2988 HeapNumber::cast(result)->set_value(value); |
| 2984 return result; | 2989 return result; |
| 2985 } | 2990 } |
| 2986 | 2991 |
| 2987 | 2992 |
| 2988 MaybeObject* Heap::AllocateCell(Object* value) { | 2993 MaybeObject* Heap::AllocateCell(Object* value) { |
| 2989 int size = Cell::kSize; | 2994 int size = Cell::kSize; |
| 2990 STATIC_ASSERT(Cell::kSize <= Page::kMaxRegularHeapObjectSize); | 2995 STATIC_ASSERT(Cell::kSize <= Page::kMaxRegularHeapObjectSize); |
| 2991 | 2996 |
| 2992 Object* result; | 2997 Object* result; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3121 // To workaround the problem, make separate functions without inlining. | 3126 // To workaround the problem, make separate functions without inlining. |
| 3122 Heap::CreateJSEntryStub(); | 3127 Heap::CreateJSEntryStub(); |
| 3123 Heap::CreateJSConstructEntryStub(); | 3128 Heap::CreateJSConstructEntryStub(); |
| 3124 } | 3129 } |
| 3125 | 3130 |
| 3126 | 3131 |
| 3127 bool Heap::CreateInitialObjects() { | 3132 bool Heap::CreateInitialObjects() { |
| 3128 Object* obj; | 3133 Object* obj; |
| 3129 | 3134 |
| 3130 // The -0 value must be set before NumberFromDouble works. | 3135 // The -0 value must be set before NumberFromDouble works. |
| 3131 { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, TENURED); | 3136 { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, IMMUTABLE, TENURED); |
| 3132 if (!maybe_obj->ToObject(&obj)) return false; | 3137 if (!maybe_obj->ToObject(&obj)) return false; |
| 3133 } | 3138 } |
| 3134 set_minus_zero_value(HeapNumber::cast(obj)); | 3139 set_minus_zero_value(HeapNumber::cast(obj)); |
| 3135 ASSERT(std::signbit(minus_zero_value()->Number()) != 0); | 3140 ASSERT(std::signbit(minus_zero_value()->Number()) != 0); |
| 3136 | 3141 |
| 3137 { MaybeObject* maybe_obj = AllocateHeapNumber(OS::nan_value(), TENURED); | 3142 { MaybeObject* maybe_obj = AllocateHeapNumber( |
| 3143 OS::nan_value(), IMMUTABLE, TENURED); |
| 3138 if (!maybe_obj->ToObject(&obj)) return false; | 3144 if (!maybe_obj->ToObject(&obj)) return false; |
| 3139 } | 3145 } |
| 3140 set_nan_value(HeapNumber::cast(obj)); | 3146 set_nan_value(HeapNumber::cast(obj)); |
| 3141 | 3147 |
| 3142 { MaybeObject* maybe_obj = AllocateHeapNumber(V8_INFINITY, TENURED); | 3148 { MaybeObject* maybe_obj = AllocateHeapNumber( |
| 3149 V8_INFINITY, IMMUTABLE, TENURED); |
| 3143 if (!maybe_obj->ToObject(&obj)) return false; | 3150 if (!maybe_obj->ToObject(&obj)) return false; |
| 3144 } | 3151 } |
| 3145 set_infinity_value(HeapNumber::cast(obj)); | 3152 set_infinity_value(HeapNumber::cast(obj)); |
| 3146 | 3153 |
| 3147 // The hole has not been created yet, but we want to put something | 3154 // The hole has not been created yet, but we want to put something |
| 3148 // predictable in the gaps in the string table, so lets make that Smi zero. | 3155 // predictable in the gaps in the string table, so lets make that Smi zero. |
| 3149 set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0))); | 3156 set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0))); |
| 3150 | 3157 |
| 3151 // Allocate initial string table. | 3158 // Allocate initial string table. |
| 3152 { MaybeObject* maybe_obj = | 3159 { MaybeObject* maybe_obj = |
| (...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3814 return FixedTypedArrayBase::cast( | 3821 return FixedTypedArrayBase::cast( |
| 3815 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]); | 3822 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]); |
| 3816 } | 3823 } |
| 3817 | 3824 |
| 3818 | 3825 |
| 3819 MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { | 3826 MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { |
| 3820 // We need to distinguish the minus zero value and this cannot be | 3827 // We need to distinguish the minus zero value and this cannot be |
| 3821 // done after conversion to int. Doing this by comparing bit | 3828 // done after conversion to int. Doing this by comparing bit |
| 3822 // patterns is faster than using fpclassify() et al. | 3829 // patterns is faster than using fpclassify() et al. |
| 3823 if (IsMinusZero(value)) { | 3830 if (IsMinusZero(value)) { |
| 3824 return AllocateHeapNumber(-0.0, pretenure); | 3831 return AllocateHeapNumber(-0.0, IMMUTABLE, pretenure); |
| 3825 } | 3832 } |
| 3826 | 3833 |
| 3827 int int_value = FastD2I(value); | 3834 int int_value = FastD2I(value); |
| 3828 if (value == int_value && Smi::IsValid(int_value)) { | 3835 if (value == int_value && Smi::IsValid(int_value)) { |
| 3829 return Smi::FromInt(int_value); | 3836 return Smi::FromInt(int_value); |
| 3830 } | 3837 } |
| 3831 | 3838 |
| 3832 // Materialize the value in the heap. | 3839 // Materialize the value in the heap. |
| 3833 return AllocateHeapNumber(value, pretenure); | 3840 return AllocateHeapNumber(value, IMMUTABLE, pretenure); |
| 3834 } | 3841 } |
| 3835 | 3842 |
| 3836 | 3843 |
| 3837 MaybeObject* Heap::AllocateForeign(Address address, PretenureFlag pretenure) { | 3844 MaybeObject* Heap::AllocateForeign(Address address, PretenureFlag pretenure) { |
| 3838 // Statically ensure that it is safe to allocate foreigns in paged spaces. | 3845 // Statically ensure that it is safe to allocate foreigns in paged spaces. |
| 3839 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); | 3846 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); |
| 3840 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 3847 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 3841 Foreign* result; | 3848 Foreign* result; |
| 3842 MaybeObject* maybe_result = Allocate(foreign_map(), space); | 3849 MaybeObject* maybe_result = Allocate(foreign_map(), space); |
| 3843 if (!maybe_result->To(&result)) return maybe_result; | 3850 if (!maybe_result->To(&result)) return maybe_result; |
| (...skipping 4023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7867 static_cast<int>(object_sizes_last_time_[index])); | 7874 static_cast<int>(object_sizes_last_time_[index])); |
| 7868 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 7875 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 7869 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 7876 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 7870 | 7877 |
| 7871 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 7878 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 7872 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 7879 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 7873 ClearObjectStats(); | 7880 ClearObjectStats(); |
| 7874 } | 7881 } |
| 7875 | 7882 |
| 7876 } } // namespace v8::internal | 7883 } } // namespace v8::internal |
| OLD | NEW |