Reviewers: Yang,

Message:
PTAL


https://codereview.chromium.org/1325483002/diff/20001/src/builtins.cc
File src/builtins.cc (right):

https://codereview.chromium.org/1325483002/diff/20001/src/builtins.cc#newcode394
src/builtins.cc:394: result = isolate->factory()->undefined_value();
I am not fully convinced about this branch myself. But I think this is
the only value that has to be converted for a FastElements Array.

Description:
Adding ElementsAccessor::Pop
Moving FastElements path to ElementssAccessor.

BUG=

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

Base URL: https://chromium.googlesource.com/v8/v8.git@2015-08-27_array_builtin_slice

Affected files (+36, -11 lines):
  M src/builtins.cc
  M src/elements.h
  M src/elements.cc
  M src/elements-kind.h


Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index 4e30fb55f0f1d7ee5f9dd577069f041b7b8f78e5..d50d6d7157f9b34bd0d3b01efd036fbd038b60b9 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -209,7 +209,7 @@ inline bool GetSloppyArgumentsLength(Isolate* isolate, Handle<JSObject> object,
 }


-bool PrototypeHasNoElements(PrototypeIterator* iter) {
+inline bool PrototypeHasNoElements(PrototypeIterator* iter) {
   DisallowHeapAllocation no_gc;
   for (; !iter->IsAtEnd(); iter->Advance()) {
     if (iter->GetCurrent()->IsJSProxy()) return false;
@@ -386,13 +386,21 @@ BUILTIN(ArrayPop) {
     return CallJsIntrinsic(isolate, isolate->array_pop(), args);
   }

-  uint32_t new_length = len - 1;
-  Handle<Object> element;
-  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
-      isolate, element, Object::GetElement(isolate, array, new_length));
-
-  JSArray::SetLength(array, new_length);
-  return *element;
+  Handle<Object> result;
+ if (IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) {
+    // Fast Elements Path
+    result = array->GetElementsAccessor()->Pop(array, elms_obj);
+    if (result->IsTheHole()) {
+      result = isolate->factory()->undefined_value();
+    }
+  } else {
+    // Use Slow Lookup otherwise
+    uint32_t new_length = len - 1;
+    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+        isolate, result, Object::GetElement(isolate, array, new_length));
+    JSArray::SetLength(array, new_length);
+  }
+  return *result;
 }


Index: src/elements-kind.h
diff --git a/src/elements-kind.h b/src/elements-kind.h
index 0254a4fb59b20e44096138e54458840ba5253d26..d8234097c4371a34518b1f0b9e4e92ea4769e1f6 100644
--- a/src/elements-kind.h
+++ b/src/elements-kind.h
@@ -158,9 +158,8 @@ inline bool IsHoleyElementsKind(ElementsKind kind) {


 inline bool IsFastPackedElementsKind(ElementsKind kind) {
-  return kind == FAST_SMI_ELEMENTS ||
-      kind == FAST_DOUBLE_ELEMENTS ||
-      kind == FAST_ELEMENTS;
+  return kind == FAST_SMI_ELEMENTS || kind == FAST_DOUBLE_ELEMENTS ||
+         kind == FAST_ELEMENTS;
 }


Index: src/elements.cc
diff --git a/src/elements.cc b/src/elements.cc
index d17efafcebb2c6c88e585381ffda311db20d63bc..b5c4cf18ce960b27139742d338b59bf1614a0723 100644
--- a/src/elements.cc
+++ b/src/elements.cc
@@ -639,6 +639,21 @@ class ElementsAccessorBase : public ElementsAccessor {
     return Handle<JSArray>();
   }

+  virtual Handle<Object> Pop(Handle<JSArray> receiver,
+                             Handle<FixedArrayBase> backing_store) final {
+    return ElementsAccessorSubclass::PopImpl(receiver, backing_store);
+  }
+
+  static Handle<Object> PopImpl(Handle<JSArray> receiver,
+                                Handle<FixedArrayBase> backing_store) {
+    uint32_t new_length =
+        static_cast<uint32_t>(Smi::cast(receiver->length())->value()) - 1;
+    Handle<Object> result =
+        ElementsAccessorSubclass::GetImpl(backing_store, new_length);
+    ElementsAccessorSubclass::SetLengthImpl(receiver, new_length,
+                                            backing_store);
+    return result;
+  }

   virtual void SetLength(Handle<JSArray> array, uint32_t length) final {
     ElementsAccessorSubclass::SetLengthImpl(array, length,
Index: src/elements.h
diff --git a/src/elements.h b/src/elements.h
index f5a9b3e23a6b306021254f83ef94c983dc3a0e6c..6022375e20d324080597738f72332b73f5b60c6d 100644
--- a/src/elements.h
+++ b/src/elements.h
@@ -145,6 +145,9 @@ class ElementsAccessor {
                                  uint32_t start, uint32_t delete_count,
                                  Arguments args, uint32_t add_count) = 0;

+  virtual Handle<Object> Pop(Handle<JSArray> receiver,
+                             Handle<FixedArrayBase> backing_store) = 0;
+
  protected:
   friend class LookupIterator;



--
--
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