Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: src/objects.cc

Issue 1802733002: Move elements normalization to the ElementsAccessor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index ffe3ac65847daed588bc7c52deb8f7d755c5b41c..560edf1cc88fd7a260b4e1f85cf2c59a3dcfbbe3 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -5692,35 +5692,6 @@ void JSObject::ResetElements(Handle<JSObject> object) {
}
-static Handle<SeededNumberDictionary> CopyFastElementsToDictionary(
- Handle<FixedArrayBase> array, int length,
- Handle<SeededNumberDictionary> dictionary, bool used_as_prototype) {
- Isolate* isolate = array->GetIsolate();
- Factory* factory = isolate->factory();
- bool has_double_elements = array->IsFixedDoubleArray();
- for (int i = 0; i < length; i++) {
- Handle<Object> value;
- if (has_double_elements) {
- Handle<FixedDoubleArray> double_array =
- Handle<FixedDoubleArray>::cast(array);
- if (double_array->is_the_hole(i)) {
- value = factory->the_hole_value();
- } else {
- value = factory->NewHeapNumber(double_array->get_scalar(i));
- }
- } else {
- value = handle(Handle<FixedArray>::cast(array)->get(i), isolate);
- }
- if (!value->IsTheHole()) {
- PropertyDetails details = PropertyDetails::Empty();
- dictionary = SeededNumberDictionary::AddNumberEntry(
- dictionary, i, value, details, used_as_prototype);
- }
- }
- return dictionary;
-}
-
-
void JSObject::RequireSlowElements(SeededNumberDictionary* dictionary) {
if (dictionary->requires_slow_elements()) return;
dictionary->set_requires_slow_elements();
@@ -5731,40 +5702,23 @@ void JSObject::RequireSlowElements(SeededNumberDictionary* dictionary) {
}
-Handle<SeededNumberDictionary> JSObject::GetNormalizedElementDictionary(
- Handle<JSObject> object, Handle<FixedArrayBase> elements) {
- DCHECK(!object->HasDictionaryElements());
- DCHECK(!object->HasSlowArgumentsElements());
- Isolate* isolate = object->GetIsolate();
- // Ensure that notifications fire if the array or object prototypes are
- // normalizing.
- isolate->UpdateArrayProtectorOnNormalizeElements(object);
- int length = object->IsJSArray()
- ? Smi::cast(Handle<JSArray>::cast(object)->length())->value()
- : elements->length();
- int used = object->GetFastElementsUsage();
- Handle<SeededNumberDictionary> dictionary =
- SeededNumberDictionary::New(isolate, used);
- return CopyFastElementsToDictionary(elements, length, dictionary,
- object->map()->is_prototype_map());
-}
-
-
Handle<SeededNumberDictionary> JSObject::NormalizeElements(
Handle<JSObject> object) {
DCHECK(!object->HasFixedTypedArrayElements());
Isolate* isolate = object->GetIsolate();
-
- // Find the backing store.
- Handle<FixedArrayBase> elements(object->elements(), isolate);
bool is_arguments = object->HasSloppyArgumentsElements();
- if (is_arguments) {
- FixedArray* parameter_map = FixedArray::cast(*elements);
- elements = handle(FixedArrayBase::cast(parameter_map->get(1)), isolate);
- }
+ {
+ DisallowHeapAllocation no_gc;
+ FixedArrayBase* elements = object->elements();
- if (elements->IsDictionary()) {
- return Handle<SeededNumberDictionary>::cast(elements);
+ if (is_arguments) {
+ FixedArray* parameter_map = FixedArray::cast(elements);
+ elements = FixedArrayBase::cast(parameter_map->get(1));
+ }
+
+ if (elements->IsDictionary()) {
+ return handle(SeededNumberDictionary::cast(elements), isolate);
+ }
}
DCHECK(object->HasFastSmiOrObjectElements() ||
@@ -5773,7 +5727,7 @@ Handle<SeededNumberDictionary> JSObject::NormalizeElements(
object->HasFastStringWrapperElements());
Handle<SeededNumberDictionary> dictionary =
- GetNormalizedElementDictionary(object, elements);
+ object->GetElementsAccessor()->Normalize(object);
// Switch to using the dictionary as the backing storage for elements.
ElementsKind target_kind = is_arguments
@@ -7760,8 +7714,7 @@ Maybe<bool> JSObject::PreventExtensionsWithTransition(
: object->elements()->length();
new_element_dictionary =
length == 0 ? isolate->factory()->empty_slow_element_dictionary()
- : GetNormalizedElementDictionary(
- object, handle(object->elements()));
+ : object->GetElementsAccessor()->Normalize(object);
}
Handle<Symbol> transition_marker;
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698