Revision: 21466
Author:   [email protected]
Date:     Fri May 23 14:01:17 2014 UTC
Log:      Check for cached transition to ExternalArray elements kind.

[email protected], [email protected]
BUG=v8:3337
LOG=Y

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

Modified:
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/src/objects.cc      Fri May 23 09:30:47 2014 UTC
+++ /branches/bleeding_edge/src/objects.cc      Fri May 23 14:01:17 2014 UTC
@@ -3379,9 +3379,16 @@
       ? to_kind
       : TERMINAL_FAST_ELEMENTS_KIND;

-  // Support for legacy API.
+  // Support for legacy API: SetIndexedPropertiesTo{External,Pixel}Data
+  // allows to change elements from arbitrary kind to any ExternalArray
+  // elements kind. Satisfy its requirements, checking whether we already
+  // have the cached transition.
   if (IsExternalArrayElementsKind(to_kind) &&
       !IsFixedTypedArrayElementsKind(map->elements_kind())) {
+    if (map->HasElementsTransition()) {
+        Map* next_map = map->elements_transition_map();
+        if (next_map->elements_kind() == to_kind) return next_map;
+    }
     return map;
   }

=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc Fri May 23 11:12:25 2014 UTC +++ /branches/bleeding_edge/test/cctest/test-api.cc Fri May 23 14:01:17 2014 UTC
@@ -21355,6 +21355,23 @@
              "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
              "load(o); load(o); load(o); load(o);");
 }
+
+
+THREADED_TEST(Regress3337) {
+  LocalContext context;
+  v8::Isolate* isolate = context->GetIsolate();
+  v8::HandleScope scope(isolate);
+  Local<v8::Object> o1 = Object::New(isolate);
+  Local<v8::Object> o2 = Object::New(isolate);
+  i::Handle<i::JSObject> io1 = v8::Utils::OpenHandle(*o1);
+  i::Handle<i::JSObject> io2 = v8::Utils::OpenHandle(*o2);
+  CHECK(io1->map() == io2->map());
+  o1->SetIndexedPropertiesToExternalArrayData(
+      NULL, v8::kExternalUint32Array, 0);
+  o2->SetIndexedPropertiesToExternalArrayData(
+      NULL, v8::kExternalUint32Array, 0);
+  CHECK(io1->map() == io2->map());
+}


 THREADED_TEST(Regress137496) {

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