1 // Copyright 2014 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.
5 // Flags: --allow-natives-syntax --nostress-opt --track-field-types
8 var o = { text: "Hello World!" };
16 assertUnoptimized(readA);
17 readA(a); readA(a); readA(a);
18 %OptimizeFunctionOnNextCall(readA);
19 assertEquals(readA(a), o);
20 assertOptimized(readA);
24 assertEquals(readA(b), o);
25 assertUnoptimized(readA);
26 %OptimizeFunctionOnNextCall(readA);
27 assertEquals(readA(a), o);
28 assertOptimized(readA);
29 assertEquals(readA(a), o);
30 assertEquals(readA(b), o);
31 assertOptimized(readA);
33 function readAFromB(x) {
36 assertUnoptimized(readAFromB);
37 readAFromB(b); readAFromB(b); readAFromB(b);
38 %OptimizeFunctionOnNextCall(readAFromB);
39 assertEquals(readAFromB(b), o);
40 assertOptimized(readAFromB);
44 assertOptimized(readA);
45 assertOptimized(readAFromB);
47 assertUnoptimized(readA);
48 assertUnoptimized(readAFromB);
49 assertEquals(readA(a), o);
50 assertEquals(readA(b), o);
51 assertEquals(readA(c), [1]);
52 assertEquals(readAFromB(b), o);
54 %OptimizeFunctionOnNextCall(readA);
55 assertEquals(readA(a), o);
56 %OptimizeFunctionOnNextCall(readAFromB);
57 assertEquals(readAFromB(b), o);
58 assertOptimized(readA);
60 assertEquals(readA(a), [1]);
61 assertEquals(readA(b), o);
62 assertEquals(readA(c), [1]);
63 assertOptimized(readA);
65 assertEquals(readA(a), [1]);
66 assertEquals(readA(b), [1]);
67 assertEquals(readA(c), [1]);
68 assertOptimized(readA);
69 assertOptimized(readAFromB);
73 function A() { this.x = 0; }
74 A.prototype = {y: 20};
75 function B(o) { return o.a.y; }
76 function C() { this.a = new A(); }
80 %OptimizeFunctionOnNextCall(B);
82 assertEquals(20, B(c));
85 assertEquals(10, B(c));
89 %OptimizeFunctionOnNextCall(B);
90 assertEquals(20, B(c));
93 assertEquals(30, B(c));
99 x.a = 1 + "Long string that results in a cons string";
100 x = JSON.parse('{"a":"Short"}');
109 function Foo(x) { this.x = x; }
110 var f1 = new Foo({x: 1});
111 var f2 = new Foo({x: 2});
112 var f3 = new Foo({x: 3});
113 function readX(f) { return f.x.x; }
114 assertEquals(readX(f1), 1);
115 assertEquals(readX(f2), 2);
116 assertUnoptimized(readX);
117 %OptimizeFunctionOnNextCall(readX);
118 assertEquals(readX(f3), 3);
119 assertOptimized(readX);
120 function writeX(f, x) { f.x = x; }
123 assertUnoptimized(writeX);
124 assertEquals(readX(f1), 11);
125 assertEquals(readX(f2), 22);
126 assertOptimized(readX);
127 %OptimizeFunctionOnNextCall(writeX);
129 assertEquals(readX(f3), 33);
130 assertOptimized(readX);
131 assertOptimized(writeX);
132 function addY(f, y) { f.y = y; }
133 writeX(f1, {a: "a"});
134 assertUnoptimized(readX);
135 assertUnoptimized(writeX);
139 function Narf(x) { this.x = x; }
140 var f1 = new Narf(1);
141 var f2 = new Narf(2);
142 var f3 = new Narf(3);
143 function baz(f, y) { f.y = y; }
146 %OptimizeFunctionOnNextCall(baz);
148 assertUnoptimized(baz);
152 function Foo(x) { this.x = x; this.a = x; }
153 function Bar(x) { this.x = x; this.b = x; }
154 function readA(o) { return o.x.a; }
155 var f = new Foo({a:1});
156 var b = new Bar({a:2});
157 assertEquals(readA(f), 1);
158 assertEquals(readA(b), 2);
159 assertEquals(readA(f), 1);
160 assertEquals(readA(b), 2);
161 %OptimizeFunctionOnNextCall(readA);
162 assertEquals(readA(f), 1);
163 assertEquals(readA(b), 2);
164 assertOptimized(readA);
166 assertUnoptimized(readA);