Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index ddd321ca28906d5b0873741e639508f8b7f80cea..88d1386667183bac21043168bceb65838f6fa2cf 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -177,6 +177,7 @@ bool Object::NonFailureIsHeapObject() { |
TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) |
+TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) |
TYPE_CHECKER(Symbol, SYMBOL_TYPE) |
@@ -282,10 +283,26 @@ MaybeObject* Object::AllocateNewStorageFor(Heap* heap, |
return Smi::FromInt(0); |
} |
if (!representation.IsDouble()) return this; |
+ double value; |
if (IsUninitialized()) { |
- return heap->AllocateHeapNumber(0); |
+ value = 0; |
+ } else if (IsMutableHeapNumber()) { |
+ value = HeapNumber::cast(this)->value(); |
+ } else { |
+ value = Number(); |
} |
- return heap->AllocateHeapNumber(Number()); |
+ return heap->AllocateHeapNumber(value, MUTABLE); |
+} |
+ |
+ |
+MaybeObject* Object::WrapForRead(Heap* heap, |
+ Representation representation) { |
+ ASSERT(!IsUninitialized()); |
+ if (!representation.IsDouble()) { |
+ ASSERT(FitsRepresentation(representation)); |
+ return this; |
+ } |
+ return heap->AllocateHeapNumber(HeapNumber::cast(this)->value()); |
} |
@@ -1954,7 +1971,7 @@ void JSObject::SetInternalField(int index, Smi* value) { |
MaybeObject* JSObject::FastPropertyAt(Representation representation, |
int index) { |
Object* raw_value = RawFastPropertyAt(index); |
- return raw_value->AllocateNewStorageFor(GetHeap(), representation); |
+ return raw_value->WrapForRead(GetHeap(), representation); |
} |
@@ -2885,7 +2902,6 @@ CAST_ACCESSOR(JSReceiver) |
CAST_ACCESSOR(JSObject) |
CAST_ACCESSOR(Smi) |
CAST_ACCESSOR(HeapObject) |
-CAST_ACCESSOR(HeapNumber) |
CAST_ACCESSOR(Oddball) |
CAST_ACCESSOR(Cell) |
CAST_ACCESSOR(PropertyCell) |
@@ -5776,6 +5792,12 @@ JSValue* JSValue::cast(Object* obj) { |
} |
+HeapNumber* HeapNumber::cast(Object* object) { |
+ SLOW_ASSERT(object->IsHeapNumber() || object->IsMutableHeapNumber()); |
+ return reinterpret_cast<HeapNumber*>(object); |
+} |
+ |
+ |
ACCESSORS(JSDate, value, Object, kValueOffset) |
ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset) |
ACCESSORS(JSDate, year, Object, kYearOffset) |