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.

unify property key/value retrieval

+46 -69
+46 -69
src/ant.c
··· 778 778 static bool parse_func_params(struct js *js, uint8_t *flags, int *out_count); 779 779 static bool try_dynamic_setter(struct js *js, jsval_t obj, const char *key, size_t key_len, jsval_t value); 780 780 781 + static size_t strbigint(struct js *js, jsval_t value, char *buf, size_t len); 781 782 static size_t tostr(struct js *js, jsval_t value, char *buf, size_t len); 782 783 static size_t strpromise(struct js *js, jsval_t value, char *buf, size_t len); 783 784 static size_t js_to_pcre2_pattern(const char *src, size_t src_len, char *dst, size_t dst_size); ··· 1314 1315 return n; 1315 1316 } 1316 1317 1317 - static size_t strbigint(struct js *js, jsval_t value, char *buf, size_t len); 1318 + static inline jsoff_t get_prop_koff(struct js *js, jsoff_t prop) { 1319 + return loadoff(js, prop + (jsoff_t) sizeof(prop)); 1320 + } 1321 + 1322 + static void get_prop_key(struct js *js, jsoff_t prop, const char **key, jsoff_t *klen) { 1323 + jsoff_t koff = get_prop_koff(js, prop); 1324 + *klen = offtolen(loadoff(js, koff)); 1325 + *key = (char *) &js->mem[koff + sizeof(koff)]; 1326 + } 1327 + 1328 + static jsval_t get_prop_val(struct js *js, jsoff_t prop) { 1329 + jsoff_t koff = get_prop_koff(js, prop); 1330 + return loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 1331 + } 1318 1332 1319 1333 static bool is_small_array(struct js *js, jsval_t obj, int *elem_count) { 1320 1334 int count = 0; ··· 1324 1338 jsoff_t scan = next; 1325 1339 1326 1340 while (scan < js->brk && scan != 0) { 1327 - jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 1328 - jsoff_t klen = offtolen(loadoff(js, koff)); 1329 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1330 - 1341 + const char *key; jsoff_t klen; 1342 + get_prop_key(js, scan, &key, &klen); 1331 1343 if (streq(key, klen, "length", 6)) { 1332 - jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 1344 + jsval_t val = get_prop_val(js, scan); 1333 1345 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 1334 1346 break; 1335 1347 } ··· 1339 1351 for (jsoff_t i = 0; i < length; i++) { 1340 1352 char idx[16]; 1341 1353 snprintf(idx, sizeof(idx), "%u", (unsigned) i); 1342 - 1343 1354 jsoff_t idxlen = (jsoff_t) strlen(idx); 1344 1355 jsoff_t prop = next; 1345 1356 jsval_t val = js_mkundef(); 1346 - 1347 1357 bool found = false; 1348 1358 1349 1359 while (prop < js->brk && prop != 0) { 1350 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 1351 - jsoff_t klen = offtolen(loadoff(js, koff)); 1352 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1360 + const char *key; jsoff_t klen; 1361 + get_prop_key(js, prop, &key, &klen); 1353 1362 if (streq(key, klen, idx, idxlen)) { 1354 - val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 1363 + val = get_prop_val(js, prop); 1355 1364 found = true; 1356 1365 break; 1357 1366 } ··· 1377 1386 return true; 1378 1387 } 1379 1388 1380 - static void get_prop_key(struct js *js, jsoff_t prop, const char **key, jsoff_t *klen) { 1381 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 1382 - *klen = offtolen(loadoff(js, koff)); 1383 - *key = (char *) &js->mem[koff + sizeof(koff)]; 1384 - } 1385 - 1386 - static jsval_t get_prop_val(struct js *js, jsoff_t prop) { 1387 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 1388 - return loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 1389 - } 1390 - 1391 1389 static jsoff_t get_array_length(struct js *js, jsval_t arr) { 1392 1390 jsoff_t off = lkp_interned(js, arr, INTERN_LENGTH, 6); 1393 1391 if (!off) return 0; ··· 1507 1505 jsoff_t scan = next; 1508 1506 1509 1507 while (scan < js->brk && scan != 0) { 1510 - jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 1511 - jsoff_t klen = offtolen(loadoff(js, koff)); 1512 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1513 - 1508 + const char *key; jsoff_t klen; 1509 + get_prop_key(js, scan, &key, &klen); 1514 1510 if (streq(key, klen, "length", 6)) { 1515 - jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 1511 + jsval_t val = get_prop_val(js, scan); 1516 1512 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 1517 1513 break; 1518 1514 } ··· 1523 1519 if (i > 0) n += cpy(buf + n, len - n, ",", 1); 1524 1520 char idx[16]; 1525 1521 snprintf(idx, sizeof(idx), "%u", (unsigned) i); 1526 - 1527 1522 jsoff_t idxlen = (jsoff_t) strlen(idx); 1528 1523 jsoff_t prop = next; 1529 1524 jsval_t val = js_mkundef(); 1530 - 1531 1525 bool found = false; 1532 1526 1533 1527 while (prop < js->brk && prop != 0) { 1534 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 1535 - jsoff_t klen = offtolen(loadoff(js, koff)); 1536 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1528 + const char *key; jsoff_t klen; 1529 + get_prop_key(js, prop, &key, &klen); 1537 1530 if (streq(key, klen, idx, idxlen)) { 1538 - val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 1531 + val = get_prop_val(js, prop); 1539 1532 found = true; 1540 1533 break; 1541 1534 } ··· 1625 1618 jsoff_t header = loadoff(js, next); 1626 1619 if (is_slot_prop(header)) { next = next_prop(header); continue; } 1627 1620 1628 - jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1629 - jsoff_t klen = offtolen(loadoff(js, koff)); 1630 - 1631 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1621 + const char *key; jsoff_t klen; 1622 + get_prop_key(js, next, &key, &klen); 1632 1623 const char *tag_sym_key = get_toStringTag_sym_key(); 1633 1624 bool should_hide = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1634 1625 ··· 1638 1629 } 1639 1630 1640 1631 if (!should_hide) { 1641 - jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 1632 + jsval_t val = get_prop_val(js, next); 1642 1633 uint8_t t = vtype(val); 1643 1634 if (t == T_OBJ || t == T_ARR || t == T_FUNC) has_nested = true; 1644 1635 count++; ··· 2927 2918 jsoff_t length_prop_val = 0; 2928 2919 jsoff_t scan = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | FLAGMASK); 2929 2920 while (scan < js->brk && scan != 0) { 2930 - jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 2931 - jsoff_t klen = offtolen(loadoff(js, koff)); 2932 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 2921 + const char *key; jsoff_t klen; 2922 + get_prop_key(js, scan, &key, &klen); 2933 2923 if (streq(key, klen, "length", 6)) { 2934 - jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 2924 + jsval_t val = get_prop_val(js, scan); 2935 2925 if (vtype(val) == T_NUM) { 2936 2926 found_length_prop = true; 2937 2927 length_prop_val = (jsoff_t) tod(val); ··· 2939 2929 } else if (klen > 0 && key[0] >= '0' && key[0] <= '9') { 2940 2930 char *endptr; 2941 2931 unsigned long idx = strtoul(key, &endptr, 10); 2942 - if (endptr == key + klen && idx + 1 > max_idx) { 2943 - max_idx = (jsoff_t)(idx + 1); 2944 - } 2932 + if (endptr == key + klen && idx + 1 > max_idx) max_idx = (jsoff_t)(idx + 1); 2945 2933 } 2946 2934 scan = loadoff(js, scan) & ~(3U | FLAGMASK); 2947 2935 } ··· 2955 2943 size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 2956 2944 jsoff_t prop = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | FLAGMASK); 2957 2945 while (prop < js->brk && prop != 0) { 2958 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 2959 - jsoff_t klen = offtolen(loadoff(js, koff)); 2960 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 2961 - if (streq(key, klen, idxstr, idxlen)) { 2962 - return loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 2963 - } 2946 + const char *key; jsoff_t klen; 2947 + get_prop_key(js, prop, &key, &klen); 2948 + if (streq(key, klen, idxstr, idxlen)) return get_prop_val(js, prop); 2964 2949 prop = loadoff(js, prop) & ~(3U | FLAGMASK); 2965 2950 } 2966 2951 return js_mkundef(); ··· 9277 9262 jsoff_t header = loadoff(js, scan); 9278 9263 if (is_slot_prop(header)) { scan = next_prop(header); continue; } 9279 9264 9280 - jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 9281 - jsoff_t klen = offtolen(loadoff(js, koff)); 9282 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 9265 + const char *key; jsoff_t klen; 9266 + get_prop_key(js, scan, &key, &klen); 9283 9267 bool is_picked = false; 9284 9268 jsoff_t picked_len = arr_length(js, picked_keys); 9285 9269 for (jsoff_t i = 0; i < picked_len; i++) { ··· 9289 9273 if (klen == pklen && memcmp(key, &js->mem[pkoff], klen) == 0) { is_picked = true; break; } 9290 9274 } 9291 9275 if (!is_picked && !(klen == STR_PROTO_LEN && memcmp(key, STR_PROTO, STR_PROTO_LEN) == 0)) { 9292 - jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 9276 + jsval_t val = get_prop_val(js, scan); 9293 9277 jsval_t key_str = js_mkstr(js, key, klen); 9294 9278 if (is_err(key_str)) return key_str; 9295 9279 jsval_t res = setprop(js, rest_obj, key_str, val); ··· 9891 9875 while (scan < js->brk && scan != 0) { 9892 9876 jsoff_t header = loadoff(js, scan); 9893 9877 if (is_slot_prop(header)) { scan = next_prop(header); continue; } 9894 - 9895 - jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 9896 - jsoff_t klen = offtolen(loadoff(js, koff)); 9897 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 9878 + const char *key; jsoff_t klen; 9879 + get_prop_key(js, scan, &key, &klen); 9898 9880 if (streq(key, klen, "length", 6)) { 9899 - jsval_t val = loadval(js, scan + (jsoff_t) (sizeof(scan) + sizeof(koff))); 9881 + jsval_t val = get_prop_val(js, scan); 9900 9882 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 9901 9883 break; 9902 9884 } ··· 9913 9895 while (prop < js->brk && prop != 0) { 9914 9896 jsoff_t header = loadoff(js, prop); 9915 9897 if (is_slot_prop(header)) { prop = next_prop(header); continue; } 9916 - 9917 - jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 9918 - jsoff_t klen = offtolen(loadoff(js, koff)); 9919 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 9920 - if (streq(key, klen, idx, idxlen)) { 9921 - val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 9922 - break; 9923 - } 9898 + const char *key; jsoff_t klen; 9899 + get_prop_key(js, prop, &key, &klen); 9900 + if (streq(key, klen, idx, idxlen)) { val = get_prop_val(js, prop); break; } 9924 9901 prop = next_prop(header); 9925 9902 } 9926 9903