diff --git a/quickjs.c b/quickjs.c index f62e169..ba8c5ad 100644 --- a/quickjs.c +++ b/quickjs.c @@ -47540,7 +47540,7 @@ static const JSCFunctionListEntry js_global_funcs[] = { JS_CFUNC_MAGIC_DEF("encodeURIComponent", 1, js_global_encodeURI, 1 ), JS_CFUNC_DEF("escape", 1, js_global_escape ), JS_CFUNC_DEF("unescape", 1, js_global_unescape ), - JS_PROP_DOUBLE_DEF("Infinity", 1.0 / 0.0, 0 ), + JS_PROP_DOUBLE_DEF("Infinity", INFINITY, 0 ), JS_PROP_DOUBLE_DEF("NaN", NAN, 0 ), JS_PROP_UNDEFINED_DEF("undefined", 0 ), diff --git a/quickjs.h b/quickjs.h index b2d2ea7..a7d4357 100644 --- a/quickjs.h +++ b/quickjs.h @@ -132,16 +132,24 @@ typedef struct JSRefCountHeader { #define JS_MKVAL(tag, val) (((uint64_t)(0xF & tag) << 48) | (uint32_t)(val)) #define JS_MKPTR(tag, ptr) (((uint64_t)(0xF & tag) << 48) | ((uint64_t)(ptr) & 0x0000FFFFFFFFFFFFull)) - #define JS_NAN JS_MKVAL(JS_TAG_FLOAT64,1) + #define JS_NAN JS_MKVAL(JS_TAG_FLOAT64,0) + #define JS_INFINITY_NEGATIVE JS_MKVAL(JS_TAG_FLOAT64,1) + #define JS_INFINITY_POSITIVE JS_MKVAL(JS_TAG_FLOAT64,2) static inline double JS_VALUE_GET_FLOAT64(JSValue v) { + if (v > 0xFFFFFFFFFFFFFull) { union { JSValue v; double d; } u; - if (v == JS_NAN) - return JS_FLOAT64_NAN; u.v = ~v; return u.d; } + else if (v == JS_NAN) + return JS_FLOAT64_NAN; + else if (v == JS_INFINITY_POSITIVE) + return INFINITY; + else + return -INFINITY; + } static inline JSValue __JS_NewFloat64(JSContext *ctx, double d) { @@ -149,8 +157,14 @@ typedef struct JSRefCountHeader { JSValue v; u.d = d; /* normalize NaN */ - if (js_unlikely((u.u64 & 0x7ff0000000000000) == 0x7ff0000000000000)) + if (js_unlikely((u.u64 & 0x7ff0000000000000) == 0x7ff0000000000000)) { + if( isnan(d)) v = JS_NAN; + else if (d < 0.0) + v = JS_INFINITY_NEGATIVE; + else + v = JS_INFINITY_POSITIVE; + } else v = ~u.u64; return v;