Reviewers: Yang,

Message:
PTAL

Description:
ElementsAccessor::SetLength() maybehandlified.

Please review this at https://codereview.chromium.org/229943006/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+42, -34 lines):
  M src/accessors.cc
  M src/elements.h
  M src/elements.cc
  M src/ic.cc
  M src/objects.h
  M src/objects.cc
  M src/runtime.cc
  M test/cctest/test-heap.cc


Index: src/accessors.cc
diff --git a/src/accessors.cc b/src/accessors.cc
index b3bf7c14e46c121e6f05a4db551940116517f969..8dbd9c96ab2b1a87ed7e4ad583888d5c923664c5 100644
--- a/src/accessors.cc
+++ b/src/accessors.cc
@@ -211,8 +211,10 @@ MaybeObject* Accessors::ArraySetLength(Isolate* isolate,
   if (has_exception) return Failure::Exception();

   if (uint32_v->Number() == number_v->Number()) {
- Handle<Object> result = JSArray::SetElementsLength(array_handle, uint32_v);
-    RETURN_IF_EMPTY_HANDLE(isolate, result);
+    Handle<Object> result;
+    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+        isolate, result,
+        JSArray::SetElementsLength(array_handle, uint32_v));
     return *result;
   }
   return isolate->Throw(
Index: src/elements.cc
diff --git a/src/elements.cc b/src/elements.cc
index db97133ff34656b4e7c078f1f61f7c20b4c0c3f1..b0761a0481f3ef14bc408f3b6ab33c6480470b40 100644
--- a/src/elements.cc
+++ b/src/elements.cc
@@ -162,11 +162,11 @@ static bool HasKey(Handle<FixedArray> array, Handle<Object> key_handle) {
 }


-static Handle<Object> ThrowArrayLengthRangeError(Isolate* isolate) {
-  isolate->Throw(
-      *isolate->factory()->NewRangeError("invalid_array_length",
-                                         HandleVector<Object>(NULL, 0)));
-  return Handle<Object>();
+MUST_USE_RESULT
+static MaybeHandle<Object> ThrowArrayLengthRangeError(Isolate* isolate) {
+  return isolate->Throw<Object>(
+      isolate->factory()->NewRangeError("invalid_array_length",
+                                        HandleVector<Object>(NULL, 0)));
 }


@@ -727,14 +727,14 @@ class ElementsAccessorBase : public ElementsAccessor {
     return MaybeHandle<AccessorPair>();
   }

-  MUST_USE_RESULT virtual Handle<Object> SetLength(
+  MUST_USE_RESULT virtual MaybeHandle<Object> SetLength(
       Handle<JSArray> array,
       Handle<Object> length) V8_FINAL V8_OVERRIDE {
     return ElementsAccessorSubclass::SetLengthImpl(
         array, length, handle(array->elements()));
   }

-  MUST_USE_RESULT static Handle<Object> SetLengthImpl(
+  MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl(
       Handle<JSObject> obj,
       Handle<Object> length,
       Handle<FixedArrayBase> backing_store);
@@ -1364,7 +1364,7 @@ class TypedElementsAccessor
           ? FIELD : NONEXISTENT;
   }

-  MUST_USE_RESULT static Handle<Object> SetLengthImpl(
+  MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl(
       Handle<JSObject> obj,
       Handle<Object> length,
       Handle<FixedArrayBase> backing_store) {
@@ -1749,7 +1749,7 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
     }
   }

-  MUST_USE_RESULT static Handle<Object> SetLengthImpl(
+  MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl(
       Handle<JSObject> obj,
       Handle<Object> length,
       Handle<FixedArrayBase> parameter_map) {
@@ -1867,8 +1867,9 @@ void ElementsAccessor::TearDown() {


 template <typename ElementsAccessorSubclass, typename ElementsKindTraits>
-MUST_USE_RESULT Handle<Object> ElementsAccessorBase<ElementsAccessorSubclass,
-                                                    ElementsKindTraits>::
+MUST_USE_RESULT
+MaybeHandle<Object> ElementsAccessorBase<ElementsAccessorSubclass,
+                                         ElementsKindTraits>::
     SetLengthImpl(Handle<JSObject> obj,
                   Handle<Object> length,
                   Handle<FixedArrayBase> backing_store) {
@@ -1883,7 +1884,7 @@ MUST_USE_RESULT Handle<Object> ElementsAccessorBase<ElementsAccessorSubclass,
     if (value >= 0) {
       Handle<Object> new_length = ElementsAccessorSubclass::
SetLengthWithoutNormalize(backing_store, array, smi_length, value);
-      RETURN_IF_EMPTY_HANDLE_VALUE(isolate, new_length, new_length);
+      ASSERT(!new_length.is_null());

       // even though the proposed length was a smi, new_length could
       // still be a heap number because SetLengthWithoutNormalize doesn't
@@ -1910,11 +1911,11 @@ MUST_USE_RESULT Handle<Object> ElementsAccessorBase<ElementsAccessorSubclass,
     if (length->ToArrayIndex(&value)) {
       Handle<SeededNumberDictionary> dictionary =
           JSObject::NormalizeElements(array);
-      RETURN_IF_EMPTY_HANDLE_VALUE(isolate, dictionary, dictionary);
+      ASSERT(!dictionary.is_null());

       Handle<Object> new_length = DictionaryElementsAccessor::
           SetLengthWithoutNormalize(dictionary, array, length, value);
-      RETURN_IF_EMPTY_HANDLE_VALUE(isolate, new_length, new_length);
+      ASSERT(!new_length.is_null());

       ASSERT(new_length->IsNumber());
       array->set_length(*new_length);
@@ -1933,8 +1934,8 @@ MUST_USE_RESULT Handle<Object> ElementsAccessorBase<ElementsAccessorSubclass,
 }


-Handle<Object> ArrayConstructInitializeElements(Handle<JSArray> array,
-                                                Arguments* args) {
+MaybeHandle<Object> ArrayConstructInitializeElements(Handle<JSArray> array,
+                                                     Arguments* args) {
   // Optimize the case where there is one argument and the argument is a
   // small smi.
   if (args->length() == 1) {
Index: src/elements.h
diff --git a/src/elements.h b/src/elements.h
index 76b2b0ebfbbaed670c04499c74836edfdb36a5b4..ea06b6bc9fd47d4d841e150f9a19a824f3338c0b 100644
--- a/src/elements.h
+++ b/src/elements.h
@@ -145,7 +145,7 @@ class ElementsAccessor {
// changing array sizes as defined in EcmaScript 5.1 15.4.5.2, i.e. array that
   // have non-deletable elements can only be shrunk to the size of highest
   // element that is non-deletable.
-  MUST_USE_RESULT virtual Handle<Object> SetLength(
+  MUST_USE_RESULT virtual MaybeHandle<Object> SetLength(
       Handle<JSArray> holder,
       Handle<Object> new_length) = 0;

@@ -257,8 +257,9 @@ class ElementsAccessor {
 void CheckArrayAbuse(Handle<JSObject> obj, const char* op, uint32_t key,
                      bool allow_appending = false);

-Handle<Object> ArrayConstructInitializeElements(Handle<JSArray> array,
-                                                Arguments* args);
+MUST_USE_RESULT MaybeHandle<Object> ArrayConstructInitializeElements(
+    Handle<JSArray> array,
+    Arguments* args);

 } }  // namespace v8::internal

Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index a00df8537c0724e5c1726d127f76641989809850..9195f72587ce7b5f743126e13aa8b2d416e92337 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1833,8 +1833,8 @@ RUNTIME_FUNCTION(MaybeObject*, StoreIC_ArrayLength) {
   ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly());
 #endif

-  RETURN_IF_EMPTY_HANDLE(isolate,
-                         JSArray::SetElementsLength(receiver, len));
+  RETURN_FAILURE_ON_EXCEPTION(
+      isolate, JSArray::SetElementsLength(receiver, len));
   return *len;
 }

Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 3485f5fe1408022631df75120ae1f582f26a6d27..68e6721378a48de7d419b88a6222ea81516b5b1e 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -11438,8 +11438,9 @@ static void EndPerformSplice(Handle<JSArray> object) {
 }


-Handle<Object> JSArray::SetElementsLength(Handle<JSArray> array,
- Handle<Object> new_length_handle) {
+MaybeHandle<Object> JSArray::SetElementsLength(
+    Handle<JSArray> array,
+    Handle<Object> new_length_handle) {
   // We should never end in here with a pixel or external array.
   ASSERT(array->AllowsSetElementsLength());
   if (!array->map()->is_observed()) {
@@ -11477,9 +11478,11 @@ Handle<Object> JSArray::SetElementsLength(Handle<JSArray> array,
     }
   }

-  Handle<Object> hresult =
-      array->GetElementsAccessor()->SetLength(array, new_length_handle);
-  RETURN_IF_EMPTY_HANDLE_VALUE(isolate, hresult, hresult);
+  Handle<Object> hresult;
+  ASSIGN_RETURN_ON_EXCEPTION(
+      isolate, hresult,
+      array->GetElementsAccessor()->SetLength(array, new_length_handle),
+      Object);

   CHECK(array->length()->ToArrayIndex(&new_length));
   if (old_length == new_length) return hresult;
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index d4a1f702b96910bf3580f076ce5519b65b512c46..54f9a5d1f1cc46fbeaf9cad93c7560922612c22f 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -10240,8 +10240,9 @@ class JSArray: public JSObject {
   // Initializes the array to a certain length.
   inline bool AllowsSetElementsLength();
   // Can cause GC.
-  static Handle<Object> SetElementsLength(Handle<JSArray> array,
-                                          Handle<Object> length);
+  MUST_USE_RESULT static MaybeHandle<Object> SetElementsLength(
+      Handle<JSArray> array,
+      Handle<Object> length);

   // Set the content of the array to the content of storage.
   static inline void SetContent(Handle<JSArray> array,
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index e46fbba6474552121c7c2bcb105924276515658e..be821e5efface3792a78e23c14cd01e6a41a29ce 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -15027,8 +15027,8 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
   factory->NewJSArrayStorage(array, 0, 0, DONT_INITIALIZE_ARRAY_ELEMENTS);

   ElementsKind old_kind = array->GetElementsKind();
-  RETURN_IF_EMPTY_HANDLE(isolate,
- ArrayConstructInitializeElements(array, caller_args));
+  RETURN_FAILURE_ON_EXCEPTION(
+      isolate, ArrayConstructInitializeElements(array, caller_args));
   if (!site.is_null() &&
       (old_kind != array->GetElementsKind() ||
        !can_use_type_feedback)) {
Index: test/cctest/test-heap.cc
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
index 47c85c224314c0c912d0d5b5b2dd2c0ec8535890..e18094b2614cc7babb881277c9f1c9d691bf7dc6 100644
--- a/test/cctest/test-heap.cc
+++ b/test/cctest/test-heap.cc
@@ -773,7 +773,7 @@ TEST(JSArray) {
   JSArray::Initialize(array, 0);

   // Set array length to 0.
-  *JSArray::SetElementsLength(array, handle(Smi::FromInt(0), isolate));
+ JSArray::SetElementsLength(array, handle(Smi::FromInt(0), isolate)).Check();
   CHECK_EQ(Smi::FromInt(0), array->length());
   // Must be in fast mode.
   CHECK(array->HasFastSmiOrObjectElements());
@@ -786,7 +786,7 @@ TEST(JSArray) {
   // Set array length with larger than smi value.
   Handle<Object> length =
factory->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1);
-  *JSArray::SetElementsLength(array, length);
+  JSArray::SetElementsLength(array, length).Check();

   uint32_t int_length = 0;
   CHECK(length->ToArrayIndex(&int_length));


--
--
v8-dev mailing list
v8-dev@googlegroups.com
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 v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to