Index: test/mjsunit/compiler/escape-analysis.js |
diff --git a/test/mjsunit/compiler/escape-analysis.js b/test/mjsunit/compiler/escape-analysis.js |
index dccc476925788ab0057d698f670cf0bbf33299f0..b12e7bfca0af1016dfa03cdebbb2924983f5f54f 100644 |
--- a/test/mjsunit/compiler/escape-analysis.js |
+++ b/test/mjsunit/compiler/escape-analysis.js |
@@ -303,6 +303,101 @@ |
})(); |
+// Test non-shallow nested graph of captured objects with duplicates |
+(function testDeepDuplicate() { |
+ function constructor1() { |
+ this.x = 23; |
+ } |
+ function constructor2(nested) { |
+ this.a = 17; |
+ this.b = nested; |
+ this.c = 42; |
+ } |
+ function deep(shouldDeopt) { |
+ var o1 = new constructor1(); |
+ var o2 = new constructor2(o1); |
+ var o3 = new constructor2(o1); |
+ assertEquals(17, o2.a); |
+ assertEquals(23, o2.b.x); |
+ assertEquals(42, o2.c); |
+ o3.c = 54; |
+ o1.x = 99; |
+ if (shouldDeopt) %DeoptimizeFunction(deep); |
+ assertEquals(99, o1.x); |
+ assertEquals(99, o2.b.x); |
+ assertEquals(99, o3.b.x); |
+ assertEquals(54, o3.c); |
+ assertEquals(17, o3.a); |
+ assertEquals(42, o2.c); |
+ assertEquals(17, o2.a); |
+ o3.b.x = 1; |
+ assertEquals(1, o1.x); |
+ } |
+ deep(false); deep(false); |
+ %OptimizeFunctionOnNextCall(deep); |
+ deep(false); deep(false); |
+ deep(true); deep(true); |
+})(); |
+ |
+ |
+// Test non-shallow nested graph of captured objects with inline |
+(function testDeepInline() { |
+ function h() { |
+ return { y : 3 }; |
+ } |
+ |
+ function g(x) { |
+ var u = { x : h() }; |
+ %DeoptimizeFunction(f); |
+ return u; |
+ } |
+ |
+ function f() { |
+ var l = { dummy : { } }; |
+ var r = g(l); |
+ assertEquals(3, r.x.y); |
+ } |
+ |
+ f(); f(); f(); |
+ %OptimizeFunctionOnNextCall(f); |
+ f(); |
+})(); |
+ |
+ |
+// Test two nested objects |
+(function testTwoNestedObjects() { |
+ function f() { |
+ var l = { x : { y : 111 } }; |
+ var l2 = { x : { y : 111 } }; |
+ %DeoptimizeFunction(f); |
+ assertEquals(111, l.x.y); |
+ assertEquals(111, l2.x.y); |
+ } |
+ |
+ f(); f(); f(); |
+ %OptimizeFunctionOnNextCall(f); |
+ f(); |
+})(); |
+ |
+ |
+// Test a nested object and a duplicate |
+(function testTwoObjectsWithDuplicate() { |
+ function f() { |
+ var l = { x : { y : 111 } }; |
+ var dummy = { d : 0 }; |
+ var l2 = l.x; |
+ %DeoptimizeFunction(f); |
+ assertEquals(111, l.x.y); |
+ assertEquals(111, l2.y); |
+ assertEquals(0, dummy.d); |
+ } |
+ |
+ f(); f(); f(); |
+ %OptimizeFunctionOnNextCall(f); |
+ f(); |
+})(); |
+ |
+ |
// Test materialization of a field that requires a Smi value. |
(function testSmiField() { |
var deopt = { deopt:false }; |