fpizlo@apple.com | 05b1b22 | 2016-01-07 22:59:43 +0000 | [diff] [blame] | 1 | function foo(o, p) { |
| 2 | var x = 100; |
| 3 | var result = 101; |
| 4 | x = 102; |
| 5 | p = 103; |
| 6 | o.f = x + p; |
| 7 | o = 104; |
| 8 | p = 105; |
| 9 | x = 106; |
| 10 | return {outcome: "return", values: [o, p, x]}; |
| 11 | } |
| 12 | |
| 13 | noInline(foo); |
| 14 | |
| 15 | // Warm up foo() with polymorphic objects and getters. |
| 16 | for (var i = 0; i < 100000; ++i) { |
| 17 | var o = {}; |
| 18 | o.__defineSetter__("f", function(value) { |
| 19 | this._f = value; |
| 20 | }); |
| 21 | if (i & 1) |
| 22 | o["i" + i] = i; // Make it polymorphic. |
| 23 | var result = foo(o); |
| 24 | if (result.outcome !== "return") |
| 25 | throw "Error in loop: bad outcome: " + result.outcome; |
| 26 | if (result.values.length !== 3) |
| 27 | throw "Error in loop: bad number of values: " + result.values.length; |
| 28 | if (result.values[0] !== 104) |
| 29 | throw "Error in loop: bad values[0]: " + result.values[0]; |
| 30 | if (result.values[1] !== 105) |
| 31 | throw "Error in loop: bad values[1]: " + result.values[1]; |
| 32 | if (result.values[2] !== 106) |
| 33 | throw "Error in loop: bad values[2]: " + result.values[2]; |
| 34 | if (o._f != 102 + 103) |
| 35 | throw "Error in loop: bad value of o._f: " + o._f; |
| 36 | } |
| 37 | |
| 38 | // Now throw an exception. |
| 39 | var result; |
| 40 | try { |
| 41 | var o = {}; |
| 42 | o.__defineSetter__("f", function() { |
| 43 | throw "Error42"; |
| 44 | }); |
| 45 | result = foo(o, 108); |
| 46 | } catch (e) { |
| 47 | if (e != "Error42") |
| 48 | throw "Error at end: bad exception: " + e; |
| 49 | result = {outcome: "exception"}; |
| 50 | } |
| 51 | if (result.outcome !== "exception") |
| 52 | throw "Error at end: bad outcome: " + result.outcome; |
| 53 | if ("_f" in o) |
| 54 | throw "Error at end: o has _f"; |