Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / v8 / test / mjsunit / field-type-tracking.js
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.
4
5 // Flags: --allow-natives-syntax --nostress-opt --track-field-types
6
7 (function() {
8   var o = { text: "Hello World!" };
9   function A() {
10     this.a = o;
11   }
12   function readA(x) {
13     return x.a;
14   }
15   var a = new A();
16   assertUnoptimized(readA);
17   readA(a); readA(a); readA(a);
18   %OptimizeFunctionOnNextCall(readA);
19   assertEquals(readA(a), o);
20   assertOptimized(readA);
21
22   var b = new A();
23   b.b = o;
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);
32
33   function readAFromB(x) {
34     return x.a;
35   }
36   assertUnoptimized(readAFromB);
37   readAFromB(b); readAFromB(b); readAFromB(b);
38   %OptimizeFunctionOnNextCall(readAFromB);
39   assertEquals(readAFromB(b), o);
40   assertOptimized(readAFromB);
41
42   var c = new A();
43   c.c = o;
44   assertOptimized(readA);
45   assertOptimized(readAFromB);
46   c.a = [1];
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);
53
54   %OptimizeFunctionOnNextCall(readA);
55   assertEquals(readA(a), o);
56   %OptimizeFunctionOnNextCall(readAFromB);
57   assertEquals(readAFromB(b), o);
58   assertOptimized(readA);
59   a.a = [1];
60   assertEquals(readA(a), [1]);
61   assertEquals(readA(b), o);
62   assertEquals(readA(c), [1]);
63   assertOptimized(readA);
64   b.a = [1];
65   assertEquals(readA(a), [1]);
66   assertEquals(readA(b), [1]);
67   assertEquals(readA(c), [1]);
68   assertOptimized(readA);
69   assertOptimized(readAFromB);
70 })();
71
72 (function() {
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(); }
77
78   B(new C());
79   B(new C());
80   %OptimizeFunctionOnNextCall(B);
81   var c = new C();
82   assertEquals(20, B(c));
83   assertOptimized(B);
84   c.a.y = 10;
85   assertEquals(10, B(c));
86   assertUnoptimized(B);
87
88   var c = new C();
89   %OptimizeFunctionOnNextCall(B);
90   assertEquals(20, B(c));
91   assertOptimized(B);
92   c.a.y = 30;
93   assertEquals(30, B(c));
94   assertOptimized(B);
95 })();
96
97 (function() {
98   var x = new Object();
99   x.a = 1 + "Long string that results in a cons string";
100   x = JSON.parse('{"a":"Short"}');
101 })();
102
103 (function() {
104   var x = {y: {z: 1}};
105   x.y.z = 1.1;
106 })();
107
108 (function() {
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; }
121   writeX(f1, {x: 11});
122   writeX(f2, {x: 22});
123   assertUnoptimized(writeX);
124   assertEquals(readX(f1), 11);
125   assertEquals(readX(f2), 22);
126   assertOptimized(readX);
127   %OptimizeFunctionOnNextCall(writeX);
128   writeX(f3, {x: 33});
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);
136 })();
137
138 (function() {
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; }
144   baz(f1, {y: 9});
145   baz(f2, {y: 9});
146   %OptimizeFunctionOnNextCall(baz);
147   baz(f3, {a: -1});
148   assertUnoptimized(baz);
149 })();
150
151 (function() {
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);
165   f.a.y = 0;
166   assertUnoptimized(readA);
167 })();