Index: test/mjsunit/regress/regress-crbug-315252.js |
diff --git a/test/mjsunit/regress/regress-331416.js b/test/mjsunit/regress/regress-crbug-315252.js |
similarity index 62% |
copy from test/mjsunit/regress/regress-331416.js |
copy to test/mjsunit/regress/regress-crbug-315252.js |
index 0c60fced14e1c185919985fd011c9ca46d93ff3f..51454bf28586c7a26395a556af0300ffc719e1d5 100644 |
--- a/test/mjsunit/regress/regress-331416.js |
+++ b/test/mjsunit/regress/regress-crbug-315252.js |
@@ -27,26 +27,35 @@ |
// Flags: --allow-natives-syntax |
-function load(a, i) { |
- return a[i]; |
+function f(a, b, c) { |
+ this.a = a; |
+ this.b = b; |
+ this.c = c; |
} |
-load([1, 2, 3], "length"); |
-load(3); |
-load([1, 2, 3], 3); |
-load(0, 0); |
-%OptimizeFunctionOnNextCall(load); |
-assertEquals(2, load([1, 2, 3], 1)); |
-assertEquals(undefined, load(0, 0)); |
- |
-function store(a, i, x) { |
- a[i] = x; |
+var o3 = new f(1, 2, 3.5); |
+var o4 = new f(1, 2.5, 3); |
+var o1 = new f(1.5, 2, 3); |
+var o2 = new f(1.5, 2, 3); |
+function migrate(o) { |
+ return o.a; |
+} |
+// Use migrate to stabilize o1, o2 and o4 in [double, double, smi]. |
+migrate(o4); |
+migrate(o1); |
+migrate(o2); |
+function store_transition(o) { |
+ o.d = 1; |
} |
-store([1, 2, 3], "length", 3); |
-store(3); |
-store([1, 2, 3], 3, 3); |
-store(0, 0, 1); |
-%OptimizeFunctionOnNextCall(store); |
-var a = [1, 2, 3]; |
-store(a, 1, 1); |
-assertEquals(1, a[1]); |
-store(0, 0, 1); |
+// Optimize "store_transition" to transition from [double, double, smi] to |
+// [double, double, smi, smi]. This adds a dependency on the |
+// [double, double, smi] map. |
+store_transition(o4); |
+store_transition(o1); |
+store_transition(o2); |
+%OptimizeFunctionOnNextCall(store_transition); |
+// Pass in a deprecated object of format [smi, smi, double]. This will migrate |
+// the instance, forcing a merge with [double, double, smi], ending up with |
+// [double, double, double], which deprecates [double, double, smi] and |
+// deoptimizes all dependencies of [double, double, smi], including |
+// store_transition itself. |
+store_transition(o3); |