fix_float

This commit is contained in:
Denis Angell
2024-05-25 13:52:15 +02:00
parent 033dedf979
commit 13719a1357

View File

@@ -826,6 +826,12 @@ FromJSInt(JSContext* ctx, JSValueConst& v)
{ {
if (JS_IsNumber(v)) if (JS_IsNumber(v))
{ {
if (JS_IsBigInt(ctx, v))
{
int64_t out = 0;
JS_ToBigInt64(ctx, &out, v);
return out;
}
int64_t out = 0; int64_t out = 0;
JS_ToInt64(ctx, &out, v); JS_ToInt64(ctx, &out, v);
return out; return out;
@@ -930,6 +936,7 @@ FromJSInt(JSContext* ctx, JSValueConst& v)
} }
#define returnJS(X) return JS_NewInt64(ctx, X) #define returnJS(X) return JS_NewInt64(ctx, X)
#define returnJSXFL(X) return JS_NewBigInt64(ctx, X)
template <typename T> template <typename T>
inline inline
@@ -1689,6 +1696,13 @@ DEFINE_JS_FUNCTION(
else else
out += "<could not display hex>"; out += "<could not display hex>";
} }
else if (JS_IsBigInt(ctx, data))
{
size_t len;
const char* cstr = JS_ToCStringLen(ctx, &len, data);
out += std::string(cstr, len);
JS_FreeCString(ctx, cstr);
}
else else
{ {
JSValue sdata = JS_JSONStringify(ctx, data, JS_UNDEFINED, JS_UNDEFINED); JSValue sdata = JS_JSONStringify(ctx, data, JS_UNDEFINED, JS_UNDEFINED);
@@ -7266,7 +7280,7 @@ DEFINE_JS_FUNCTION(
if (normalized == 0 || normalized == XFL_OVERFLOW) if (normalized == 0 || normalized == XFL_OVERFLOW)
returnJS(INVALID_FLOAT); returnJS(INVALID_FLOAT);
returnJS(normalized); returnJSXFL(normalized);
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -7388,7 +7402,7 @@ DEFINE_JS_FUNCTION(
!fits_u32(dp, ab)) !fits_u32(dp, ab))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_int(hookCtx, applyCtx, j, *f1, (uint32_t)(*dp), (uint32_t)(*ab))); returnJSXFL(__float_int(hookCtx, applyCtx, j, *f1, (uint32_t)(*dp), (uint32_t)(*ab)));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -7439,7 +7453,7 @@ DEFINE_JS_FUNCTION(
if (any_missing(f1, f2)) if (any_missing(f1, f2))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_multiply(hookCtx, applyCtx, j, *f1, *f2)); returnJSXFL(__float_multiply(hookCtx, applyCtx, j, *f1, *f2));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -7502,7 +7516,7 @@ DEFINE_JS_FUNCTION(
if (any_missing(f1, ru, n, d) || !fits_u32(ru, n, d)) if (any_missing(f1, ru, n, d) || !fits_u32(ru, n, d))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_mulratio(hookCtx, applyCtx, j, *f1, (uint32_t)(*ru), (uint32_t)(*n), (uint32_t)(*d))); returnJSXFL(__float_mulratio(hookCtx, applyCtx, j, *f1, (uint32_t)(*ru), (uint32_t)(*n), (uint32_t)(*d)));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -7534,7 +7548,7 @@ DEFINE_JS_FUNCTION(
if (*float1 == 0) if (*float1 == 0)
returnJS(0); returnJS(0);
RETURNJS_IF_INVALID_FLOAT(*float1); RETURNJS_IF_INVALID_FLOAT(*float1);
returnJS(hook_float::invert_sign(*float1)); returnJSXFL(hook_float::invert_sign(*float1));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -7686,7 +7700,7 @@ DEFINE_JS_FUNCTION(
if (any_missing(f1, f2)) if (any_missing(f1, f2))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_sum(hookCtx, applyCtx, j, *f1, *f2)); returnJSXFL(__float_sum(hookCtx, applyCtx, j, *f1, *f2));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8174,7 +8188,7 @@ DEFINE_JS_FUNCTION(
if (any_missing(f1, f2)) if (any_missing(f1, f2))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(float_divide_internal(*f1, *f2)); returnJSXFL(float_divide_internal(*f1, *f2));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8188,7 +8202,7 @@ DEFINE_JS_FUNCNARG(JSValue, float_one)
{ {
JS_HOOK_SETUP(); JS_HOOK_SETUP();
returnJS(float_one_internal); returnJSXFL(float_one_internal);
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8222,7 +8236,7 @@ DEFINE_JS_FUNCTION(
returnJS(DIVISION_BY_ZERO); returnJS(DIVISION_BY_ZERO);
if (*f1 == float_one_internal) if (*f1 == float_one_internal)
returnJS(float_one_internal); returnJS(float_one_internal);
returnJS(float_divide_internal(float_one_internal, *f1)); returnJSXFL(float_divide_internal(float_one_internal, *f1));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8256,7 +8270,7 @@ DEFINE_JS_FUNCTION(
if (*f1 == 0) if (*f1 == 0)
returnJS(0); returnJS(0);
returnJS(get_mantissa(*f1)); returnJSXFL(get_mantissa(*f1));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8290,7 +8304,7 @@ DEFINE_JS_FUNCTION(
if (*f1 == 0) if (*f1 == 0)
returnJS(0); returnJS(0);
returnJS(is_negative(*f1)); returnJSXFL(is_negative(*f1));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8388,7 +8402,7 @@ DEFINE_JS_FUNCTION(
if (!f1.has_value()) if (!f1.has_value())
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_log(hookCtx, applyCtx, j, *f1)); returnJSXFL(__float_log(hookCtx, applyCtx, j, *f1));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }
@@ -8439,7 +8453,7 @@ DEFINE_JS_FUNCTION(
if (any_missing(f1, n) || !fits_u32(n)) if (any_missing(f1, n) || !fits_u32(n))
returnJS(INVALID_ARGUMENT); returnJS(INVALID_ARGUMENT);
returnJS(__float_root(hookCtx, applyCtx, j, *f1, (uint32_t)(*n))); returnJSXFL(__float_root(hookCtx, applyCtx, j, *f1, (uint32_t)(*n)));
JS_HOOK_TEARDOWN(); JS_HOOK_TEARDOWN();
} }