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})(); 168