Revision: 20513
Author:   [email protected]
Date:     Fri Apr  4 13:05:37 2014 UTC
Log: Callers of ElementsAccessor::AddElementsToFixedArray(), ElementsAccessor::HasElement() and ElementsAccessor::GetKeyForIndex() handlified.

[email protected]

Review URL: https://codereview.chromium.org/225623004
http://code.google.com/p/v8/source/detail?r=20513

Modified:
 /branches/bleeding_edge/src/builtins.cc
 /branches/bleeding_edge/src/elements.cc
 /branches/bleeding_edge/src/elements.h
 /branches/bleeding_edge/src/handles.cc
 /branches/bleeding_edge/src/handles.h
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h
 /branches/bleeding_edge/src/runtime.cc

=======================================
--- /branches/bleeding_edge/src/builtins.cc     Fri Apr  4 08:17:23 2014 UTC
+++ /branches/bleeding_edge/src/builtins.cc     Fri Apr  4 13:05:37 2014 UTC
@@ -515,7 +515,7 @@
   ElementsAccessor* accessor = array->GetElementsAccessor();
   int new_length = len - 1;
   Handle<Object> element;
-  if (accessor->HasElement(*array, *array, new_length, *elms_obj)) {
+  if (accessor->HasElement(array, array, new_length, elms_obj)) {
     element = accessor->Get(
         array, array, new_length, elms_obj);
   } else {
@@ -756,7 +756,7 @@
     bool packed = true;
     ElementsAccessor* accessor = ElementsAccessor::ForKind(kind);
     for (int i = k; i < final; i++) {
-      if (!accessor->HasElement(*object, *object, i, *elms)) {
+      if (!accessor->HasElement(object, object, i, elms)) {
         packed = false;
         break;
       }
=======================================
--- /branches/bleeding_edge/src/elements.cc     Thu Apr  3 09:12:59 2014 UTC
+++ /branches/bleeding_edge/src/elements.cc     Fri Apr  4 13:05:37 2014 UTC
@@ -622,15 +622,14 @@
         receiver, holder, key, backing_store) != ABSENT;
   }

-  virtual bool HasElement(Object* receiver,
-                          JSObject* holder,
-                          uint32_t key,
- FixedArrayBase* backing_store) V8_FINAL V8_OVERRIDE {
-    if (backing_store == NULL) {
-      backing_store = holder->elements();
-    }
+  virtual bool HasElement(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      uint32_t key,
+      Handle<FixedArrayBase> backing_store) V8_FINAL V8_OVERRIDE {
+    // TODO(ishell): Handlify HasElementImpl().
     return ElementsAccessorSubclass::HasElementImpl(
-        receiver, holder, key, backing_store);
+        *receiver, *holder, key, *backing_store);
   }

   // TODO(ishell): Temporary wrapper until handlified.
@@ -830,11 +829,25 @@
         from, from_start, to, from_kind, to_start, packed_size, copy_size);
   }

-  MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray(
+  virtual Handle<FixedArray> AddElementsToFixedArray(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      Handle<FixedArray> to,
+      Handle<FixedArrayBase> from) V8_FINAL V8_OVERRIDE {
+    CALL_HEAP_FUNCTION(to->GetIsolate(),
+                       AddElementsToFixedArray(
+                           receiver.is_null() ? NULL : *receiver,
+                           holder.is_null() ? NULL : *holder,
+                           *to,
+                           *from),
+                       FixedArray);
+  }
+
+  static MUST_USE_RESULT MaybeObject* AddElementsToFixedArray(
       Object* receiver,
       JSObject* holder,
       FixedArray* to,
-      FixedArrayBase* from) V8_FINAL V8_OVERRIDE {
+      FixedArrayBase* from) {
     int len0 = to->length();
 #ifdef ENABLE_SLOW_ASSERTS
     if (FLAG_enable_slow_asserts) {
@@ -843,9 +856,6 @@
       }
     }
 #endif
-    if (from == NULL) {
-      from = holder->elements();
-    }

     // Optimize if 'other' is empty.
     // We cannot optimize if 'this' is empty, as other may have holes.
@@ -922,9 +932,9 @@
     return index;
   }

-  virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
+  virtual uint32_t GetKeyForIndex(Handle<FixedArrayBase> backing_store,
                                   uint32_t index) V8_FINAL V8_OVERRIDE {
- return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index); + return ElementsAccessorSubclass::GetKeyForIndexImpl(*backing_store, index);
   }

  private:
@@ -1668,6 +1678,7 @@
         SeededNumberDictionary::kNotFound;
   }

+  // TODO(ishell): Handlify when all callers are handlified.
   static uint32_t GetKeyForIndexImpl(FixedArrayBase* store,
                                      uint32_t index) {
     SeededNumberDictionary* dict = SeededNumberDictionary::cast(store);
@@ -1825,6 +1836,7 @@
                ForArray(arguments)->GetCapacity(arguments));
   }

