| // Makes sure we don't use base's tag register on 32-bit when an inline cache fails and jumps to the slow path |
| // because the slow path depends on the base being present. |
| |
| var createCustomGetterObject = $vm.createCustomGetterObject; |
| |
| function assert(b) { |
| if (!b) |
| throw new Error("baddd"); |
| } |
| noInline(assert); |
| |
| let customGetter = createCustomGetterObject(); |
| let otherObj = { |
| customGetter: 20 |
| }; |
| function randomFunction() {} |
| noInline(randomFunction); |
| |
| function foo(o, c) { |
| let baz = o.customGetter; |
| if (c) { |
| o = 42; |
| } |
| let jaz = o.foo; |
| let kaz = jaz + "hey"; |
| let raz = kaz + "hey"; |
| let result = o.customGetter; |
| randomFunction(!c, baz, jaz, kaz, raz); |
| return result; |
| } |
| noInline(foo); |
| |
| for (let i = 0; i < 10000; i++) { |
| switch (i % 2) { |
| case 0: |
| assert(foo(customGetter) === 100); |
| break; |
| case 1: |
| assert(foo(otherObj) === 20); |
| break; |
| } |
| } |
| assert(foo({hello: 20, world:50, customGetter: 40}) === 40); // Make sure we don't trample registers in "o.customGetter" inline cache failure in foo. |