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.

add bigint support to js_truthy and to_string_val

+81 -34
+4 -3
include/ant.h
··· 13 13 #define STR_PROTO "__proto__" 14 14 #define STR_PROTO_LEN 9 15 15 16 - #define ANT_LIMIT_SIZE_CACHE 16384 17 - #define ANT_STRING(s) js_mkstr(js, s, sizeof(s) - 1) 18 - #define ANT_PTR(ptr) js_mknum((unsigned long)(ptr)) 16 + #define ANT_STRING(s) js_mkstr(js, s, sizeof(s) - 1) 17 + #define ANT_PTR(ptr) js_mknum((unsigned long)(ptr)) 18 + #define ANT_COPY(buf, len, s) cpy(buf, len, s, sizeof(s) - 1) 19 19 20 20 struct js; 21 21 22 22 typedef uint32_t jsoff_t; 23 23 typedef uint64_t jsval_t; 24 24 25 + #define ANT_LIMIT_SIZE_CACHE 16384 25 26 #define GC_FWD_ARGS jsval_t (*fwd_val)(void *ctx, jsval_t old), void *ctx 26 27 #define GC_UPDATE_ARGS struct js *js, jsoff_t (*fwd_off)(void *ctx, jsoff_t old), GC_FWD_ARGS 27 28
+77 -31
src/ant.c
··· 772 772 773 773 static bool is_digit(int c); 774 774 static bool is_proxy(struct js *js, jsval_t obj); 775 + static bool bigint_is_zero(struct js *js, jsval_t v); 775 776 776 777 static bool streq(const char *buf, size_t len, const char *p, size_t n); 777 778 static bool is_this_loop_continue_target(int depth_at_entry); ··· 830 831 static jsval_t get_prototype_for_type(struct js *js, uint8_t type); 831 832 static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len); 832 833 static jsval_t setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v); 834 + 833 835 static descriptor_entry_t *lookup_descriptor(jsoff_t obj_off, const char *key, size_t klen); 836 + static const char *bigint_digits(struct js *js, jsval_t v, size_t *len); 834 837 835 838 typedef struct { jsval_t handle; bool is_new; } ctor_t; 836 839 ··· 858 861 if (vtype(prim) == T_STR) return prim; 859 862 } 860 863 return js_call_toString(js, val); 864 + } 865 + 866 + bool js_truthy(struct js *js, jsval_t v) { 867 + static const void *dispatch[] = { 868 + [T_OBJ] = &&l_true, 869 + [T_FUNC] = &&l_true, 870 + [T_ARR] = &&l_true, 871 + [T_BOOL] = &&l_bool, 872 + [T_STR] = &&l_str, 873 + [T_BIGINT] = &&l_bigint, 874 + [T_NUM] = &&l_num, 875 + }; 876 + 877 + uint8_t t = vtype(v); 878 + if (t < sizeof(dispatch) / sizeof(*dispatch) && dispatch[t]) 879 + goto *dispatch[t]; 880 + return false; 881 + 882 + l_true: return true; 883 + l_bool: return vdata(v) != 0; 884 + l_str: return vstrlen(js, v) > 0; 885 + l_bigint: return !bigint_is_zero(js, v); 886 + l_num: { 887 + double d = tod(v); 888 + return d != 0.0 && !isnan(d); 889 + } 861 890 } 862 891 863 892 static void free_coroutine(coroutine_t *coro); ··· 2340 2369 2341 2370 static size_t tostr(struct js *js, jsval_t value, char *buf, size_t len) { 2342 2371 switch (vtype(value)) { 2343 - case T_UNDEF: return cpy(buf, len, "undefined", 9); 2344 - case T_NULL: return cpy(buf, len, "null", 4); 2345 - case T_BOOL: return cpy(buf, len, vdata(value) & 1 ? "true" : "false", vdata(value) & 1 ? 4 : 5); 2372 + case T_UNDEF: return ANT_COPY(buf, len, "undefined"); 2373 + case T_NULL: return ANT_COPY(buf, len, "null"); 2374 + 2375 + case T_BOOL: { 2376 + bool b = vdata(value) & 1; 2377 + return b ? ANT_COPY(buf, len, "true") : ANT_COPY(buf, len, "false"); 2378 + } 2379 + 2346 2380 case T_ARR: return strarr(js, value, buf, len); 2347 2381 case T_OBJ: return strobj(js, value, buf, len); 2348 2382 case T_STR: return strstring(js, value, buf, len); ··· 2350 2384 case T_BIGINT: return strbigint(js, value, buf, len); 2351 2385 case T_PROMISE: return strpromise(js, value, buf, len); 2352 2386 case T_FUNC: return strfunc(js, value, buf, len); 2353 - case T_CFUNC: return cpy(buf, len, "[native code]", 13); 2354 - case T_FFI: return cpy(buf, len, "[native code]", 13); 2355 - case T_PROP: return (size_t) snprintf(buf, len, "PROP@%lu", (unsigned long) vdata(value)); 2387 + 2388 + case T_CFUNC: return ANT_COPY(buf, len, "[native code]"); 2389 + case T_FFI: return ANT_COPY(buf, len, "[native code (ffi)]"); 2390 + 2391 + case T_PROP: return (size_t) snprintf(buf, len, "PROP@%lu", (unsigned long) vdata(value)); 2356 2392 default: return (size_t) snprintf(buf, len, "VTYPE%d", vtype(value)); 2357 2393 } 2358 2394 } 2359 2395 2360 2396 jsval_t js_tostring_val(struct js *js, jsval_t value) { 2361 2397 uint8_t t = vtype(value); 2362 - char buf[256]; 2363 - size_t len; 2398 + char *buf; size_t len, buflen; 2399 + 2400 + static const void *jump_table[] = { 2401 + [T_OBJ] = &&L_OBJ, [T_PROP] = &&L_DEFAULT, [T_STR] = &&L_STR, 2402 + [T_UNDEF] = &&L_UNDEF, [T_NULL] = &&L_NULL, [T_NUM] = &&L_NUM, 2403 + [T_BOOL] = &&L_BOOL, [T_FUNC] = &&L_OBJ, [T_CODEREF] = &&L_DEFAULT, 2404 + [T_CFUNC] = &&L_DEFAULT, [T_ERR] = &&L_DEFAULT, [T_ARR] = &&L_OBJ, 2405 + [T_PROMISE] = &&L_DEFAULT, [T_TYPEDARRAY] = &&L_DEFAULT, 2406 + [T_BIGINT] = &&L_BIGINT, [T_PROPREF] = &&L_DEFAULT, 2407 + [T_SYMBOL] = &&L_DEFAULT, [T_GENERATOR] = &&L_DEFAULT, [T_FFI] = &&L_DEFAULT 2408 + }; 2409 + 2410 + if (t < sizeof(jump_table) / sizeof(jump_table[0])) goto *jump_table[t]; 2411 + goto L_DEFAULT; 2412 + 2413 + L_STR: return value; 2414 + L_UNDEF: return js_mkstr(js, "undefined", 9); 2415 + L_NULL: return js_mkstr(js, "null", 4); 2416 + L_BOOL: return vdata(value) ? js_mkstr(js, "true", 4) : js_mkstr(js, "false", 5); 2417 + L_OBJ: return js_call_toString(js, value); 2364 2418 2365 - switch (t) { 2366 - case T_STR: return value; 2367 - case T_UNDEF: return js_mkstr(js, "undefined", 9); 2368 - case T_NULL: return js_mkstr(js, "null", 4); 2369 - case T_BOOL: return vdata(value) ? js_mkstr(js, "true", 4) : js_mkstr(js, "false", 5); 2370 - case T_NUM: len = strnum(value, buf, sizeof(buf)); return js_mkstr(js, buf, len); 2371 - case T_BIGINT: len = strbigint(js, value, buf, sizeof(buf)); return js_mkstr(js, buf, len); 2372 - case T_OBJ: 2373 - case T_ARR: 2374 - case T_FUNC: return js_call_toString(js, value); 2375 - default: len = tostr(js, value, buf, sizeof(buf)); return js_mkstr(js, buf, len); 2376 - } 2419 + L_NUM: 2420 + buf = (char *)ANT_GC_MALLOC(32); 2421 + len = strnum(value, buf, 32); 2422 + return js_mkstr(js, buf, len); 2423 + 2424 + L_BIGINT: 2425 + bigint_digits(js, value, &buflen); 2426 + buf = (char *)ANT_GC_MALLOC(buflen + 2); 2427 + len = strbigint(js, value, buf, buflen + 2); 2428 + return js_mkstr(js, buf, len); 2429 + 2430 + L_DEFAULT: 2431 + buf = (char *)ANT_GC_MALLOC(64); 2432 + len = tostr(js, value, buf, 64); 2433 + return js_mkstr(js, buf, len); 2377 2434 } 2378 2435 2379 2436 const char *js_str(struct js *js, jsval_t value) { ··· 2405 2462 2406 2463 if (is_err(str)) return ""; 2407 2464 return (const char *)&js->mem[vdata(str) + sizeof(jsoff_t)]; 2408 - } 2409 - 2410 - static bool bigint_is_zero(struct js *js, jsval_t v); 2411 - 2412 - bool js_truthy(struct js *js, jsval_t v) { 2413 - uint8_t t = vtype(v); 2414 - double d; 2415 - return (t == T_BOOL && vdata(v) != 0) || 2416 - (t == T_NUM && (d = tod(v), d != 0.0 && !isnan(d))) || 2417 - (t == T_OBJ || t == T_FUNC || t == T_ARR) || (t == T_STR && vstrlen(js, v) > 0) || 2418 - (t == T_BIGINT && !bigint_is_zero(js, v)); 2419 2465 } 2420 2466 2421 2467 static bool js_try_grow_memory(struct js *js, size_t needed) {