diff options
author | Charlie Gordon <github@chqrlie.org> | 2024-03-22 11:23:33 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-04-14 19:00:24 +0200 |
commit | 4fba09e15a6af581588eec2a191143f03f2a8c49 (patch) | |
tree | ff56e701c40d7280e21f5b5fe9483751722b0249 | |
parent | 07f88ea2a567faf1501af1563de2336c296f7e49 (diff) | |
download | chawan-4fba09e15a6af581588eec2a191143f03f2a8c49.tar.gz |
Fix compilation with -DCONFIG_BIGNUM
- disable BigDecimal convertion in `JS_ReadBigNum` - fix some error messages
-rw-r--r-- | lib/quickjs/libbf.c | 2 | ||||
-rw-r--r-- | lib/quickjs/quickjs.c | 73 |
2 files changed, 43 insertions, 32 deletions
diff --git a/lib/quickjs/libbf.c b/lib/quickjs/libbf.c index dee394ac..05d62ed6 100644 --- a/lib/quickjs/libbf.c +++ b/lib/quickjs/libbf.c @@ -136,6 +136,7 @@ static inline slimb_t ceil_div(slimb_t a, slimb_t b) return a / b; } +#ifdef USE_BF_DEC /* b must be >= 1 */ static inline slimb_t floor_div(slimb_t a, slimb_t b) { @@ -145,6 +146,7 @@ static inline slimb_t floor_div(slimb_t a, slimb_t b) return (a - b + 1) / b; } } +#endif /* return r = a modulo b (0 <= r <= b - 1. b must be >= 1 */ static inline limb_t smod(slimb_t a, slimb_t b) diff --git a/lib/quickjs/quickjs.c b/lib/quickjs/quickjs.c index 6788ddf9..c52d7deb 100644 --- a/lib/quickjs/quickjs.c +++ b/lib/quickjs/quickjs.c @@ -36004,11 +36004,10 @@ static JSValue JS_ReadBigNum(BCReaderState *s, int tag) uint8_t v8; int32_t e; uint32_t len; - limb_t l, i, n, j; + limb_t l, i, n; JSBigFloat *p; limb_t v; bf_t *a; - int bpos, d; p = js_new_bf(s->ctx); if (!p) @@ -36058,39 +36057,23 @@ static JSValue JS_ReadBigNum(BCReaderState *s, int tag) JS_ThrowInternalError(s->ctx, "invalid bignum length"); goto fail; } - if (tag != BC_TAG_BIG_DECIMAL) - l = (len + sizeof(limb_t) - 1) / sizeof(limb_t); - else +#ifdef CONFIG_BIGNUM + if (tag == BC_TAG_BIG_DECIMAL) { l = (len + LIMB_DIGITS - 1) / LIMB_DIGITS; + } else +#endif + { + l = (len + sizeof(limb_t) - 1) / sizeof(limb_t); + } if (bf_resize(a, l)) { JS_ThrowOutOfMemory(s->ctx); goto fail; } - if (tag != BC_TAG_BIG_DECIMAL) { - n = len & (sizeof(limb_t) - 1); - if (n != 0) { - v = 0; - for(i = 0; i < n; i++) { - if (bc_get_u8(s, &v8)) - goto fail; - v |= (limb_t)v8 << ((sizeof(limb_t) - n + i) * 8); - } - a->tab[0] = v; - i = 1; - } else { - i = 0; - } - for(; i < l; i++) { -#if LIMB_BITS == 32 - if (bc_get_u32(s, &v)) - goto fail; -#else - if (bc_get_u64(s, &v)) - goto fail; -#endif - a->tab[i] = v; - } - } else { +#ifdef CONFIG_BIGNUM + if (tag == BC_TAG_BIG_DECIMAL) { + limb_t j; + int bpos, d; + bpos = 0; for(i = 0; i < l; i++) { if (i == 0 && (n = len % LIMB_DIGITS) != 0) { @@ -36117,6 +36100,32 @@ static JSValue JS_ReadBigNum(BCReaderState *s, int tag) } a->tab[i] = v; } + } else +#endif /* CONFIG_BIGNUM */ + { + n = len & (sizeof(limb_t) - 1); + if (n != 0) { + v = 0; + for(i = 0; i < n; i++) { + if (bc_get_u8(s, &v8)) + goto fail; + v |= (limb_t)v8 << ((sizeof(limb_t) - n + i) * 8); + } + a->tab[0] = v; + i = 1; + } else { + i = 0; + } + for(; i < l; i++) { +#if LIMB_BITS == 32 + if (bc_get_u32(s, &v)) + goto fail; +#else + if (bc_get_u64(s, &v)) + goto fail; +#endif + a->tab[i] = v; + } } } bc_read_trace(s, "}\n"); @@ -50991,7 +51000,7 @@ static JSValue JS_ToBigIntCtorFree(JSContext *ctx, JSValue val) } if (!bf_is_finite(a)) { JS_FreeValue(ctx, val); - val = JS_ThrowRangeError(ctx, "cannot convert NaN or Infinity to bigint"); + val = JS_ThrowRangeError(ctx, "cannot convert NaN or Infinity to BigInt"); } else { JSValue val1 = JS_NewBigInt(ctx); bf_t *r; @@ -51009,7 +51018,7 @@ static JSValue JS_ToBigIntCtorFree(JSContext *ctx, JSValue val) val = JS_ThrowOutOfMemory(ctx); } else if (ret & BF_ST_INEXACT) { JS_FreeValue(ctx, val1); - val = JS_ThrowRangeError(ctx, "cannot convert to bigint: not an integer"); + val = JS_ThrowRangeError(ctx, "cannot convert to BigInt: not an integer"); } else { val = JS_CompactBigInt(ctx, val1); } |