Commit c5c6b8bc authored by Hai Dang's avatar Hai Dang Committed by Commit Bot

Fix typing of binary operators on BigInt.

BinaryNumberOpTyper was not monotonic: if one input changes
from Number to Numeric, while the other input stays BigInt,
the result would change from Number to BigInt.

We have some fuzzing tests for monotonicity but unfortunately
they never generated the inputs required for triggering this bug.
We'll look into improving our tests.

Bug: v8:8380
Change-Id: I7320d9ae4b89ad8798bf9e97cc272edba2162a77
Reviewed-on: https://chromium-review.googlesource.com/c/1307418
Commit-Queue: Hai Dang <dhai@google.com>
Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57125}
parent 9eca2d3c
......@@ -406,10 +406,12 @@ Type Typer::Visitor::BinaryNumberOpTyper(Type lhs, Type rhs, Typer* t,
if (lhs_is_number && rhs_is_number) {
return f(lhs, rhs, t);
}
if (lhs_is_number || rhs_is_number) {
// In order to maintain monotonicity, the following two conditions are
// intentionally asymmetric.
if (lhs_is_number) {
return Type::Number();
}
if (lhs.Is(Type::BigInt()) || rhs.Is(Type::BigInt())) {
if (lhs.Is(Type::BigInt())) {
return Type::BigInt();
}
return Type::Numeric();
......
// 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
function reduceLHS() {
for (var i = 0; i < 2 ;i++) {
let [q, r] = [1n, 1n];
r = r - 1n;
q += 1n;
q = r;
}
}
reduceLHS();
%OptimizeFunctionOnNextCall(reduceLHS);
reduceLHS();
function reduceRHS() {
for (var i = 0; i < 2 ;i++) {
let [q, r] = [1n, 1n];
r = 1n - r;
q += 1n;
q = r;
}
}
reduceRHS();
%OptimizeFunctionOnNextCall(reduceRHS);
reduceRHS();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment