| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| function test(func, expect) { |
| %PrepareFunctionForOptimization(func); |
| assertTrue(func() == expect); |
| %OptimizeFunctionOnNextCall(func); |
| assertTrue(func() == expect); |
| } |
| |
| // Check loading a constant off the global. |
| var v0 = 10; |
| function check_v0() { return "v0" in this; } |
| test(check_v0, true); |
| |
| // make it non-constant. |
| v0 = 0; |
| test(check_v0, true); |
| |
| // test a missing value. |
| function check_v1() { return "v1" in this; } |
| test(check_v1, false); |
| this.v1 = 3; |
| test(check_v1, true); |
| delete this.v1; |
| test(check_v1, false); |
| |
| // test undefined. |
| var v2; |
| function check_v2() { return "v2" in this; } |
| test(check_v2, true); |
| |
| // test a constant object. |
| var v3 = {}; |
| function check_v3() { return "v3" in this; } |
| test(check_v3, true); |
| // make the object non-constant. |
| v3 = []; |
| test(check_v3, true); |
| |
| // test non-configurable |
| Object.defineProperty(this, "v4", { value: {}, configurable: false}); |
| function check_v4() { return "v4" in this; } |
| test(check_v4, true); |
| |
| // Test loading from arrays with different prototypes. |
| (function() { |
| function testIn(index, array) { |
| return index in array; |
| } |
| %PrepareFunctionForOptimization(testIn); |
| |
| let a = []; |
| a.__proto__ = [0,1,2]; |
| a[1] = 3; |
| |
| // First load will set IC to Load handle with allow hole to undefined conversion false. |
| assertTrue(testIn(0, a)); |
| // Second load will hit ICMiss when hole is loaded. Seeing the same map twice, the IC will be set megamorphic. |
| assertTrue(testIn(0, a)); |
| %OptimizeFunctionOnNextCall(testIn); |
| // Test JIT to ensure proper handling. |
| assertTrue(testIn(0, a)); |
| |
| %ClearFunctionFeedback(testIn); |
| %DeoptimizeFunction(testIn); |
| %PrepareFunctionForOptimization(testIn); |
| |
| // First load will set IC to Load handle with allow hole to undefined conversion false. |
| assertTrue(testIn(0, a)); |
| %OptimizeFunctionOnNextCall(testIn); |
| // Test JIT to ensure proper handling if hole is loaded. |
| assertTrue(testIn(0, a)); |
| |
| // Repeat the same testing for access out-of-bounds of the array, but in bounds of it's prototype. |
| %ClearFunctionFeedback(testIn); |
| %DeoptimizeFunction(testIn); |
| %PrepareFunctionForOptimization(testIn); |
| |
| assertTrue(testIn(2, a)); |
| assertTrue(testIn(2, a)); |
| %OptimizeFunctionOnNextCall(testIn); |
| assertTrue(testIn(2, a)); |
| |
| %ClearFunctionFeedback(testIn); |
| %DeoptimizeFunction(testIn); |
| %PrepareFunctionForOptimization(testIn); |
| |
| assertTrue(testIn(2, a)); |
| %OptimizeFunctionOnNextCall(testIn); |
| assertTrue(testIn(2, a)); |
| })(); |