blob: 278dcc9b72ba97c50ed39695a51efed5c8170dec [file] [log] [blame]
fpizlo@apple.com05b1b222016-01-07 22:59:43 +00001function 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
13noInline(foo);
14
15// Warm up foo() with polymorphic objects and getters.
16for (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.
39var result;
40try {
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}
51if (result.outcome !== "exception")
52 throw "Error at end: bad outcome: " + result.outcome;
53if ("_f" in o)
54 throw "Error at end: o has _f";