+  // TODO(ishell): Handlify when all callers are handlified.
   static uint32_t GetKeyForIndexImpl(FixedArrayBase* dict,
                                      uint32_t index) {
     return index;
=======================================
--- /branches/bleeding_edge/src/elements.h      Thu Apr  3 09:12:59 2014 UTC
+++ /branches/bleeding_edge/src/elements.h      Fri Apr  4 13:05:37 2014 UTC
@@ -55,10 +55,18 @@
// in the backing store to use for the check, which must be compatible with // the ElementsKind of the ElementsAccessor. If backing_store is NULL, the
   // holder->elements() is used as the backing store.
-  virtual bool HasElement(Object* receiver,
-                          JSObject* holder,
-                          uint32_t key,
-                          FixedArrayBase* backing_store = NULL) = 0;
+  virtual bool HasElement(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      uint32_t key,
+      Handle<FixedArrayBase> backing_store) = 0;
+
+  inline bool HasElement(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      uint32_t key) {
+    return HasElement(receiver, holder, key, handle(holder->elements()));
+  }

// Returns the element with the specified key or undefined if there is no such // element. This method doesn't iterate up the prototype chain. The caller
@@ -181,11 +189,19 @@
       *from_holder, 0, from_kind, to, 0, kCopyToEndAndInitializeToHole);
   }

-  MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray(
-      Object* receiver,
-      JSObject* holder,
-      FixedArray* to,
-      FixedArrayBase* from = NULL) = 0;
+  virtual Handle<FixedArray> AddElementsToFixedArray(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      Handle<FixedArray> to,
+      Handle<FixedArrayBase> from) = 0;
+
+  inline Handle<FixedArray> AddElementsToFixedArray(
+      Handle<Object> receiver,
+      Handle<JSObject> holder,
+      Handle<FixedArray> to) {
+    return AddElementsToFixedArray(
+        receiver, holder, to, handle(holder->elements()));
+  }

   // Returns a shared ElementsAccessor for the specified ElementsKind.
   static ElementsAccessor* ForKind(ElementsKind elements_kind) {
@@ -193,6 +209,10 @@
     return elements_accessors_[elements_kind];
   }

+  // TODO(ishell): Temporary wrapper until handlified.
+  inline static ElementsAccessor* ForArray(Handle<FixedArrayBase> array) {
+    return ForArray(*array);
+  }
   static ElementsAccessor* ForArray(FixedArrayBase* array);

   static void InitializeOncePerProcess();
@@ -211,7 +231,7 @@
// keys are equivalent to indexes, and GetKeyForIndex returns the same value // it is passed. In the NumberDictionary ElementsAccessor, GetKeyForIndex maps
   // the index to a key using the KeyAt method on the NumberDictionary.
-  virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
+  virtual uint32_t GetKeyForIndex(Handle<FixedArrayBase> backing_store,
                                   uint32_t index) = 0;

  private:
=======================================
--- /branches/bleeding_edge/src/handles.cc      Fri Apr  4 12:06:11 2014 UTC
+++ /branches/bleeding_edge/src/handles.cc      Fri Apr  4 13:05:37 2014 UTC
@@ -122,20 +122,6 @@
 Address HandleScope::current_limit_address(Isolate* isolate) {
   return reinterpret_cast<Address>(&isolate->handle_scope_data()->limit);
 }
-
-
-Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content,
-                                      Handle<JSArray> array) {
-  CALL_HEAP_FUNCTION(content->GetIsolate(),
-                     content->AddKeysFromJSArray(*array), FixedArray);
-}
-
-
-Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first,
-                               Handle<FixedArray> second) {
-  CALL_HEAP_FUNCTION(first->GetIsolate(),
-                     first->UnionOfKeys(*second), FixedArray);
-}


 Handle<JSGlobalProxy> ReinitializeJSGlobalProxy(
@@ -512,7 +498,8 @@
                                              args,
                                              threw);
       if (*threw) return content;
-      content = AddKeysFromJSArray(content, Handle<JSArray>::cast(names));
+      content = FixedArray::AddKeysFromJSArray(content,
+ Handle<JSArray>::cast(names));
       break;
     }

@@ -535,7 +522,7 @@
     Handle<FixedArray> element_keys =
         isolate->factory()->NewFixedArray(current->NumberOfEnumElements());
     current->GetEnumElementKeys(*element_keys);
-    content = UnionOfKeys(content, element_keys);
+    content = FixedArray::UnionOfKeys(content, element_keys);
     ASSERT(ContainsOnlyValidKeys(content));

     // Add the element keys from the interceptor.
@@ -543,7 +530,8 @@
       v8::Handle<v8::Array> result =
           GetKeysForIndexedInterceptor(object, current);
       if (!result.IsEmpty())
- content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
+        content = FixedArray::AddKeysFromJSArray(
+            content, v8::Utils::OpenHandle(*result));
       ASSERT(ContainsOnlyValidKeys(content));
     }

@@ -564,8 +552,8 @@
          !current->HasNamedInterceptor() &&
          !current->HasIndexedInterceptor());
     // Compute the property keys and cache them if possible.
-    content =
- UnionOfKeys(content, GetEnumPropertyKeys(current, cache_enum_keys));
+    content = FixedArray::UnionOfKeys(
+        content, GetEnumPropertyKeys(current, cache_enum_keys));
     ASSERT(ContainsOnlyValidKeys(content));

     // Add the property keys from the interceptor.
