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.

Reply via email to