| function shouldBe(actual, expected) { |
| if (actual !== expected) |
| throw new Error(`bad value: ${String(actual)}`); |
| } |
| |
| function test1(object) |
| { |
| // The prediction should be Int32. |
| return Number(object); |
| } |
| noInline(test1); |
| |
| function test12(object) |
| { |
| // Should be Int32 comparison. |
| return Number(object) <= 42; |
| } |
| noInline(test12); |
| |
| var object1 = { valueOf() { return 42; } }; |
| for (var i = 0; i < 1e4; ++i) { |
| shouldBe(test1(object1), 42); |
| shouldBe(test12(object1), true); |
| } |
| |
| function test2(object) |
| { |
| // The prediction should be Doubles. |
| return Number(object); |
| } |
| noInline(test2); |
| |
| function test22(object) |
| { |
| // Should be Double comparison. |
| return Number(object) <= 42; |
| } |
| noInline(test22); |
| |
| var object2 = { valueOf() { return 42.195; } }; |
| for (var i = 0; i < 1e4; ++i) { |
| shouldBe(test2(object2), 42.195); |
| shouldBe(test22(object2), false); |
| } |
| |
| function test3(object) |
| { |
| // The prediction should be Int32, and later it should be Doubles. |
| return Number(object); |
| } |
| noInline(test3); |
| |
| function test32(object) |
| { |
| // Should be Int32 comparison. And later, OSR exit occurs with 42.195. And it should be recompiled as Double comparison. |
| return Number(object) <= 42; |
| } |
| noInline(test32); |
| |
| var value = 42; |
| var object3 = { valueOf() { return value; } }; |
| for (var i = 0; i < 1e4; ++i) { |
| shouldBe(test3(object3), value); |
| shouldBe(test32(object3), true); |
| } |
| value = 42.195; |
| for (var i = 0; i < 1e4; ++i) { |
| shouldBe(test3(object3), value); |
| shouldBe(test32(object3), false); |
| } |