summaryrefslogtreecommitdiff
path: root/quickjs.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-03-19 13:56:10 +0100
committerFabrice Bellard <fabrice@bellard.org>2025-03-19 13:56:10 +0100
commit131408fa07254ba6c44b1d3804ba43aadd4440a1 (patch)
tree08615da1166822cf475490960765914d3dcfc80d /quickjs.c
parent7399069dc1ae72569f04f502404f4d3b4464d1f7 (diff)
downloadquickjs-131408fa07254ba6c44b1d3804ba43aadd4440a1.tar.gz
quickjs-131408fa07254ba6c44b1d3804ba43aadd4440a1.zip
simplified js_bigint_from_float64()
Diffstat (limited to 'quickjs.c')
-rw-r--r--quickjs.c58
1 files changed, 25 insertions, 33 deletions
diff --git a/quickjs.c b/quickjs.c
index 161406e..7df64e6 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -10192,11 +10192,31 @@ static JSBigInt *js_bigint_new(JSContext *ctx, int len)
static JSBigInt *js_bigint_set_si(JSBigIntBuf *buf, js_slimb_t a)
{
JSBigInt *r = (JSBigInt *)buf->big_int_buf;
+ r->header.ref_count = 0; /* fail safe */
r->len = 1;
r->tab[0] = a;
return r;
}
+static JSBigInt *js_bigint_set_si64(JSBigIntBuf *buf, int64_t a)
+{
+#if JS_LIMB_BITS == 64
+ return js_bigint_set_si(buf, a);
+#else
+ JSBigInt *r = (JSBigInt *)buf->big_int_buf;
+ r->header.ref_count = 0; /* fail safe */
+ if (a >= INT32_MIN && a <= INT32_MAX) {
+ r->len = 1;
+ r->tab[0] = a;
+ } else {
+ r->len = 2;
+ r->tab[0] = a;
+ r->tab[1] = a >> JS_LIMB_BITS;
+ }
+ return r;
+#endif
+}
+
/* val must be a short big int */
static JSBigInt *js_bigint_set_short(JSBigIntBuf *buf, JSValueConst val)
{
@@ -10862,7 +10882,7 @@ static JSBigInt *js_bigint_from_float64(JSContext *ctx, int *pres, double a1)
int sgn, e, shift;
uint64_t mant;
JSBigIntBuf buf;
- JSBigInt *r, *r1;
+ JSBigInt *r;
sgn = a >> 63;
e = (a >> 52) & ((1 << 11) - 1);
@@ -10895,40 +10915,12 @@ static JSBigInt *js_bigint_from_float64(JSContext *ctx, int *pres, double a1)
} else {
e -= 52;
}
-
+ if (sgn)
+ mant = -mant;
/* the integer is mant*2^e */
- r = (JSBigInt *)buf.big_int_buf;
-#if JS_LIMB_BITS == 64
- r->len = 1;
- r->tab[0] = mant;
-#else
- if (mant <= INT32_MAX) {
- r->len = 1;
- r->tab[0] = mant;
- } else {
- r->len = 2;
- r->tab[0] = mant;
- r->tab[1] = mant >> 32;
- }
-#endif
- /* XXX: optimize */
- if (sgn) {
- r = js_bigint_neg(ctx, r);
- if (!r)
- goto fail;
- r1 = js_bigint_shl(ctx, r, e);
- js_free(ctx, r);
- if (!r1)
- goto fail;
- r = r1;
- } else {
- r = js_bigint_shl(ctx, r, e);
- }
+ r = js_bigint_set_si64(&buf, (int64_t)mant);
*pres = 0;
- return r;
- fail:
- *pres = 0;
- return NULL;
+ return js_bigint_shl(ctx, r, e);
}
/* return -1, 0, 1 or (2) (unordered) */