Use JS_ToBigIntFree() instead of JS_ToBigInt() (#190)
Reduces reference count juggling in the happy path and, to a lesser extent, in error paths.
This commit is contained in:
parent
4fc814311a
commit
6bd3d5660e
1 changed files with 14 additions and 17 deletions
31
quickjs.c
31
quickjs.c
|
@ -11867,7 +11867,7 @@ static int js_unary_arith_bigint(JSContext *ctx,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
r = JS_GetBigInt(res);
|
r = JS_GetBigInt(res);
|
||||||
a = JS_ToBigInt(ctx, &a_s, op1);
|
a = JS_ToBigIntFree(ctx, &a_s, op1); // infallible, always a bigint
|
||||||
ret = 0;
|
ret = 0;
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case OP_inc:
|
case OP_inc:
|
||||||
|
@ -11890,7 +11890,6 @@ static int js_unary_arith_bigint(JSContext *ctx,
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
JS_FreeBigInt(ctx, a, &a_s);
|
JS_FreeBigInt(ctx, a, &a_s);
|
||||||
JS_FreeValue(ctx, op1);
|
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
JS_FreeValue(ctx, res);
|
JS_FreeValue(ctx, res);
|
||||||
throw_bf_exception(ctx, ret);
|
throw_bf_exception(ctx, ret);
|
||||||
|
@ -12023,16 +12022,21 @@ static int js_binary_arith_bigint(JSContext *ctx, OPCodeEnum op,
|
||||||
int ret;
|
int ret;
|
||||||
JSValue res;
|
JSValue res;
|
||||||
|
|
||||||
res = JS_NewBigInt(ctx);
|
a = JS_ToBigIntFree(ctx, &a_s, op1);
|
||||||
if (JS_IsException(res))
|
if (!a) {
|
||||||
goto fail;
|
JS_FreeValue(ctx, op2);
|
||||||
a = JS_ToBigInt(ctx, &a_s, op1);
|
return -1;
|
||||||
if (!a)
|
}
|
||||||
goto fail;
|
b = JS_ToBigIntFree(ctx, &b_s, op2);
|
||||||
b = JS_ToBigInt(ctx, &b_s, op2);
|
|
||||||
if (!b) {
|
if (!b) {
|
||||||
JS_FreeBigInt(ctx, a, &a_s);
|
JS_FreeBigInt(ctx, a, &a_s);
|
||||||
goto fail;
|
return -1;
|
||||||
|
}
|
||||||
|
res = JS_NewBigInt(ctx);
|
||||||
|
if (JS_IsException(res)) {
|
||||||
|
JS_FreeBigInt(ctx, a, &a_s);
|
||||||
|
JS_FreeBigInt(ctx, b, &b_s);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
r = JS_GetBigInt(res);
|
r = JS_GetBigInt(res);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -12103,8 +12107,6 @@ static int js_binary_arith_bigint(JSContext *ctx, OPCodeEnum op,
|
||||||
}
|
}
|
||||||
JS_FreeBigInt(ctx, a, &a_s);
|
JS_FreeBigInt(ctx, a, &a_s);
|
||||||
JS_FreeBigInt(ctx, b, &b_s);
|
JS_FreeBigInt(ctx, b, &b_s);
|
||||||
JS_FreeValue(ctx, op1);
|
|
||||||
JS_FreeValue(ctx, op2);
|
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
JS_FreeValue(ctx, res);
|
JS_FreeValue(ctx, res);
|
||||||
throw_bf_exception(ctx, ret);
|
throw_bf_exception(ctx, ret);
|
||||||
|
@ -12112,11 +12114,6 @@ static int js_binary_arith_bigint(JSContext *ctx, OPCodeEnum op,
|
||||||
}
|
}
|
||||||
*pres = JS_CompactBigInt(ctx, res);
|
*pres = JS_CompactBigInt(ctx, res);
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
|
||||||
JS_FreeValue(ctx, res);
|
|
||||||
JS_FreeValue(ctx, op1);
|
|
||||||
JS_FreeValue(ctx, op2);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static no_inline __exception int js_binary_arith_slow(JSContext *ctx, JSValue *sp,
|
static no_inline __exception int js_binary_arith_slow(JSContext *ctx, JSValue *sp,
|
||||||
|
|
Loading…
Reference in a new issue