Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 88e723455be07ab6cb4787d835ea8dd9fd4305c8..54ffcb6cc0379b04e259a7ec68369fbc6eab0887 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -4661,120 +4661,91 @@ void JSObject::TransformToFastProperties(Handle<JSObject> object, |
} |
-static MUST_USE_RESULT MaybeObject* CopyFastElementsToDictionary( |
- Isolate* isolate, |
- FixedArrayBase* array, |
+static Handle<SeededNumberDictionary> CopyFastElementsToDictionary( |
+ Handle<FixedArrayBase> array, |
int length, |
- SeededNumberDictionary* dictionary) { |
- Heap* heap = isolate->heap(); |
+ Handle<SeededNumberDictionary> dictionary) { |
+ Isolate* isolate = array->GetIsolate(); |
+ Factory* factory = isolate->factory(); |
bool has_double_elements = array->IsFixedDoubleArray(); |
for (int i = 0; i < length; i++) { |
- Object* value = NULL; |
+ Handle<Object> value; |
if (has_double_elements) { |
- FixedDoubleArray* double_array = FixedDoubleArray::cast(array); |
+ Handle<FixedDoubleArray> double_array = |
+ Handle<FixedDoubleArray>::cast(array); |
if (double_array->is_the_hole(i)) { |
- value = isolate->heap()->the_hole_value(); |
+ value = factory->the_hole_value(); |
} else { |
- // Objects must be allocated in the old object space, since the |
- // overall number of HeapNumbers needed for the conversion might |
- // exceed the capacity of new space, and we would fail repeatedly |
- // trying to convert the FixedDoubleArray. |
- MaybeObject* maybe_value_object = |
- heap->AllocateHeapNumber(double_array->get_scalar(i), TENURED); |
- if (!maybe_value_object->ToObject(&value)) return maybe_value_object; |
+ value = factory->NewHeapNumber(double_array->get_scalar(i)); |
} |
} else { |
- value = FixedArray::cast(array)->get(i); |
+ value = handle(Handle<FixedArray>::cast(array)->get(i), isolate); |
} |
if (!value->IsTheHole()) { |
PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); |
- MaybeObject* maybe_result = |
- dictionary->AddNumberEntry(i, value, details); |
- if (!maybe_result->To(&dictionary)) return maybe_result; |
+ dictionary = |
+ SeededNumberDictionary::AddNumberEntry(dictionary, i, value, details); |
} |
} |
return dictionary; |
} |
-static Handle<SeededNumberDictionary> CopyFastElementsToDictionary( |
- Handle<FixedArrayBase> array, |
- int length, |
- Handle<SeededNumberDictionary> dict) { |
- Isolate* isolate = array->GetIsolate(); |
- CALL_HEAP_FUNCTION(isolate, |
- CopyFastElementsToDictionary( |
- isolate, *array, length, *dict), |
- SeededNumberDictionary); |
-} |
- |
- |
Handle<SeededNumberDictionary> JSObject::NormalizeElements( |
Handle<JSObject> object) { |
- CALL_HEAP_FUNCTION(object->GetIsolate(), |
- object->NormalizeElements(), |
- SeededNumberDictionary); |
-} |
- |
- |
-MaybeObject* JSObject::NormalizeElements() { |
- ASSERT(!HasExternalArrayElements()); |
+ ASSERT(!object->HasExternalArrayElements()); |
+ Isolate* isolate = object->GetIsolate(); |
+ Factory* factory = isolate->factory(); |
// Find the backing store. |
- FixedArrayBase* array = FixedArrayBase::cast(elements()); |
- Map* old_map = array->map(); |
+ Handle<FixedArrayBase> array(FixedArrayBase::cast(object->elements())); |
bool is_arguments = |
- (old_map == old_map->GetHeap()->sloppy_arguments_elements_map()); |
+ (array->map() == isolate->heap()->sloppy_arguments_elements_map()); |
if (is_arguments) { |
- array = FixedArrayBase::cast(FixedArray::cast(array)->get(1)); |
+ array = handle(FixedArrayBase::cast( |
+ Handle<FixedArray>::cast(array)->get(1))); |
} |
- if (array->IsDictionary()) return array; |
+ if (array->IsDictionary()) return Handle<SeededNumberDictionary>::cast(array); |
- ASSERT(HasFastSmiOrObjectElements() || |
- HasFastDoubleElements() || |
- HasFastArgumentsElements()); |
+ ASSERT(object->HasFastSmiOrObjectElements() || |
+ object->HasFastDoubleElements() || |
+ object->HasFastArgumentsElements()); |
// Compute the effective length and allocate a new backing store. |
- int length = IsJSArray() |
- ? Smi::cast(JSArray::cast(this)->length())->value() |
+ int length = object->IsJSArray() |
+ ? Smi::cast(Handle<JSArray>::cast(object)->length())->value() |
: array->length(); |
int old_capacity = 0; |
int used_elements = 0; |
- GetElementsCapacityAndUsage(&old_capacity, &used_elements); |
- SeededNumberDictionary* dictionary; |
- MaybeObject* maybe_dictionary = |
- SeededNumberDictionary::Allocate(GetHeap(), used_elements); |
- if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
+ object->GetElementsCapacityAndUsage(&old_capacity, &used_elements); |
+ Handle<SeededNumberDictionary> dictionary = |
+ factory->NewSeededNumberDictionary(used_elements); |
- maybe_dictionary = CopyFastElementsToDictionary( |
- GetIsolate(), array, length, dictionary); |
- if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
+ dictionary = CopyFastElementsToDictionary(array, length, dictionary); |
// Switch to using the dictionary as the backing storage for elements. |
if (is_arguments) { |
- FixedArray::cast(elements())->set(1, dictionary); |
+ FixedArray::cast(object->elements())->set(1, *dictionary); |
} else { |
// Set the new map first to satify the elements type assert in |
// set_elements(). |
- Map* new_map; |
- MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), |
- DICTIONARY_ELEMENTS); |
- if (!maybe->To(&new_map)) return maybe; |
- // TODO(verwaest): Replace by MigrateToMap. |
- set_map(new_map); |
- set_elements(dictionary); |
+ Handle<Map> new_map = |
+ JSObject::GetElementsTransitionMap(object, DICTIONARY_ELEMENTS); |
+ |
+ JSObject::MigrateToMap(object, new_map); |
+ object->set_elements(*dictionary); |
} |
- old_map->GetHeap()->isolate()->counters()->elements_to_dictionary()-> |
- Increment(); |
+ isolate->counters()->elements_to_dictionary()->Increment(); |
#ifdef DEBUG |
if (FLAG_trace_normalization) { |
PrintF("Object elements have been normalized:\n"); |
- Print(); |
+ object->Print(); |
} |
#endif |
- ASSERT(HasDictionaryElements() || HasDictionaryArgumentsElements()); |
+ ASSERT(object->HasDictionaryElements() || |
+ object->HasDictionaryArgumentsElements()); |
return dictionary; |
} |