| class Foo { } |
| |
| function Bar() { } |
| |
| var numberOfGetPrototypeOfCalls = 0; |
| |
| var doBadThings = function() { }; |
| |
| Bar.prototype = new Proxy( |
| {}, |
| { |
| getPrototypeOf() |
| { |
| numberOfGetPrototypeOfCalls++; |
| doBadThings(); |
| return Foo.prototype; |
| } |
| }); |
| |
| // Break some watchpoints. |
| var o = {f:42}; |
| o.g = 43; |
| |
| function foo(o, p) |
| { |
| var result = o.f; |
| for (var i = 0; i < 5; ++i) |
| var _ = p instanceof Foo; |
| return result + o.f; |
| } |
| |
| noInline(foo); |
| |
| for (var i = 0; i < 10000; ++i) { |
| var result = foo({f:42}, new Bar()); |
| if (result != 84) |
| throw "Error: bad result in loop: " + result; |
| } |
| |
| if (numberOfGetPrototypeOfCalls != 10000 * 5) |
| throw "Error: did not call getPrototypeOf() the right number of times"; |
| |
| var globalO = {f:42}; |
| var didCallGetter = false; |
| doBadThings = function() { |
| delete globalO.f; |
| globalO.__defineGetter__("f", function() { |
| didCallGetter = true; |
| return 43; |
| }); |
| }; |
| |
| var result = foo(globalO, new Bar()); |
| if (result != 85) |
| throw "Error: bad result at end: " + result; |
| if (!didCallGetter) |
| throw "Error: did not call getter"; |
| if (numberOfGetPrototypeOfCalls != 10001 * 5) |
| throw "Error: did not call getPrototypeOf() the right number of times at end"; |