| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 6374433bbd9e407fe6ebd11a8318b4c8ed5d905d..9c374f1c5841c618677135c4859a70aa6d32bee7 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -2856,6 +2856,8 @@ bool Heap::CreateInitialMaps() {
|
|
|
| ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, scope_info)
|
| ALLOCATE_MAP(HEAP_NUMBER_TYPE, HeapNumber::kSize, heap_number)
|
| + ALLOCATE_MAP(
|
| + MUTABLE_HEAP_NUMBER_TYPE, HeapNumber::kSize, mutable_heap_number)
|
| ALLOCATE_MAP(SYMBOL_TYPE, Symbol::kSize, symbol)
|
| ALLOCATE_MAP(FOREIGN_TYPE, Foreign::kSize, foreign)
|
|
|
| @@ -2966,7 +2968,9 @@ bool Heap::CreateInitialMaps() {
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) {
|
| +MaybeObject* Heap::AllocateHeapNumber(double value,
|
| + MutableMode mode,
|
| + PretenureFlag pretenure) {
|
| // Statically ensure that it is safe to allocate heap numbers in paged
|
| // spaces.
|
| int size = HeapNumber::kSize;
|
| @@ -2979,7 +2983,8 @@ MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) {
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| }
|
|
|
| - HeapObject::cast(result)->set_map_no_write_barrier(heap_number_map());
|
| + Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map();
|
| + HeapObject::cast(result)->set_map_no_write_barrier(map);
|
| HeapNumber::cast(result)->set_value(value);
|
| return result;
|
| }
|
| @@ -3128,18 +3133,20 @@ bool Heap::CreateInitialObjects() {
|
| Object* obj;
|
|
|
| // The -0 value must be set before NumberFromDouble works.
|
| - { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, TENURED);
|
| + { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, IMMUTABLE, TENURED);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| set_minus_zero_value(HeapNumber::cast(obj));
|
| ASSERT(std::signbit(minus_zero_value()->Number()) != 0);
|
|
|
| - { MaybeObject* maybe_obj = AllocateHeapNumber(OS::nan_value(), TENURED);
|
| + { MaybeObject* maybe_obj = AllocateHeapNumber(
|
| + OS::nan_value(), IMMUTABLE, TENURED);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| set_nan_value(HeapNumber::cast(obj));
|
|
|
| - { MaybeObject* maybe_obj = AllocateHeapNumber(V8_INFINITY, TENURED);
|
| + { MaybeObject* maybe_obj = AllocateHeapNumber(
|
| + V8_INFINITY, IMMUTABLE, TENURED);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| set_infinity_value(HeapNumber::cast(obj));
|
| @@ -3821,7 +3828,7 @@ MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) {
|
| // done after conversion to int. Doing this by comparing bit
|
| // patterns is faster than using fpclassify() et al.
|
| if (IsMinusZero(value)) {
|
| - return AllocateHeapNumber(-0.0, pretenure);
|
| + return AllocateHeapNumber(-0.0, IMMUTABLE, pretenure);
|
| }
|
|
|
| int int_value = FastD2I(value);
|
| @@ -3830,7 +3837,7 @@ MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) {
|
| }
|
|
|
| // Materialize the value in the heap.
|
| - return AllocateHeapNumber(value, pretenure);
|
| + return AllocateHeapNumber(value, IMMUTABLE, pretenure);
|
| }
|
|
|
|
|
|
|