@@ -573,7 +561,8 @@
       v8::Handle<v8::Array> result =
           GetKeysForNamedInterceptor(object, current);
       if (!result.IsEmpty())
- content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
+        content = FixedArray::AddKeysFromJSArray(
+            content, v8::Utils::OpenHandle(*result));
       ASSERT(ContainsOnlyValidKeys(content));
     }

=======================================
--- /branches/bleeding_edge/src/handles.h       Fri Apr  4 12:06:11 2014 UTC
+++ /branches/bleeding_edge/src/handles.h       Fri Apr  4 13:05:37 2014 UTC
@@ -305,9 +305,6 @@
 Handle<String> LookupSingleCharacterStringFromCode(Isolate* isolate,
                                                    uint32_t index);

-Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray>,
-                                      Handle<JSArray> array);
-
 // Get the JS object corresponding to the given script; create it
 // if none exists.
 Handle<JSValue> GetScriptWrapper(Handle<Script> script);
@@ -344,11 +341,6 @@
 Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object,
                                        bool cache_result);

-// Computes the union of keys and return the result.
-// Used for implementing "for (n in object) { }"
-Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first,
-                               Handle<FixedArray> second);
-
 Handle<JSGlobalProxy> ReinitializeJSGlobalProxy(
     Handle<JSFunction> constructor,
     Handle<JSGlobalProxy> global);
=======================================
--- /branches/bleeding_edge/src/objects.cc      Fri Apr  4 12:25:45 2014 UTC
+++ /branches/bleeding_edge/src/objects.cc      Fri Apr  4 13:05:37 2014 UTC
@@ -7906,14 +7906,15 @@
 }


-MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) {
+Handle<FixedArray> FixedArray::AddKeysFromJSArray(Handle<FixedArray> content,
+                                                  Handle<JSArray> array) {
   ElementsAccessor* accessor = array->GetElementsAccessor();
-  MaybeObject* maybe_result =
-      accessor->AddElementsToFixedArray(array, array, this);
-  FixedArray* result;
-  if (!maybe_result->To<FixedArray>(&result)) return maybe_result;
+  Handle<FixedArray> result =
+      accessor->AddElementsToFixedArray(array, array, content);
+
 #ifdef ENABLE_SLOW_ASSERTS
   if (FLAG_enable_slow_asserts) {
+    DisallowHeapAllocation no_allocation;
     for (int i = 0; i < result->length(); i++) {
       Object* current = result->get(i);
       ASSERT(current->IsNumber() || current->IsName());
@@ -7924,14 +7925,19 @@
 }


-MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) {
-  ElementsAccessor* accessor = ElementsAccessor::ForArray(other);
-  MaybeObject* maybe_result =
-      accessor->AddElementsToFixedArray(NULL, NULL, this, other);
-  FixedArray* result;
-  if (!maybe_result->To(&result)) return maybe_result;
+Handle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first,
+                                           Handle<FixedArray> second) {
+  ElementsAccessor* accessor = ElementsAccessor::ForArray(second);
+  Handle<FixedArray> result =
+      accessor->AddElementsToFixedArray(
+          Handle<Object>::null(),     // receiver
+          Handle<JSObject>::null(),   // holder
+          first,
+          Handle<FixedArrayBase>::cast(second));
+
 #ifdef ENABLE_SLOW_ASSERTS
   if (FLAG_enable_slow_asserts) {
+    DisallowHeapAllocation no_allocation;
     for (int i = 0; i < result->length(); i++) {
       Object* current = result->get(i);
       ASSERT(current->IsNumber() || current->IsName());
=======================================
--- /branches/bleeding_edge/src/objects.h       Fri Apr  4 12:25:45 2014 UTC
+++ /branches/bleeding_edge/src/objects.h       Fri Apr  4 13:05:37 2014 UTC
@@ -3060,10 +3060,13 @@
PretenureFlag pretenure = NOT_TENURED);

   // Add the elements of a JSArray to this FixedArray.
-  MUST_USE_RESULT MaybeObject* AddKeysFromJSArray(JSArray* array);
+  static Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content,
+                                               Handle<JSArray> array);

-  // Compute the union of this and other.
-  MUST_USE_RESULT MaybeObject* UnionOfKeys(FixedArray* other);
+  // Computes the union of keys and return the result.
+  // Used for implementing "for (n in object) { }"
+  static Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first,
+                                        Handle<FixedArray> second);

   // Copy a sub array from the receiver to dest.
   void CopyTo(int pos, FixedArray* dest, int dest_pos, int len);
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Fri Apr  4 12:25:45 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc      Fri Apr  4 13:05:37 2014 UTC
@@ -10716,7 +10716,7 @@
           isolate->factory()->NewFixedArray(
               current->NumberOfLocalElements(NONE));
       current->GetLocalElementKeys(*current_keys, NONE);
-      keys = UnionOfKeys(keys, current_keys);
+      keys = FixedArray::UnionOfKeys(keys, current_keys);
     }
     // Erase any keys >= length.
     // TODO(adamk): Remove this step when the contract of %GetArrayKeys

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