| description( |
| "Tests what happens when the first attempt to cache an access goes down the unset route and then subsequently it tries to cache using a proto." |
| ); |
| |
| function foo(p, o) { |
| if (p) |
| return o.f; |
| return 42; |
| } |
| |
| noInline(foo); |
| |
| // Get foo into the LLInt |
| for (var i = 0; i < 10; ++i) |
| foo(false, {}); |
| |
| // Warm up foo()'s p=true path and make it as polymorphic as possible. |
| for (var i = 0; i < 3; ++i) { |
| foo(true, {f:42}); |
| foo(true, {g:1, f:23}); |
| } |
| |
| // Force compilation by going down p=false. |
| while (!dfgCompiled({f:foo})) |
| foo(false, {}); |
| |
| // Hit the unset case. |
| for (var j = 0; j < 2; ++j) { |
| var o = {}; |
| for (var i = 0; i < 1000; ++i) |
| o["i" + i] = i; |
| o.f = 42; |
| shouldBe("foo(true, o)", "42"); |
| } |
| |
| function Blah() { |
| } |
| Blah.prototype.f = 23; |
| |
| // Hit the prototype case. |
| shouldBe("foo(true, new Blah())", "23"); |
| |