From: ishell@chromium.org Date: Fri, 21 Mar 2014 10:42:19 +0000 (+0000) Subject: Revert "JSObject::NormalizeElements() handlified." X-Git-Tag: upstream/4.7.83~10097 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=309bf937a02d759d66ad8de05a813ef41200a3c9;p=platform%2Fupstream%2Fv8.git Revert "JSObject::NormalizeElements() handlified." This reverts commit r20146 which broke V8 GC Stress, Mjsunit tests. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/207963002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20154 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/objects.cc b/src/objects.cc index 2eea5b6..88e7234 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -4711,59 +4711,70 @@ static Handle CopyFastElementsToDictionary( Handle JSObject::NormalizeElements( Handle object) { - ASSERT(!object->HasExternalArrayElements()); - Isolate* isolate = object->GetIsolate(); - Factory* factory = isolate->factory(); + CALL_HEAP_FUNCTION(object->GetIsolate(), + object->NormalizeElements(), + SeededNumberDictionary); +} + + +MaybeObject* JSObject::NormalizeElements() { + ASSERT(!HasExternalArrayElements()); // Find the backing store. - Handle array(FixedArrayBase::cast(object->elements())); + FixedArrayBase* array = FixedArrayBase::cast(elements()); + Map* old_map = array->map(); bool is_arguments = - (array->map() == isolate->heap()->sloppy_arguments_elements_map()); + (old_map == old_map->GetHeap()->sloppy_arguments_elements_map()); if (is_arguments) { - array = handle(FixedArrayBase::cast( - Handle::cast(array)->get(1))); + array = FixedArrayBase::cast(FixedArray::cast(array)->get(1)); } - if (array->IsDictionary()) return Handle::cast(array); + if (array->IsDictionary()) return array; - ASSERT(object->HasFastSmiOrObjectElements() || - object->HasFastDoubleElements() || - object->HasFastArgumentsElements()); + ASSERT(HasFastSmiOrObjectElements() || + HasFastDoubleElements() || + HasFastArgumentsElements()); // Compute the effective length and allocate a new backing store. - int length = object->IsJSArray() - ? Smi::cast(Handle::cast(object)->length())->value() + int length = IsJSArray() + ? Smi::cast(JSArray::cast(this)->length())->value() : array->length(); int old_capacity = 0; int used_elements = 0; - object->GetElementsCapacityAndUsage(&old_capacity, &used_elements); - Handle dictionary = - factory->NewSeededNumberDictionary(used_elements); + GetElementsCapacityAndUsage(&old_capacity, &used_elements); + SeededNumberDictionary* dictionary; + MaybeObject* maybe_dictionary = + SeededNumberDictionary::Allocate(GetHeap(), used_elements); + if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; - dictionary = CopyFastElementsToDictionary(array, length, dictionary); + maybe_dictionary = CopyFastElementsToDictionary( + GetIsolate(), array, length, dictionary); + if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; // Switch to using the dictionary as the backing storage for elements. if (is_arguments) { - FixedArray::cast(object->elements())->set(1, *dictionary); + FixedArray::cast(elements())->set(1, dictionary); } else { // Set the new map first to satify the elements type assert in // set_elements(). - Handle new_map = - JSObject::GetElementsTransitionMap(object, DICTIONARY_ELEMENTS); - - JSObject::MigrateToMap(object, new_map); - object->set_elements(*dictionary); + 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); } - isolate->counters()->elements_to_dictionary()->Increment(); + old_map->GetHeap()->isolate()->counters()->elements_to_dictionary()-> + Increment(); #ifdef DEBUG if (FLAG_trace_normalization) { PrintF("Object elements have been normalized:\n"); - object->Print(); + Print(); } #endif - ASSERT(object->HasDictionaryElements() || - object->HasDictionaryArgumentsElements()); + ASSERT(HasDictionaryElements() || HasDictionaryArgumentsElements()); return dictionary; } diff --git a/src/objects.h b/src/objects.h index f730d2f..134ef04 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2608,6 +2608,8 @@ class JSObject: public JSReceiver { static Handle NormalizeElements( Handle object); + MUST_USE_RESULT MaybeObject* NormalizeElements(); + // Transform slow named properties to fast variants. static void TransformToFastProperties(Handle object, int unused_property_fields);