Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index c358ee6584525e4415aacce8615efd687acda79e..7d42845900a405a770fe03c755dc323652609a84 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()) { |
Igor Sheludko
2014/03/27 11:30:16
If you extend IsNumber() to return true for mutabl
|
+ value = HeapNumber::cast(this)->value(); |
+ } else { |
+ value = Number(); |
} |
- return heap->AllocateHeapNumber(Number()); |
+ return heap->AllocateMutableHeapNumber(value); |
+} |
+ |
+ |
+MaybeObject* Object::WrapForRead(Heap* heap, |
+ Representation representation) { |
+ ASSERT(!IsUninitialized()); |
+ if (!representation.IsDouble()) { |
+ ASSERT(FitsRepresentation(representation)); |
+ return this; |
+ } |
+ return heap->AllocateHeapNumber(HeapNumber::cast(this)->value()); |
Igor Sheludko
2014/03/27 11:30:16
Same here: use Number().
|
} |
@@ -1944,7 +1961,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); |
Igor Sheludko
2014/03/27 11:30:16
Shouldn't we also repack mutable heap number to im
|
} |
@@ -2852,7 +2869,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) |
@@ -5673,6 +5689,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) |