Reviewers: Yang,
Message:
PTAL
Description:
Callers of ElementsAccessor::Validate() handlified.
Please review this at https://codereview.chromium.org/226153002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+51, -42 lines):
M src/elements.h
M src/elements.cc
M src/factory.h
M src/factory.cc
M src/heap.h
M src/heap.cc
M src/objects.h
M src/objects.cc
M src/objects-inl.h
M src/runtime.cc
Index: src/elements.cc
diff --git a/src/elements.cc b/src/elements.cc
index
f0375acc2ab60ee076179fc508eeb8eedd8115dd..93af8bc636908c2fbc4c5335645d9041561eafee
100644
--- a/src/elements.cc
+++ b/src/elements.cc
@@ -610,8 +610,9 @@ class ElementsAccessorBase : public ElementsAccessor {
ElementsAccessorSubclass::ValidateContents(holder, length);
}
- virtual void Validate(JSObject* holder) V8_FINAL V8_OVERRIDE {
- ElementsAccessorSubclass::ValidateImpl(holder);
+ virtual void Validate(Handle<JSObject> holder) V8_FINAL V8_OVERRIDE {
+ DisallowHeapAllocation no_gc;
+ ElementsAccessorSubclass::ValidateImpl(*holder);
}
static bool HasElementImpl(Object* receiver,
@@ -1014,7 +1015,7 @@ class FastElementsAccessor
if (!array->ShouldConvertToSlowElements(new_capacity)) {
FastElementsAccessorSubclass::
SetFastElementsCapacityAndLength(array, new_capacity, length);
- array->ValidateElements();
+ JSObject::ValidateElements(array);
return length_object;
}
Index: src/elements.h
diff --git a/src/elements.h b/src/elements.h
index
ef2089882e919ffef7ff196c64bf23a2b1f4d249..1170a57b56d3199a9f4f132911f3c938dc27d226
100644
--- a/src/elements.h
+++ b/src/elements.h
@@ -48,7 +48,7 @@ class ElementsAccessor {
// Checks the elements of an object for consistency, asserting when a
problem
// is found.
- virtual void Validate(JSObject* obj) = 0;
+ virtual void Validate(Handle<JSObject> obj) = 0;
// Returns true if a holder contains an element with the specified key
// without iterating up the prototype chain. The caller can optionally
pass
Index: src/factory.cc
diff --git a/src/factory.cc b/src/factory.cc
index
7b8fa38fb7c2d27956506d697c5e4e0af5a4c709..f864817ea829fbc30500d4d5b15f3df379e447a1
100644
--- a/src/factory.cc
+++ b/src/factory.cc
@@ -1370,6 +1370,15 @@ Handle<JSObject> Factory::NewJSObjectFromMap(
Handle<JSArray> Factory::NewJSArray(ElementsKind elements_kind,
+ PretenureFlag pretenure) {
+ CALL_HEAP_FUNCTION(isolate(),
+ isolate()->heap()->AllocateJSArray(elements_kind,
+ pretenure),
+ JSArray);
+}
+
+
+Handle<JSArray> Factory::NewJSArray(ElementsKind elements_kind,
int length,
int capacity,
ArrayStorageAllocationMode mode,
@@ -1389,14 +1398,8 @@ Handle<JSArray>
Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
ElementsKind elements_kind,
int length,
PretenureFlag pretenure) {
- ASSERT(length <= elements->length());
- CALL_HEAP_FUNCTION(
- isolate(),
- isolate()->heap()->AllocateJSArrayWithElements(*elements,
- elements_kind,
- length,
- pretenure),
- JSArray);
+ return isolate()->heap()->AllocateJSArrayWithElements(
+ elements, elements_kind, length, pretenure);
}
Index: src/factory.h
diff --git a/src/factory.h b/src/factory.h
index
9d46d02d4c0a7af890ca1905ebfb136900b24a55..be605ed7ec3fb29a6f35409f45732d801d87152b
100644
--- a/src/factory.h
+++ b/src/factory.h
@@ -325,6 +325,11 @@ class Factory V8_FINAL {
Handle<ScopeInfo> scope_info);
// JS arrays are pretenured when allocated by the parser.
+
+ Handle<JSArray> NewJSArray(
+ ElementsKind elements_kind,
+ PretenureFlag pretenure = NOT_TENURED);
+
Handle<JSArray> NewJSArray(
ElementsKind elements_kind,
int length,
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index
f06b8be1d98246d3ea9b5f3237b7a96ae211572c..32d16d180b20ba37a2a40b21251a3bcb86956239
100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -4647,18 +4647,18 @@ MaybeObject* Heap::AllocateJSArrayStorage(
}
-MaybeObject* Heap::AllocateJSArrayWithElements(
- FixedArrayBase* elements,
+Handle<JSArray> Heap::AllocateJSArrayWithElements(
+ Handle<FixedArrayBase> elements,
ElementsKind elements_kind,
int length,
PretenureFlag pretenure) {
- MaybeObject* maybe_array = AllocateJSArray(elements_kind, pretenure);
- JSArray* array;
- if (!maybe_array->To(&array)) return maybe_array;
+ ASSERT(length <= elements->length());
+ Handle<JSArray> array =
+ isolate()->factory()->NewJSArray(elements_kind, pretenure);
- array->set_elements(elements);
+ array->set_elements(*elements);
array->set_length(Smi::FromInt(length));
- array->ValidateElements();
+ JSObject::ValidateElements(array);
return array;
}
Index: src/heap.h
diff --git a/src/heap.h b/src/heap.h
index
b8110920b22de919ee7968ec22e7461d45c8e6d4..230ea6e88d164ec386115f31844aa153f2e3b3db
100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -730,8 +730,8 @@ class Heap {
ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
// Allocate a JSArray with no elements
- MUST_USE_RESULT MaybeObject* AllocateJSArrayWithElements(
- FixedArrayBase* array_base,
+ Handle<JSArray> AllocateJSArrayWithElements(
+ Handle<FixedArrayBase> array_base,
ElementsKind elements_kind,
int length,
PretenureFlag pretenure = NOT_TENURED);
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index
978704ac54286aff224e370390121e305cd45100..3939921bf7304378b13540fc4a1fda3f426216b3
100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1496,11 +1496,11 @@ FixedArrayBase* JSObject::elements() {
}
-void JSObject::ValidateElements() {
+void JSObject::ValidateElements(Handle<JSObject> object) {
#ifdef ENABLE_SLOW_ASSERTS
if (FLAG_enable_slow_asserts) {
- ElementsAccessor* accessor = GetElementsAccessor();
- accessor->Validate(this);
+ ElementsAccessor* accessor = object->GetElementsAccessor();
+ accessor->Validate(object);
}
#endif
}
@@ -1640,7 +1640,7 @@ inline bool
AllocationSite::DigestPretenuringFeedback() {
void JSObject::EnsureCanContainHeapObjectElements(Handle<JSObject> object)
{
- object->ValidateElements();
+ JSObject::ValidateElements(object);
ElementsKind elements_kind = object->map()->elements_kind();
if (!IsFastObjectElementsKind(elements_kind)) {
if (IsFastHoleyElementsKind(elements_kind)) {
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
ce0aa6d92e28c2d1c4751d0f17c7a928eb6423be..263bf968e6252da86ce221a492464e8a066531cd
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -11232,7 +11232,7 @@ Handle<FixedArray>
JSObject::SetFastElementsCapacityAndLength(
Handle<Map> new_map = (new_elements_kind != elements_kind)
? GetElementsTransitionMap(object, new_elements_kind)
: handle(object->map());
- object->ValidateElements();
+ JSObject::ValidateElements(object);
JSObject::SetMapAndElements(object, new_map, new_elements);
// Transition through the allocation site as well if present.
@@ -11278,7 +11278,7 @@ void
JSObject::SetFastDoubleElementsCapacityAndLength(Handle<JSObject> object,
ElementsAccessor* accessor =
ElementsAccessor::ForKind(FAST_DOUBLE_ELEMENTS);
accessor->CopyElements(object, elems, elements_kind);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
JSObject::SetMapAndElements(object, new_map, elems);
if (FLAG_trace_elements_transitions) {
@@ -12157,7 +12157,7 @@ Handle<Object>
JSObject::SetFastElement(Handle<JSObject> object,
SetFastDoubleElementsCapacityAndLength(object, new_capacity,
array_length);
FixedDoubleArray::cast(object->elements())->set(index,
value->Number());
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return value;
}
// Change elements kind from Smi-only to generic FAST if necessary.
@@ -12181,7 +12181,7 @@ Handle<Object>
JSObject::SetFastElement(Handle<JSObject> object,
SetFastElementsCapacityAndLength(object, new_capacity,
array_length,
smi_mode);
new_elements->set(index, *value);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return value;
}
@@ -12327,7 +12327,7 @@ Handle<Object>
JSObject::SetDictionaryElement(Handle<JSObject> object,
SetFastElementsCapacityAndLength(object, new_length, new_length,
smi_mode);
}
- object->ValidateElements();
+ JSObject::ValidateElements(object);
#ifdef DEBUG
if (FLAG_trace_normalization) {
PrintF("Object elements are fast case again:\n");
@@ -12379,7 +12379,7 @@ Handle<Object> JSObject::SetFastDoubleElement(
check_prototype);
RETURN_IF_EMPTY_HANDLE_VALUE(object->GetIsolate(), result,
Handle<Object>());
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return result;
}
@@ -12419,7 +12419,7 @@ Handle<Object> JSObject::SetFastDoubleElement(
ASSERT(static_cast<uint32_t>(new_capacity) > index);
SetFastDoubleElementsCapacityAndLength(object, new_capacity, index +
1);
FixedDoubleArray::cast(object->elements())->set(index, double_value);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return value;
}
}
@@ -12878,7 +12878,7 @@ void
JSObject::TransitionElementsKind(Handle<JSObject> object,
if (IsFastSmiElementsKind(from_kind) &&
IsFastDoubleElementsKind(to_kind)) {
SetFastDoubleElementsCapacityAndLength(object, capacity, length);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return;
}
@@ -12886,7 +12886,7 @@ void
JSObject::TransitionElementsKind(Handle<JSObject> object,
IsFastObjectElementsKind(to_kind)) {
SetFastElementsCapacityAndLength(object, capacity, length,
kDontAllowSmiElements);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return;
}
@@ -14412,7 +14412,7 @@ Handle<Object>
JSObject::PrepareElementsForSort(Handle<JSObject> object,
Handle<FixedArray> fast_elements =
isolate->factory()->NewFixedArray(dict->NumberOfElements(),
tenure);
dict->CopyValuesTo(*fast_elements);
- object->ValidateElements();
+ JSObject::ValidateElements(object);
JSObject::SetMapAndElements(object, new_map, fast_elements);
} else if (object->HasExternalArrayElements() ||
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
948246f2e41beb1d4f8cab114013707ce436c80a..e517bdd78ac1139b500a6574b2f9a77bc6adfec7
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2420,7 +2420,7 @@ class JSObject: public JSReceiver {
static void SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash);
- inline void ValidateElements();
+ static inline void ValidateElements(Handle<JSObject> object);
// Makes sure that this object can contain HeapObject as elements.
static inline void EnsureCanContainHeapObjectElements(Handle<JSObject>
obj);
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index
960d9b3d6431b90cfa2406abe8008cf657284687..f8c1e898c10aa13523802c65d25e2dc475da27c0
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -436,7 +436,7 @@ MaybeHandle<Object>
Runtime::CreateArrayLiteralBoilerplate(
}
}
- object->ValidateElements();
+ JSObject::ValidateElements(object);
return object;
}
@@ -5301,7 +5301,7 @@ MaybeHandle<Object>
Runtime::SetObjectProperty(Isolate* isolate,
return value;
}
- js_object->ValidateElements();
+ JSObject::ValidateElements(js_object);
if (js_object->HasExternalArrayElements() ||
js_object->HasFixedTypedArrayElements()) {
if (!value->IsNumber() && !value->IsUndefined()) {
@@ -5316,7 +5316,7 @@ MaybeHandle<Object>
Runtime::SetObjectProperty(Isolate* isolate,
strict_mode,
true,
set_mode);
- js_object->ValidateElements();
+ JSObject::ValidateElements(js_object);
return result.is_null() ? result : value;
}
@@ -10657,8 +10657,8 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_MoveArrayContents) {
ASSERT(args.length() == 2);
CONVERT_ARG_HANDLE_CHECKED(JSArray, from, 0);
CONVERT_ARG_HANDLE_CHECKED(JSArray, to, 1);
- from->ValidateElements();
- to->ValidateElements();
+ JSObject::ValidateElements(from);
+ JSObject::ValidateElements(to);
Handle<FixedArrayBase> new_elements(from->elements());
ElementsKind from_kind = from->GetElementsKind();
@@ -10669,7 +10669,7 @@ RUNTIME_FUNCTION(MaybeObject*,
Runtime_MoveArrayContents) {
JSObject::ResetElements(from);
from->set_length(Smi::FromInt(0));
- to->ValidateElements();
+ JSObject::ValidateElements(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.