| // 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 |
| |
| // Test that String.fromCodePoint() properly identifies zeros. |
| (function() { |
| function foo(x) { |
| return String.fromCodePoint(x); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertEquals("\u0000", foo(0)); |
| assertEquals("\u0000", foo(-0)); |
| %OptimizeFunctionOnNextCall(foo); |
| assertEquals("\u0000", foo(0)); |
| assertEquals("\u0000", foo(-0)); |
| assertOptimized(foo); |
| |
| // Prepare foo to be re-optimized, ensuring it's bytecode / feedback vector |
| // doesn't get flushed after deoptimization. |
| %PrepareFunctionForOptimization(foo); |
| |
| // Now passing anything outside the valid code point |
| // range should invalidate the optimized code. |
| assertThrows(_ => foo(-1)); |
| assertUnoptimized(foo); |
| |
| // And TurboFan should not inline the builtin anymore |
| // from now on (aka no deoptimization loop). |
| %OptimizeFunctionOnNextCall(foo); |
| assertEquals("\u0000", foo(0)); |
| assertEquals("\u0000", foo(-0)); |
| assertThrows(_ => foo(-1)); |
| assertOptimized(foo); |
| })(); |