// Copyright 2018 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 --noalways-opt // Known receivers strict equality. (function() { const a = {}; const b = {}; function foo() { return a === b; } %PrepareFunctionForOptimization(foo); assertFalse(foo()); assertFalse(foo()); %OptimizeFunctionOnNextCall(foo); assertFalse(foo()); })(); // Known receiver/null strict equality. (function() { const a = {}; const b = null; function foo() { return a === b; } %PrepareFunctionForOptimization(foo); assertFalse(foo()); assertFalse(foo()); %OptimizeFunctionOnNextCall(foo); assertFalse(foo()); })(); // Known receiver/undefined strict equality. (function() { const a = {}; const b = undefined; function foo() { return a === b; } %PrepareFunctionForOptimization(foo); assertFalse(foo()); assertFalse(foo()); %OptimizeFunctionOnNextCall(foo); assertFalse(foo()); })(); // Known receiver on one side strict equality. (function() { const a = {}; const b = {}; function foo(a) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b)); assertFalse(foo(a)); assertTrue(foo(b)); assertFalse(foo(a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(b)); assertFalse(foo(a)); })(); // Known receiver on one side strict equality. (function() { const a = {}; const b = null; function foo(a) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b)); assertFalse(foo(a)); assertTrue(foo(b)); assertFalse(foo(a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(b)); assertFalse(foo(a)); })(); // Known receiver on one side strict equality. (function() { const a = {}; const b = undefined; function foo(a) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b)); assertFalse(foo(a)); assertTrue(foo(b)); assertFalse(foo(a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(b)); assertFalse(foo(a)); })(); // Feedback based receiver strict equality. (function() { const a = {}; const b = {}; function foo(a, b) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b, b)); assertFalse(foo(a, b)); assertTrue(foo(a, a)); assertFalse(foo(b, a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(a, a)); assertFalse(foo(b, a)); // TurboFan bakes in feedback for the left hand side. assertFalse(foo(null, b)); assertUnoptimized(foo); })(); // Feedback based receiver/null strict equality. (function() { const a = {}; const b = null; function foo(a, b) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b, b)); assertFalse(foo(a, b)); assertTrue(foo(a, a)); assertFalse(foo(b, a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(a, a)); assertFalse(foo(b, a)); // TurboFan bakes in feedback for the left hand side. assertFalse(foo(1, b)); assertUnoptimized(foo); })(); // Feedback based receiver/undefined strict equality. (function() { const a = {}; const b = undefined; function foo(a, b) { return a === b; } %PrepareFunctionForOptimization(foo); assertTrue(foo(b, b)); assertFalse(foo(a, b)); assertTrue(foo(a, a)); assertFalse(foo(b, a)); %OptimizeFunctionOnNextCall(foo); assertTrue(foo(a, a)); assertFalse(foo(b, a)); // TurboFan bakes in feedback for the left hand side. assertFalse(foo(1, b)); assertUnoptimized(foo); })();