| // Copyright 2017 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 |
| |
| (function() { |
| function eq(a, b) { return a == b; } |
| |
| var o = { [Symbol.toPrimitive]: () => "o" }; |
| |
| %PrepareFunctionForOptimization(eq); |
| assertTrue(eq(o, o)); |
| assertTrue(eq(o, o)); |
| %OptimizeFunctionOnNextCall(eq); |
| assertTrue(eq(o, o)); |
| assertTrue(eq("o", o)); |
| %PrepareFunctionForOptimization(eq); |
| assertTrue(eq(o, "o")); |
| %OptimizeFunctionOnNextCall(eq); |
| assertTrue(eq(o, o)); |
| assertTrue(eq("o", o)); |
| assertTrue(eq(o, "o")); |
| assertOptimized(eq); |
| })(); |
| |
| (function() { |
| function ne(a, b) { return a != b; } |
| |
| var o = { [Symbol.toPrimitive]: () => "o" }; |
| |
| %PrepareFunctionForOptimization(ne); |
| assertFalse(ne(o, o)); |
| assertFalse(ne(o, o)); |
| %OptimizeFunctionOnNextCall(ne); |
| assertFalse(ne(o, o)); |
| assertFalse(ne("o", o)); |
| %PrepareFunctionForOptimization(ne); |
| assertFalse(ne(o, "o")); |
| %OptimizeFunctionOnNextCall(ne); |
| assertFalse(ne(o, o)); |
| assertFalse(ne("o", o)); |
| assertFalse(ne(o, "o")); |
| assertOptimized(ne); |
| })(); |
| |
| (function() { |
| function eq(a, b) { return a == b; } |
| |
| var a = {}; |
| var b = {b}; |
| var u = %GetUndetectable(); |
| |
| %PrepareFunctionForOptimization(eq); |
| assertTrue(eq(a, a)); |
| assertTrue(eq(b, b)); |
| assertFalse(eq(a, b)); |
| assertFalse(eq(b, a)); |
| assertTrue(eq(a, a)); |
| assertTrue(eq(b, b)); |
| assertFalse(eq(a, b)); |
| assertFalse(eq(b, a)); |
| %OptimizeFunctionOnNextCall(eq); |
| assertTrue(eq(a, a)); |
| assertTrue(eq(b, b)); |
| assertFalse(eq(a, b)); |
| assertFalse(eq(b, a)); |
| assertTrue(eq(null, u)); |
| %PrepareFunctionForOptimization(eq); |
| assertTrue(eq(undefined, u)); |
| assertTrue(eq(u, null)); |
| assertTrue(eq(u, undefined)); |
| %OptimizeFunctionOnNextCall(eq); |
| assertTrue(eq(a, a)); |
| assertTrue(eq(b, b)); |
| assertFalse(eq(a, b)); |
| assertFalse(eq(b, a)); |
| assertTrue(eq(null, u)); |
| assertTrue(eq(undefined, u)); |
| assertTrue(eq(u, null)); |
| assertTrue(eq(u, undefined)); |
| assertOptimized(eq); |
| })(); |
| |
| (function() { |
| function ne(a, b) { return a != b; } |
| |
| var a = {}; |
| var b = {b}; |
| var u = %GetUndetectable(); |
| |
| %PrepareFunctionForOptimization(ne); |
| assertFalse(ne(a, a)); |
| assertFalse(ne(b, b)); |
| assertTrue(ne(a, b)); |
| assertTrue(ne(b, a)); |
| assertFalse(ne(a, a)); |
| assertFalse(ne(b, b)); |
| assertTrue(ne(a, b)); |
| assertTrue(ne(b, a)); |
| %OptimizeFunctionOnNextCall(ne); |
| assertFalse(ne(a, a)); |
| assertFalse(ne(b, b)); |
| assertTrue(ne(a, b)); |
| assertTrue(ne(b, a)); |
| assertFalse(ne(null, u)); |
| %PrepareFunctionForOptimization(ne); |
| assertFalse(ne(undefined, u)); |
| assertFalse(ne(u, null)); |
| assertFalse(ne(u, undefined)); |
| %OptimizeFunctionOnNextCall(ne); |
| assertFalse(ne(a, a)); |
| assertFalse(ne(b, b)); |
| assertTrue(ne(a, b)); |
| assertTrue(ne(b, a)); |
| assertFalse(ne(null, u)); |
| assertFalse(ne(undefined, u)); |
| assertFalse(ne(u, null)); |
| assertFalse(ne(u, undefined)); |
| assertOptimized(ne); |
| })(); |