From 7a30b0fa2dc687e80beee09babd67392f45c720b Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Fri, 21 Jul 2023 04:10:47 -0500 Subject: [PATCH] Issue #1240 - Part 8 - Fix incorrect asserts with debug enabled. Fix BigInt errors in remainder operations https://bugzilla.mozilla.org/show_bug.cgi?id=1524136 Also fix 2 debug asserts in fallthroughs due to missing BigInt cases. --- js/public/Value.h | 2 ++ js/src/jit/BaselineIC.cpp | 3 +++ js/src/vm/BigIntType.cpp | 4 ++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/js/public/Value.h b/js/public/Value.h index e21b104a80..30f4670049 100644 --- a/js/public/Value.h +++ b/js/public/Value.h @@ -1508,6 +1508,8 @@ DispatchTyped(F f, const JS::Value& val, Args&&... args) return f(&val.toObject(), mozilla::Forward(args)...); if (val.isSymbol()) return f(val.toSymbol(), mozilla::Forward(args)...); + if (val.isBigInt()) + return f(val.toBigInt(), mozilla::Forward(args)...); if (MOZ_UNLIKELY(val.isPrivateGCThing())) return DispatchTyped(f, val.toGCCellPtr(), mozilla::Forward(args)...); MOZ_ASSERT(!val.isGCThing()); diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 61d77adc2e..0a87121c6e 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -8093,6 +8093,9 @@ ICTypeOf_Typed::Compiler::generateStubCode(MacroAssembler& masm) masm.branchTestSymbol(Assembler::NotEqual, R0, &failure); break; + case JSTYPE_BIGINT: + return false; + default: MOZ_CRASH("Unexpected type"); } diff --git a/js/src/vm/BigIntType.cpp b/js/src/vm/BigIntType.cpp index d32489a8f6..6beed9af11 100644 --- a/js/src/vm/BigIntType.cpp +++ b/js/src/vm/BigIntType.cpp @@ -1778,7 +1778,7 @@ BigInt* BigInt::mod(ExclusiveContext* cx, HandleBigInt x, HandleBigInt y) { return nullptr; } MOZ_ASSERT(remainder); - return remainder; + return destructivelyTrimHighZeroDigits(cx, remainder); } } @@ -2195,7 +2195,7 @@ uint64_t BigInt::toUint64(BigInt* x) { uint64_t digit = x->digit(0); - if (DigitBits == 32 && x->digitLength() >= 1) { + if (DigitBits == 32 && x->digitLength() > 1) { digit |= static_cast(x->digit(1)) << 32; }