OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // Flags: --allow-natives-syntax --expose-gc |
| 6 |
| 7 function Inner() { |
| 8 this.p1 = 0; |
| 9 this.p2 = 3; |
| 10 } |
| 11 |
| 12 function Outer() { |
| 13 this.p3 = 0; |
| 14 } |
| 15 |
| 16 var i1 = new Inner(); |
| 17 var i2 = new Inner(); |
| 18 var o1 = new Outer(); |
| 19 o1.inner = i1; |
| 20 // o1.map now thinks "inner" has type Inner.map1. |
| 21 // Deprecate Inner.map1: |
| 22 i1.p1 = 0.5; |
| 23 // Let Inner.map1 die by migrating i2 to Inner.map2: |
| 24 print(i2.p1); |
| 25 gc(); |
| 26 // o1.map's descriptor for "inner" is now a cleared WeakCell; |
| 27 // o1.inner's actual map is Inner.map2. |
| 28 // Prepare Inner.map3, deprecating Inner.map2. |
| 29 i2.p2 = 0.5; |
| 30 // Deprecate o1's map. |
| 31 var o2 = new Outer(); |
| 32 o2.p3 = 0.5; |
| 33 o2.inner = i2; |
| 34 // o2.map (Outer.map2) now says that o2.inner's type is Inner.map3. |
| 35 // Migrate o1 to Outer.map2. |
| 36 print(o1.p3); |
| 37 // o1.map now thinks that o1.inner has map Inner.map3 just like o2.inner, |
| 38 // but in fact o1.inner.map is still Inner.map2! |
| 39 |
| 40 function loader(o) { |
| 41 return o.inner.p2; |
| 42 } |
| 43 loader(o2); |
| 44 loader(o2); |
| 45 %OptimizeFunctionOnNextCall(loader); |
| 46 assertEquals(0.5, loader(o2)); |
| 47 assertEquals(3, loader(o1)); |
| 48 gc(); // Crashes with --verify-heap. |
OLD | NEW |