Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / v8 / test / mjsunit / compiler / escape-analysis-arguments.js
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 // Flags: --allow-natives-syntax --use-escape-analysis --expose-gc
29
30
31 // Simple test of capture
32 (function testCapturedArguments() {
33   function h() {
34     return g.arguments[0];
35   }
36
37   function g(x) {
38     return h();
39   }
40
41   function f() {
42     var l = { y : { z : 4 }, x : 2 }
43     var r = g(l);
44     assertEquals(2, r.x);
45     assertEquals(2, l.x);
46     l.x = 3;
47     l.y.z = 5;
48     // Test that the arguments object is properly
49     // aliased
50     assertEquals(3, r.x);
51     assertEquals(3, l.x);
52     assertEquals(5, r.y.z);
53   }
54
55   f(); f(); f();
56   %OptimizeFunctionOnNextCall(f);
57   f();
58 })();
59
60
61 // Get the arguments object twice, test aliasing
62 (function testTwoCapturedArguments() {
63   function h() {
64     return g.arguments[0];
65   }
66
67   function i() {
68     return g.arguments[0];
69   }
70
71   function g(x) {
72     return {h : h() , i : i()};
73   }
74
75   function f() {
76     var l = { y : { z : 4 }, x : 2 }
77     var r = g(l);
78     assertEquals(2, r.h.x)
79     l.y.z = 3;
80     assertEquals(3, r.h.y.z);
81     assertEquals(3, r.i.y.z);
82   }
83
84   f(); f(); f();
85   %OptimizeFunctionOnNextCall(f);
86   f();
87 })();
88
89
90 // Nested arguments object test
91 (function testTwoCapturedArgumentsNested() {
92   function i() {
93     return { gx : g.arguments[0], hx : h.arguments[0] };
94   }
95
96   function h(x) {
97     return i();
98   }
99
100   function g(x) {
101     return h(x.y);
102   }
103
104   function f() {
105     var l = { y : { z : 4 }, x : 2 }
106     var r = g(l);
107     assertEquals(2, r.gx.x)
108     assertEquals(4, r.gx.y.z)
109     assertEquals(4, r.hx.z)
110     l.y.z = 3;
111     assertEquals(3, r.gx.y.z)
112     assertEquals(3, r.hx.z)
113     assertEquals(3, l.y.z)
114   }
115
116   f(); f(); f();
117   %OptimizeFunctionOnNextCall(f);
118   f(); f();
119   %OptimizeFunctionOnNextCall(f);
120   f(); f();
121 })();
122
123
124 // Nested arguments object test with different inlining
125 (function testTwoCapturedArgumentsNested2() {
126   function i() {
127     return { gx : g.arguments[0], hx : h.arguments[0] };
128   }
129
130   function h(x) {
131     return i();
132   }
133
134   function g(x) {
135     return h(x.y);
136   }
137
138   function f() {
139     var l = { y : { z : 4 }, x : 2 }
140     var r = g(l);
141     assertEquals(2, r.gx.x)
142     assertEquals(4, r.gx.y.z)
143     assertEquals(4, r.hx.z)
144     l.y.z = 3;
145     assertEquals(3, r.gx.y.z)
146     assertEquals(3, r.hx.z)
147     assertEquals(3, l.y.z)
148   }
149
150   %NeverOptimizeFunction(i);
151   f(); f(); f();
152   %OptimizeFunctionOnNextCall(f);
153   f(); f();
154   %OptimizeFunctionOnNextCall(f);
155   f(); f();
156 })();
157
158
159 // Multiple captured argument test
160 (function testTwoArgumentsCapture() {
161   function h() {
162     return { a : g.arguments[1], b : g.arguments[0] };
163   }
164
165   function g(x, y) {
166     return h();
167   }
168
169   function f() {
170     var l = { y : { z : 4 }, x : 2 }
171     var k = { t : { u : 3 } };
172     var r = g(k, l);
173     assertEquals(2, r.a.x)
174     assertEquals(4, r.a.y.z)
175     assertEquals(3, r.b.t.u)
176     l.y.z = 6;
177     r.b.t.u = 7;
178     assertEquals(6, r.a.y.z)
179     assertEquals(7, k.t.u)
180   }
181
182   f(); f(); f();
183   %OptimizeFunctionOnNextCall(f);
184   f(); f();
185   %OptimizeFunctionOnNextCall(f);
186   f(); f();
187 })();