Index: test/mjsunit/regress/regress-4325.js |
diff --git a/test/mjsunit/regress/regress-4325.js b/test/mjsunit/regress/regress-4325.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e88bdd3b082c304928cbd56d2ccfe28154e817d6 |
--- /dev/null |
+++ b/test/mjsunit/regress/regress-4325.js |
@@ -0,0 +1,48 @@ |
+// 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 --expose-gc |
+ |
+function Inner() { |
+ this.p1 = 0; |
+ this.p2 = 3; |
+} |
+ |
+function Outer() { |
+ this.p3 = 0; |
+} |
+ |
+var i1 = new Inner(); |
+var i2 = new Inner(); |
+var o1 = new Outer(); |
+o1.inner = i1; |
+// o1.map now thinks "inner" has type Inner.map1. |
+// Deprecate Inner.map1: |
+i1.p1 = 0.5; |
+// Let Inner.map1 die by migrating i2 to Inner.map2: |
+print(i2.p1); |
+gc(); |
+// o1.map's descriptor for "inner" is now a cleared WeakCell; |
+// o1.inner's actual map is Inner.map2. |
+// Prepare Inner.map3, deprecating Inner.map2. |
+i2.p2 = 0.5; |
+// Deprecate o1's map. |
+var o2 = new Outer(); |
+o2.p3 = 0.5; |
+o2.inner = i2; |
+// o2.map (Outer.map2) now says that o2.inner's type is Inner.map3. |
+// Migrate o1 to Outer.map2. |
+print(o1.p3); |
+// o1.map now thinks that o1.inner has map Inner.map3 just like o2.inner, |
+// but in fact o1.inner.map is still Inner.map2! |
+ |
+function loader(o) { |
+ return o.inner.p2; |
+} |
+loader(o2); |
+loader(o2); |
+%OptimizeFunctionOnNextCall(loader); |
+assertEquals(0.5, loader(o2)); |
+assertEquals(3, loader(o1)); |
+gc(); // Crashes with --verify-heap. |