MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

NaN boxing fixes

+26 -4
+1 -1
examples/spec/numbers.js
··· 64 64 test('unary minus', -42, -42); 65 65 66 66 test('Math.floor division', Math.floor(7 / 2), 3); 67 - test('bitwise or floor', 7 / 2 | 0, 3); 67 + test('bitwise or floor', (7 / 2) | 0, 3); 68 68 69 69 summary();
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.0.33') 77 + version_conf.set('ANT_VERSION', '0.1.0.34') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+24 -2
src/ant.c
··· 289 289 290 290 static jsval_t tov(double d) { union { double d; jsval_t v; } u = {d}; return u.v; } 291 291 static double tod(jsval_t v) { union { jsval_t v; double d; } u = {v}; return u.d; } 292 - static bool is_nan(jsval_t v) { return (v >> 52U) == 0x7feU; } 293 292 static size_t vdata(jsval_t v) { return (size_t) (v & ~((jsval_t) 0x7fffUL << 48U)); } 293 + 294 294 static jsoff_t coderefoff(jsval_t v) { return v & 0xffffffU; } 295 295 static jsoff_t codereflen(jsval_t v) { return (v >> 24U) & 0xffffffU; } 296 296 static jsoff_t propref_obj(jsval_t v) { return v & 0xffffffU; } 297 297 static jsoff_t propref_key(jsval_t v) { return (v >> 24U) & 0xffffffU; } 298 + 299 + static bool is_nan(jsval_t v) { 300 + if ((v >> 52U) != 0x7feU) return false; 301 + // real doubles in 0x7FE range have large mantissa values 302 + // tagged values have small memory offsets, so upper data bits are 0 303 + return (v & 0xf00000000000UL) == 0; 304 + } 298 305 299 306 static const char *typestr(uint8_t t) { 300 307 if (t == T_CFUNC) return "function"; ··· 4450 4457 case TOK_AND: return tov((double)((long) a & (long) b)); 4451 4458 case TOK_OR: return tov((double)((long) a | (long) b)); 4452 4459 case TOK_UMINUS: return tov(-b); 4453 - case TOK_UPLUS: return r; 4460 + case TOK_UPLUS: return tov(b); 4454 4461 case TOK_TILDA: return tov((double)(~(long) b)); 4455 4462 case TOK_SHL: return tov((double)((long) a << (long) b)); 4456 4463 case TOK_SHR: return tov((double)((long) a >> (long) b)); ··· 11760 11767 11761 11768 char buf[64]; 11762 11769 snprintf(buf, sizeof(buf), "%.*e", digits, tod(num)); 11770 + char *e = strchr(buf, 'e'); 11771 + if (e && (e[1] == '+' || e[1] == '-') && e[2] == '0' && e[3] != '\0') { 11772 + memmove(e + 2, e + 3, strlen(e + 3) + 1); 11773 + } 11763 11774 return js_mkstr(js, buf, strlen(buf)); 11764 11775 } 11765 11776 ··· 14115 14126 14116 14127 jsval_t number_ctor_obj = mkobj(js, 0); 14117 14128 set_proto(js, number_ctor_obj, function_proto); 14129 + 14118 14130 setprop(js, number_ctor_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_Number)); 14119 14131 setprop(js, number_ctor_obj, js_mkstr(js, "isNaN", 5), js_mkfun(builtin_Number_isNaN)); 14120 14132 setprop(js, number_ctor_obj, js_mkstr(js, "isFinite", 8), js_mkfun(builtin_Number_isFinite)); 14121 14133 setprop(js, number_ctor_obj, js_mkstr(js, "isInteger", 9), js_mkfun(builtin_Number_isInteger)); 14122 14134 setprop(js, number_ctor_obj, js_mkstr(js, "isSafeInteger", 13), js_mkfun(builtin_Number_isSafeInteger)); 14135 + 14136 + setprop(js, number_ctor_obj, js_mkstr(js, "MAX_VALUE", 9), tov(1.7976931348623157e+308)); 14137 + setprop(js, number_ctor_obj, js_mkstr(js, "MIN_VALUE", 9), tov(5e-324)); 14138 + setprop(js, number_ctor_obj, js_mkstr(js, "MAX_SAFE_INTEGER", 16), tov(9007199254740991.0)); 14139 + setprop(js, number_ctor_obj, js_mkstr(js, "MIN_SAFE_INTEGER", 16), tov(-9007199254740991.0)); 14140 + setprop(js, number_ctor_obj, js_mkstr(js, "POSITIVE_INFINITY", 17), tov(INFINITY)); 14141 + setprop(js, number_ctor_obj, js_mkstr(js, "NEGATIVE_INFINITY", 17), tov(-INFINITY)); 14142 + setprop(js, number_ctor_obj, js_mkstr(js, "NaN", 3), tov(NAN)); 14143 + setprop(js, number_ctor_obj, js_mkstr(js, "EPSILON", 7), tov(2.220446049250313e-16)); 14144 + 14123 14145 setprop(js, number_ctor_obj, js_mkstr(js, "prototype", 9), number_proto); 14124 14146 setprop(js, glob, js_mkstr(js, "Number", 6), mkval(T_FUNC, vdata(number_ctor_obj))); 14125 14147