OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 // Flags: --allow-natives-syntax --check-elimination | 28 // Flags: --allow-natives-syntax --check-elimination |
29 | 29 |
30 function A(x, y) { | 30 |
31 this.x = x; | 31 function test_empty() { |
32 this.y = y; | 32 function foo(o) { |
| 33 return { value: o.value }; |
| 34 } |
| 35 |
| 36 function Base() { |
| 37 this.v_ = 5; |
| 38 } |
| 39 Base.prototype.__defineGetter__("value", function() { return 1; }); |
| 40 |
| 41 var a = new Base(); |
| 42 a.a = 1; |
| 43 foo(a); |
| 44 |
| 45 Base.prototype.__defineGetter__("value", function() { return this.v_; }); |
| 46 |
| 47 var b = new Base(); |
| 48 b.b = 1; |
| 49 foo(b); |
| 50 |
| 51 var d = new Base(); |
| 52 d.d = 1; |
| 53 d.value; |
| 54 |
| 55 %OptimizeFunctionOnNextCall(foo); |
| 56 |
| 57 var o = foo(b); |
33 } | 58 } |
34 | 59 |
35 function B(x, y) { | 60 |
36 this.x = x; | 61 function test_narrow1() { |
37 this.y = y; | 62 function foo(o) { |
| 63 return { value: o.value }; |
| 64 } |
| 65 |
| 66 function Base() { |
| 67 this.v_ = 5; |
| 68 } |
| 69 Base.prototype.__defineGetter__("value", function() { return 1; }); |
| 70 |
| 71 var a = new Base(); |
| 72 a.a = 1; |
| 73 foo(a); |
| 74 |
| 75 Base.prototype.__defineGetter__("value", function() { return this.v_; }); |
| 76 |
| 77 var b = new Base(); |
| 78 b.b = 1; |
| 79 foo(b); |
| 80 |
| 81 var c = new Base(); |
| 82 c.c = 1; |
| 83 foo(c); |
| 84 |
| 85 var d = new Base(); |
| 86 d.d = 1; |
| 87 d.value; |
| 88 |
| 89 %OptimizeFunctionOnNextCall(foo); |
| 90 |
| 91 var o = foo(b); |
38 } | 92 } |
39 | 93 |
40 function F1(a, b) { | 94 |
41 if (a == b) return a.x; | 95 function test_narrow2() { |
42 else return b.x; | 96 function foo(o, flag) { |
| 97 return { value: o.value(flag) }; |
| 98 } |
| 99 |
| 100 function Base() { |
| 101 this.v_ = 5; |
| 102 } |
| 103 Base.prototype.value = function(flag) { return flag ? this.v_ : this.v_; }; |
| 104 |
| 105 |
| 106 var a = new Base(); |
| 107 a.a = 1; |
| 108 foo(a, false); |
| 109 foo(a, false); |
| 110 |
| 111 var b = new Base(); |
| 112 b.b = 1; |
| 113 foo(b, true); |
| 114 |
| 115 var c = new Base(); |
| 116 c.c = 1; |
| 117 foo(c, true); |
| 118 |
| 119 var d = new Base(); |
| 120 d.d = 1; |
| 121 d.value(true); |
| 122 |
| 123 %OptimizeFunctionOnNextCall(foo); |
| 124 |
| 125 var o = foo(b); |
43 } | 126 } |
44 | 127 |
45 function F2(a, b) { | 128 test_empty(); |
46 if (a == b) return a.x; | 129 test_narrow1(); |
47 else return b.x; | 130 test_narrow2(); |
48 } | |
49 | |
50 function F3(a, b) { | |
51 var f = a.y; | |
52 if (a == b) return a.x; | |
53 else return b.x; | |
54 } | |
55 | |
56 function F4(a, b) { | |
57 var f = b.y; | |
58 if (a == b) return a.x; | |
59 else return b.x; | |
60 } | |
61 | |
62 %NeverOptimizeFunction(test); | |
63 | |
64 function test(f, a, b) { | |
65 f(a, a); | |
66 f(a, b); | |
67 f(b, a); | |
68 f(b, c); | |
69 f(b, b); | |
70 f(c, c); | |
71 | |
72 %OptimizeFunctionOnNextCall(f) | |
73 | |
74 assertEquals(a.x, f(a, a)); | |
75 assertEquals(b.x, f(b, b)); | |
76 } | |
77 | |
78 var a = new A(3, 5); | |
79 var b = new B(2, 6); | |
80 var c = new A(1, 7); | |
81 | |
82 test(F1, a, c); | |
83 test(F2, a, b); | |
84 test(F3, a, b); | |
85 test(F4, a, b); | |
OLD | NEW |