Reviewers: Igor Sheludko,
Message:
PTAL
Description:
Replace set_map_and_elements by MigrateToMap-based SetMapAndElements
BUG=
Please review this at https://codereview.chromium.org/218753005/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+46, -47 lines):
M src/api.cc
M src/objects.h
M src/objects.cc
M src/objects-inl.h
M src/runtime.cc
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index
ab25562158cb0406b002d1e98735ce955ba0776d..765938ae168aedbf112b055ff3e2f018f79cdd8c
100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -6101,7 +6101,7 @@ i::Handle<i::JSTypedArray> NewTypedArray(
static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
i::Handle<i::Map> map =
i::JSObject::GetElementsTransitionMap(obj, elements_kind);
- obj->set_map_and_elements(*map, *elements);
+ i::JSObject::SetMapAndElements(obj, map, elements);
return obj;
}
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index
ddd321ca28906d5b0873741e639508f8b7f80cea..40fa3175ac81944c66058e080b6d1f2c77d4120e
100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1698,31 +1698,27 @@ MaybeObject*
JSObject::GetElementsTransitionMap(Isolate* isolate,
}
-void JSObject::set_map_and_elements(Map* new_map,
- FixedArrayBase* value,
- WriteBarrierMode mode) {
- ASSERT(value->HasValidElements());
- if (new_map != NULL) {
- if (mode == UPDATE_WRITE_BARRIER) {
- set_map(new_map);
- } else {
- ASSERT(mode == SKIP_WRITE_BARRIER);
- set_map_no_write_barrier(new_map);
- }
- }
- ASSERT((map()->has_fast_smi_or_object_elements() ||
- (value == GetHeap()->empty_fixed_array())) ==
- (value->map() == GetHeap()->fixed_array_map() ||
- value->map() == GetHeap()->fixed_cow_array_map()));
- ASSERT((value == GetHeap()->empty_fixed_array()) ||
- (map()->has_fast_double_elements() ==
value->IsFixedDoubleArray()));
- WRITE_FIELD(this, kElementsOffset, value);
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
+void JSObject::SetMapAndElements(Handle<JSObject> object,
+ Handle<Map> new_map,
+ Handle<FixedArrayBase> value) {
+ JSObject::MigrateToMap(object, new_map);
+ ASSERT((object->map()->has_fast_smi_or_object_elements() ||
+ (*value == object->GetHeap()->empty_fixed_array())) ==
+ (value->map() == object->GetHeap()->fixed_array_map() ||
+ value->map() == object->GetHeap()->fixed_cow_array_map()));
+ ASSERT((*value == object->GetHeap()->empty_fixed_array()) ||
+ (object->map()->has_fast_double_elements() ==
+ value->IsFixedDoubleArray()));
+ JSObject* obj = *object;
+ FixedArrayBase* val = *value;
+ WRITE_FIELD(obj, kElementsOffset, val);
+ WRITE_BARRIER(obj->GetHeap(), obj, kElementsOffset, val);
}
void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
- set_map_and_elements(NULL, value, mode);
+ WRITE_FIELD(this, kElementsOffset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
}
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
9a6b26aaf11a9afd280ccd0bfca53a0c1e54cad5..ce31bf02f39fd7056ad9d651c34f6639dd39e46d
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -4672,6 +4672,13 @@ void
JSObject::TransformToFastProperties(Handle<JSObject> object,
}
+void JSObject::ResetElements(Handle<JSObject> object) {
+ CALL_HEAP_FUNCTION_VOID(
+ object->GetIsolate(),
+ object->ResetElements());
+}
+
+
static Handle<SeededNumberDictionary> CopyFastElementsToDictionary(
Handle<FixedArrayBase> array,
int length,
@@ -11174,7 +11181,7 @@ Handle<FixedArray>
JSObject::SetFastElementsCapacityAndLength(
? GetElementsTransitionMap(object, new_elements_kind)
: handle(object->map());
object->ValidateElements();
- object->set_map_and_elements(*new_map, *new_elements);
+ JSObject::SetMapAndElements(object, new_map, new_elements);
// Transition through the allocation site as well if present.
JSObject::UpdateAllocationSite(object, new_elements_kind);
@@ -11220,7 +11227,7 @@ void
JSObject::SetFastDoubleElementsCapacityAndLength(Handle<JSObject> object,
accessor->CopyElements(object, elems, elements_kind);
object->ValidateElements();
- object->set_map_and_elements(*new_map, *elems);
+ JSObject::SetMapAndElements(object, new_map, elems);
if (FLAG_trace_elements_transitions) {
PrintElementsTransition(stdout, object, elements_kind, old_elements,
@@ -14360,7 +14367,7 @@ Handle<Object>
JSObject::PrepareElementsForSort(Handle<JSObject> object,
dict->CopyValuesTo(*fast_elements);
object->ValidateElements();
- object->set_map_and_elements(*new_map, *fast_elements);
+ JSObject::SetMapAndElements(object, new_map, fast_elements);
} else if (object->HasExternalArrayElements() ||
object->HasFixedTypedArrayElements()) {
// Typed arrays cannot have holes or undefined elements.
@@ -16354,7 +16361,7 @@ Handle<JSArrayBuffer>
JSTypedArray::MaterializeArrayBuffer(
buffer->set_weak_first_view(*typed_array);
ASSERT(typed_array->weak_next() == isolate->heap()->undefined_value());
typed_array->set_buffer(*buffer);
- typed_array->set_map_and_elements(*new_map, *new_elements);
+ JSObject::SetMapAndElements(typed_array, new_map, new_elements);
return buffer;
}
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
abfa963d2bec07814ed85e98cb2e0402255baa08..8750bd44315e19fce8bfa6336a567824fda67e75
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2189,6 +2189,10 @@ class JSObject: public JSReceiver {
DECL_ACCESSORS(elements, FixedArrayBase)
inline void initialize_elements();
MUST_USE_RESULT inline MaybeObject* ResetElements();
+ static void ResetElements(Handle<JSObject> object);
+ static inline void SetMapAndElements(Handle<JSObject> object,
+ Handle<Map> map,
+ Handle<FixedArrayBase> elements);
inline ElementsKind GetElementsKind();
inline ElementsAccessor* GetElementsAccessor();
// Returns true if an object has elements of FAST_SMI_ELEMENTS
ElementsKind.
@@ -2237,11 +2241,6 @@ class JSObject: public JSReceiver {
bool HasDictionaryArgumentsElements();
inline SeededNumberDictionary* element_dictionary(); // Gets slow
elements.
- inline void set_map_and_elements(
- Map* map,
- FixedArrayBase* value,
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
-
// Requires: HasFastElements().
static Handle<FixedArray> EnsureWritableFastElements(
Handle<JSObject> object);
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index
849de3cb1e204befd6ec0fb807cdb8dd7c07be1d..3766f02de37d336fc5548ae6f483f549ec1ef670
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1010,7 +1010,7 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_TypedArrayInitialize) {
static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
Handle<Map> map =
JSObject::GetElementsTransitionMap(holder, external_elements_kind);
- holder->set_map_and_elements(*map, *elements);
+ JSObject::SetMapAndElements(holder, map, elements);
ASSERT(IsExternalArrayElementsKind(holder->map()->elements_kind()));
} else {
holder->set_buffer(Smi::FromInt(0));
@@ -1107,7 +1107,7 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_TypedArrayInitializeFromArrayLike) {
static_cast<uint8_t*>(buffer->backing_store()));
Handle<Map> map = JSObject::GetElementsTransitionMap(
holder, external_elements_kind);
- holder->set_map_and_elements(*map, *elements);
+ JSObject::SetMapAndElements(holder, map, elements);
if (source->IsJSTypedArray()) {
Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source));
@@ -10634,27 +10634,24 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_RemoveArrayHoles) {
// Move contents of argument 0 (an array) to argument 1 (an array)
RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
- SealHandleScope shs(isolate);
+ HandleScope scope(isolate);
ASSERT(args.length() == 2);
- CONVERT_ARG_CHECKED(JSArray, from, 0);
- CONVERT_ARG_CHECKED(JSArray, to, 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSArray, from, 0);
+ CONVERT_ARG_HANDLE_CHECKED(JSArray, to, 1);
from->ValidateElements();
to->ValidateElements();
- FixedArrayBase* new_elements = from->elements();
+
+ Handle<FixedArrayBase> new_elements(from->elements());
ElementsKind from_kind = from->GetElementsKind();
- MaybeObject* maybe_new_map;
- maybe_new_map = to->GetElementsTransitionMap(isolate, from_kind);
- Object* new_map;
- if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
- to->set_map_and_elements(Map::cast(new_map), new_elements);
+ Handle<Map> new_map = JSObject::GetElementsTransitionMap(to, from_kind);
+ JSObject::SetMapAndElements(to, new_map, new_elements);
to->set_length(from->length());
- Object* obj;
- { MaybeObject* maybe_obj = from->ResetElements();
- if (!maybe_obj->ToObject(&obj)) return maybe_obj;
- }
+
+ JSObject::ResetElements(from);
from->set_length(Smi::FromInt(0));
+
to->ValidateElements();
- return to;
+ return *to;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.