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 type flags and non-numeric type mask

+77 -18
+4
include/internal.h
··· 67 67 #define NANBOX_TYPE_MASK 0x1F 68 68 #define NANBOX_DATA_MASK 0x0000FFFFFFFFFFFFULL 69 69 70 + #define TYPE_FLAG(t) (1u << (t)) 71 + #define T_NON_NUMERIC_MASK (TYPE_FLAG(T_STR) | TYPE_FLAG(T_ARR) | TYPE_FLAG(T_FUNC) | TYPE_FLAG(T_CFUNC) | TYPE_FLAG(T_OBJ)) 72 + #define is_non_numeric(v) ((1u << vtype(v)) & T_NON_NUMERIC_MASK) 73 + 70 74 void js_gc_update_roots(GC_UPDATE_ARGS); 71 75 bool js_has_pending_coroutines(void); 72 76
+1 -1
meson.build
··· 96 96 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 97 97 98 98 version_conf = configuration_data() 99 - version_conf.set('ANT_VERSION', '0.3.2.7') 99 + version_conf.set('ANT_VERSION', '0.3.2.8') 100 100 version_conf.set('ANT_GIT_HASH', git_hash) 101 101 version_conf.set('ANT_BUILD_DATE', build_date) 102 102
+72 -17
src/ant.c
··· 3003 3003 if (end == str || *end != '\0') return NAN; 3004 3004 return val; 3005 3005 } 3006 + if (vtype(arg) == T_ARR || vtype(arg) == T_OBJ) { 3007 + jsval_t str_val = js_tostring_val(js, arg); 3008 + if (is_err(str_val) || vtype(str_val) != T_STR) return NAN; 3009 + return js_to_number(js, str_val); 3010 + } 3006 3011 return NAN; 3007 3012 } 3008 3013 ··· 4562 4567 keystr = keybuf; 4563 4568 keylen = strlen(keybuf); 4564 4569 } else { 4565 - return js_mkerr(js, "invalid index type"); 4570 + jsval_t str_val = js_tostring_val(js, key_val); 4571 + if (is_err(str_val)) return str_val; 4572 + jsoff_t slen; 4573 + jsoff_t off = vstr(js, str_val, &slen); 4574 + keystr = (char *) &js->mem[off]; 4575 + keylen = slen; 4566 4576 } 4567 4577 if (streq(keystr, keylen, "length", 6)) { 4568 4578 if (vtype(obj) == T_STR) { ··· 4580 4590 } 4581 4591 } 4582 4592 if (vtype(obj) == T_STR) { 4593 + double idx_d = NAN; 4583 4594 if (vtype(key_val) == T_NUM) { 4584 - double idx_d = tod(key_val); 4585 - if (idx_d < 0 || idx_d != (double)(long)idx_d) { 4586 - return js_mkundef(); 4587 - } 4595 + idx_d = tod(key_val); 4596 + } else { 4597 + char *endptr; 4598 + char temp[64]; 4599 + size_t copy_len = keylen < sizeof(temp) - 1 ? keylen : sizeof(temp) - 1; 4600 + memcpy(temp, keystr, copy_len); 4601 + temp[copy_len] = '\0'; 4602 + idx_d = strtod(temp, &endptr); 4603 + if (endptr == temp || *endptr != '\0') idx_d = NAN; 4604 + } 4605 + if (!isnan(idx_d) && idx_d >= 0 && idx_d == (double)(long)idx_d) { 4588 4606 jsoff_t idx = (jsoff_t) idx_d; 4589 4607 jsoff_t str_len = offtolen(loadoff(js, (jsoff_t) vdata(obj))); 4590 - if (idx >= str_len) { 4591 - return js_mkundef(); 4608 + if (idx < str_len) { 4609 + jsoff_t str_off = (jsoff_t) vdata(obj) + sizeof(jsoff_t); 4610 + char ch[2] = {js->mem[str_off + idx], 0}; 4611 + return js_mkstr(js, ch, 1); 4612 + } 4613 + } 4614 + jsoff_t off = lkp_proto(js, obj, keystr, keylen); 4615 + if (off != 0) return resolveprop(js, mkval(T_PROP, off)); 4616 + return js_mkundef(); 4617 + } 4618 + if (vtype(obj) == T_FUNC) { 4619 + if ((js->flags & F_STRICT) && (streq(keystr, keylen, "caller", 6) || streq(keystr, keylen, "arguments", 9))) { 4620 + return js_mkerr_typed(js, JS_ERR_TYPE, "'%.*s' not allowed on functions in strict mode", (int)keylen, keystr); 4621 + } 4622 + jsval_t func_obj = mkval(T_OBJ, vdata(obj)); 4623 + jsoff_t off = lkp_proto(js, obj, keystr, keylen); 4624 + if (off != 0) { 4625 + jsoff_t obj_off = (jsoff_t)vdata(obj); 4626 + descriptor_entry_t *desc = lookup_descriptor(obj_off, keystr, keylen); 4627 + if (desc) { 4628 + jsval_t key = js_mkstr(js, keystr, keylen); 4629 + return mkpropref(obj_off, (jsoff_t)vdata(key)); 4592 4630 } 4593 - jsoff_t str_off = (jsoff_t) vdata(obj) + sizeof(jsoff_t); 4594 - char ch[2] = {js->mem[str_off + idx], 0}; 4595 - return js_mkstr(js, ch, 1); 4631 + return mkval(T_PROP, off); 4632 + } 4633 + if (streq(keystr, keylen, "name", 4)) return js_mkstr(js, "", 0); 4634 + jsval_t key = js_mkstr(js, keystr, keylen); 4635 + jsval_t prop = setprop(js, func_obj, key, js_mkundef()); 4636 + return prop; 4637 + } 4638 + if (vtype(obj) == T_CFUNC) { 4639 + if ((js->flags & F_STRICT) && (streq(keystr, keylen, "caller", 6) || streq(keystr, keylen, "arguments", 9))) { 4640 + return js_mkerr_typed(js, JS_ERR_TYPE, "'%.*s' not allowed on functions in strict mode", (int)keylen, keystr); 4596 4641 } 4597 4642 jsoff_t off = lkp_proto(js, obj, keystr, keylen); 4598 4643 if (off != 0) return resolveprop(js, mkval(T_PROP, off)); 4644 + if (streq(keystr, keylen, "name", 4)) return js_mkstr(js, "", 0); 4599 4645 return js_mkundef(); 4646 + } 4647 + if (vtype(obj) == T_NUM || vtype(obj) == T_BOOL || vtype(obj) == T_BIGINT) { 4648 + jsval_t key = js_mkstr(js, keystr, keylen); 4649 + return mkprim_propref(obj, (jsoff_t)vdata(key)); 4600 4650 } 4601 4651 if (vtype(obj) != T_OBJ && vtype(obj) != T_ARR) { 4602 4652 return js_mkundef(); ··· 5939 5989 } else { 5940 5990 eq = vdata(l) == vdata(r); 5941 5991 } 5942 - } else if ((vtype(l) == T_BIGINT && vtype(r) == T_NUM) || 5943 - (vtype(l) == T_NUM && vtype(r) == T_BIGINT)) { 5992 + } else if ((vtype(l) == T_BIGINT && vtype(r) == T_NUM) || (vtype(l) == T_NUM && vtype(r) == T_BIGINT)) { 5944 5993 double num_val = vtype(l) == T_NUM ? tod(l) : tod(r); 5945 5994 jsval_t bigint_val = vtype(l) == T_BIGINT ? l : r; 5946 5995 if (isfinite(num_val) && num_val == trunc(num_val)) { ··· 5959 6008 double rnum = vdata(r) ? 1.0 : 0.0; 5960 6009 jsval_t result = do_op(js, op, l, tov(rnum)); 5961 6010 return result; 5962 - } else if ((vtype(l) == T_NUM && vtype(r) == T_STR) || 5963 - (vtype(l) == T_STR && vtype(r) == T_NUM)) { 6011 + } else if ((vtype(l) == T_NUM && vtype(r) == T_STR) || (vtype(l) == T_STR && vtype(r) == T_NUM)) { 5964 6012 double lnum = js_to_number(js, l); 5965 6013 double rnum = js_to_number(js, r); 5966 6014 eq = lnum == rnum; 6015 + } else if (vtype(l) == T_ARR || vtype(l) == T_OBJ) { 6016 + jsval_t l_prim = js_tostring_val(js, l); 6017 + if (!is_err(l_prim)) return do_op(js, op, l_prim, r); 6018 + } else if (vtype(r) == T_ARR || vtype(r) == T_OBJ) { 6019 + jsval_t r_prim = js_tostring_val(js, r); 6020 + if (!is_err(r_prim)) return do_op(js, op, l, r_prim); 5967 6021 } 5968 6022 return mkval(T_BOOL, op == TOK_EQ ? eq : !eq); 5969 6023 } ··· 5985 6039 default: return js_mkerr(js, "Unsupported BigInt operation"); 5986 6040 } 5987 6041 } 5988 - if (op == TOK_PLUS && (vtype(l) == T_STR || vtype(r) == T_STR || vtype(l) == T_ARR || vtype(r) == T_ARR)) { 6042 + 6043 + if (op == TOK_PLUS && (is_non_numeric(l) || is_non_numeric(r))) { 5989 6044 jsval_t l_str = l, r_str = r; 5990 6045 5991 6046 if (vtype(l) == T_ARR) { ··· 6043 6098 } else if (vtype(l) == T_UNDEF) { 6044 6099 a = NAN; 6045 6100 } else if (vtype(l) == T_ARR) { 6046 - a = NAN; 6101 + a = js_to_number(js, l); 6047 6102 } else if (vtype(l) == T_OBJ) { 6048 6103 jsoff_t vo_off = lkp_proto(js, l, "valueOf", 7); 6049 6104 if (vo_off != 0) { ··· 6086 6141 } else if (vtype(r) == T_UNDEF) { 6087 6142 b = NAN; 6088 6143 } else if (vtype(r) == T_ARR) { 6089 - b = NAN; 6144 + b = js_to_number(js, r); 6090 6145 } else if (vtype(r) == T_OBJ) { 6091 6146 jsoff_t vo_off = lkp_proto(js, r, "valueOf", 7); 6092 6147 if (vo_off != 0) {