| // Copyright 2020 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 --opt --no-always-opt |
| |
| |
| // smi == boolean |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(2, true)); |
| assertTrue(foo(1, true)); |
| assertTrue(foo(0, false)); |
| assertFalse(foo(2, false)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(2, true)); |
| assertTrue(foo(1, true)); |
| assertTrue(foo(0, false)); |
| assertFalse(foo(2, false)); |
| assertOptimized(foo); |
| |
| assertFalse(foo(0, null)); |
| assertUnoptimized(foo); |
| })(); |
| |
| |
| // boolean == smi |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(true, 2)); |
| assertTrue(foo(true, 1)); |
| assertTrue(foo(false, 0)); |
| assertFalse(foo(false, 2)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(true, 2)); |
| assertTrue(foo(true, 1)); |
| assertTrue(foo(false, 0)); |
| assertFalse(foo(false, 2)); |
| assertOptimized(foo); |
| |
| assertFalse(foo(null, 0)); |
| assertUnoptimized(foo); |
| })(); |
| |
| |
| // smi == undefined |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(2, undefined)); |
| assertFalse(foo(0, undefined)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(2, undefined)); |
| assertFalse(foo(0, undefined)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // undefined == smi |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(undefined, 2)); |
| assertFalse(foo(undefined, 0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(undefined, 2)); |
| assertFalse(foo(undefined, 0)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // smi == null |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(2, null)); |
| assertFalse(foo(0, null)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(2, null)); |
| assertFalse(foo(0, null)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // null == smi |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(null, 2)); |
| assertFalse(foo(null, 0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(null, 2)); |
| assertFalse(foo(null, 0)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // smi == oddball |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(2, null)); |
| assertFalse(foo(0, undefined)); |
| assertFalse(foo(0, true)); |
| assertTrue(foo(1, true)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(2, null)); |
| assertFalse(foo(0, undefined)); |
| assertFalse(foo(0, true)); |
| assertTrue(foo(1, true)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // oddball == smi |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(null, 2)); |
| assertFalse(foo(undefined, 0)); |
| assertFalse(foo(true, 0)); |
| assertTrue(foo(true, 1)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(null, 2)); |
| assertFalse(foo(undefined, 0)); |
| assertFalse(foo(true, 0)); |
| assertTrue(foo(true, 1)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // number == boolean |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(-2.8, true)); |
| assertTrue(foo(1, true)); |
| assertTrue(foo(-0.0, false)); |
| assertFalse(foo(2, false)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(-2.8, true)); |
| assertTrue(foo(1, true)); |
| assertTrue(foo(-0.0, false)); |
| assertFalse(foo(2, false)); |
| assertOptimized(foo); |
| |
| assertFalse(foo(0, null)); |
| assertUnoptimized(foo); |
| })(); |
| |
| |
| // boolean == number |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(true, -2.8)); |
| assertTrue(foo(true, 1)); |
| assertTrue(foo(false, -0.0)); |
| assertFalse(foo(false, 2)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(true, -2.8)); |
| assertTrue(foo(true, 1)); |
| assertTrue(foo(false, -0.0)); |
| assertFalse(foo(false, 2)); |
| assertOptimized(foo); |
| |
| assertFalse(foo(null, 0)); |
| assertUnoptimized(foo); |
| })(); |
| |
| |
| // number == undefined |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(-2.8, undefined)); |
| assertFalse(foo(-0.0, undefined)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(-2.8, undefined)); |
| assertFalse(foo(-0.0, undefined)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // undefined == number |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(undefined, -2.8)); |
| assertFalse(foo(undefined, -0.0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(undefined, -2.8)); |
| assertFalse(foo(undefined, -0.0)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // number == null |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(-2.8, null)); |
| assertFalse(foo(-0.0, null)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(-2.8, null)); |
| assertFalse(foo(-0.0, null)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // null == number |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(null, -2.8)); |
| assertFalse(foo(null, -0.0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(null, -2.8)); |
| assertFalse(foo(null, -0.0)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // number == oddball |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(-2.8, null)); |
| assertFalse(foo(-0.0, undefined)); |
| assertFalse(foo(0, true)); |
| assertTrue(foo(1.0, true)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(-2.8, null)); |
| assertFalse(foo(-0.0, undefined)); |
| assertFalse(foo(0, true)); |
| assertTrue(foo(1.0, true)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // oddball == number |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo(null, -2.8)); |
| assertFalse(foo(undefined, -0.0)); |
| assertFalse(foo(true, 0)); |
| assertTrue(foo(true, 1.0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo(null, -2.8)); |
| assertFalse(foo(undefined, -0.0)); |
| assertFalse(foo(true, 0)); |
| assertTrue(foo(true, 1.0)); |
| assertOptimized(foo); |
| })(); |
| |
| |
| // oddball == oddball |
| (function() { |
| function foo(a, b) { return a == b; } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo(null, null)); |
| assertTrue(foo(undefined, undefined)); |
| assertTrue(foo(false, false)); |
| assertTrue(foo(true, true)); |
| assertTrue(foo(undefined, null)); |
| assertFalse(foo(undefined, false)); |
| assertFalse(foo(null, false)); |
| assertFalse(foo(true, undefined)); |
| assertFalse(foo(true, null)); |
| assertFalse(foo(true, false)); |
| |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo(null, null)); |
| assertOptimized(foo); |
| assertTrue(foo(undefined, undefined)); |
| assertTrue(foo(false, false)); |
| assertTrue(foo(true, true)); |
| assertTrue(foo(undefined, null)); |
| assertFalse(foo(undefined, false)); |
| assertFalse(foo(null, false)); |
| assertFalse(foo(true, undefined)); |
| assertFalse(foo(true, null)); |
| assertFalse(foo(true, false)); |
| assertOptimized(foo); |
| })(); |