Index: test/mjsunit/regress/regress-4121.js |
diff --git a/test/mjsunit/regress/regress-4121.js b/test/mjsunit/regress/regress-4121.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3d777c26b355054d71cd0f0efea6a5e203af4b8a |
--- /dev/null |
+++ b/test/mjsunit/regress/regress-4121.js |
@@ -0,0 +1,55 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --allow-natives-syntax |
+ |
+function Migrator(o) { |
+ return o.foo; |
+} |
+function Loader(o) { |
+ return o[0]; |
+} |
+ |
+var first_smi_array = [1]; |
+var second_smi_array = [2]; |
+var first_object_array = ["first"]; |
+var second_object_array = ["string"]; |
+ |
+assertTrue(%HasFastSmiElements(first_smi_array)); |
+assertTrue(%HasFastSmiElements(second_smi_array)); |
+assertTrue(%HasFastObjectElements(first_object_array)); |
+assertTrue(%HasFastObjectElements(second_object_array)); |
+ |
+// Prepare identical transition chains for smi and object arrays. |
+first_smi_array.foo = 0; |
+second_smi_array.foo = 0; |
+first_object_array.foo = 0; |
+second_object_array.foo = 0; |
+ |
+// Collect type feedback for not-yet-deprecated original object array map. |
+for (var i = 0; i < 3; i++) Migrator(second_object_array); |
+ |
+// Blaze a migration trail for smi array maps. |
+// This marks the migrated smi array map as a migration target. |
+first_smi_array.foo = 0.5; |
+print(second_smi_array.foo); |
+ |
+// Deprecate original object array map. |
+// Use TryMigrate from deferred optimized code to migrate second object array. |
+first_object_array.foo = 0.5; |
+%OptimizeFunctionOnNextCall(Migrator); |
+Migrator(second_object_array); |
+ |
+// |second_object_array| now erroneously has a smi map. |
+// Optimized code assuming smi elements will expose this. |
+ |
+for (var i = 0; i < 3; i++) Loader(second_smi_array); |
+%OptimizeFunctionOnNextCall(Loader); |
+assertEquals("string", Loader(second_object_array)); |
+ |
+// Any of the following checks will also fail: |
+assertTrue(%HasFastObjectElements(second_object_array)); |
+assertFalse(%HasFastSmiElements(second_object_array)); |
+assertTrue(%HaveSameMap(first_object_array, second_object_array)); |
+assertFalse(%HaveSameMap(first_smi_array, second_object_array)); |