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.

slotmask

+95 -100
+1 -2
include/config.h
··· 16 16 #define JS_EXPR_MAX 20 17 17 #define JS_GC_THRESHOLD 0.75 18 18 19 - #define GCMASK ~(((jsoff_t) ~0) >> 1) 19 + #define SLOTMASK ~(((jsoff_t) ~0) >> 1) 20 20 #define CONSTMASK (~(((jsoff_t) ~0) >> 1) >> 1) 21 21 #define ARRMASK (~(((jsoff_t) ~0) >> 1) >> 2) 22 - #define SLOTMASK (~(((jsoff_t) ~0) >> 1) >> 3) 23 22 24 23 typedef enum { 25 24 SLOT_NONE = 0,
+1 -2
include/config.h.in
··· 8 8 #define JS_EXPR_MAX 20 9 9 #define JS_GC_THRESHOLD 0.75 10 10 11 - #define GCMASK ~(((jsoff_t) ~0) >> 1) 11 + #define SLOTMASK ~(((jsoff_t) ~0) >> 1) 12 12 #define CONSTMASK (~(((jsoff_t) ~0) >> 1) >> 1) 13 13 #define ARRMASK (~(((jsoff_t) ~0) >> 1) >> 2) 14 - #define SLOTMASK (~(((jsoff_t) ~0) >> 1) >> 3) 15 14 16 15 typedef enum { 17 16 SLOT_NONE = 0,
+1 -1
meson.build
··· 79 79 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 80 80 81 81 version_conf = configuration_data() 82 - version_conf.set('ANT_VERSION', '0.2.2.30') 82 + version_conf.set('ANT_VERSION', '0.2.2.31') 83 83 version_conf.set('ANT_GIT_HASH', git_hash) 84 84 version_conf.set('ANT_BUILD_DATE', build_date) 85 85
+92 -95
src/ant.c
··· 1129 1129 if (stringify_depth >= MAX_STRINGIFY_DEPTH) return; 1130 1130 stringify_stack[stringify_depth++] = obj; 1131 1131 1132 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1132 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1133 1133 while (next < js->brk && next != 0) { 1134 1134 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1135 1135 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 1136 1136 scan_refs(js, val); 1137 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1137 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1138 1138 } 1139 1139 1140 1140 jsoff_t proto_off = lkp_interned(js, obj, INTERN_PROTO, 9); ··· 1155 1155 if (stringify_depth >= MAX_STRINGIFY_DEPTH) return; 1156 1156 stringify_stack[stringify_depth++] = obj; 1157 1157 1158 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1158 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1159 1159 while (next < js->brk && next != 0) { 1160 1160 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1161 1161 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 1162 1162 scan_refs(js, val); 1163 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1163 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1164 1164 } 1165 1165 1166 1166 stringify_depth--; ··· 1177 1177 if (stringify_depth >= MAX_STRINGIFY_DEPTH) return; 1178 1178 stringify_stack[stringify_depth++] = func_obj; 1179 1179 1180 - jsoff_t next = loadoff(js, (jsoff_t) vdata(func_obj)) & ~(3U | CONSTMASK | ARRMASK); 1180 + jsoff_t next = loadoff(js, (jsoff_t) vdata(func_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1181 1181 while (next < js->brk && next != 0) { 1182 1182 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1183 1183 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 1184 1184 scan_refs(js, val); 1185 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1185 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1186 1186 } 1187 1187 1188 1188 stringify_depth--; ··· 1239 1239 1240 1240 push_stringify(obj); 1241 1241 size_t n = cpy(buf, len, "[ ", 2); 1242 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1242 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1243 1243 jsoff_t length = 0; 1244 1244 jsoff_t scan = next; 1245 1245 ··· 1253 1253 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 1254 1254 break; 1255 1255 } 1256 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 1256 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1257 1257 } 1258 1258 1259 1259 for (jsoff_t i = 0; i < length; i++) { ··· 1276 1276 found = true; 1277 1277 break; 1278 1278 } 1279 - prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK); 1279 + prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1280 1280 } 1281 1281 1282 1282 if (found) { ··· 1296 1296 1297 1297 push_stringify(obj); 1298 1298 size_t n = 0; 1299 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1299 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1300 1300 jsoff_t length = 0; 1301 1301 jsoff_t scan = next; 1302 1302 ··· 1310 1310 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 1311 1311 break; 1312 1312 } 1313 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 1313 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1314 1314 } 1315 1315 1316 1316 for (jsoff_t i = 0; i < length; i++) { ··· 1333 1333 found = true; 1334 1334 break; 1335 1335 } 1336 - prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK); 1336 + prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1337 1337 } 1338 1338 1339 1339 if (found) { ··· 1427 1427 push_stringify(proto_val); 1428 1428 1429 1429 bool has_proto_props = false; 1430 - jsoff_t proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK | ARRMASK); 1430 + jsoff_t proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1431 1431 1432 1432 while (proto_next < js->brk && proto_next != 0) { 1433 1433 jsoff_t pkoff = loadoff(js, proto_next + (jsoff_t) sizeof(proto_next)); ··· 1440 1440 has_proto_props = true; 1441 1441 break; 1442 1442 } 1443 - proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK | ARRMASK); 1443 + proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1444 1444 } 1445 1445 1446 1446 if (!*first) n += cpy(buf + n, len - n, ",\n", 2); ··· 1452 1452 stringify_indent++; 1453 1453 1454 1454 bool proto_first = true; 1455 - proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK | ARRMASK); 1455 + proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1456 1456 while (proto_next < js->brk && proto_next != 0) { 1457 1457 jsoff_t pkoff = loadoff(js, proto_next + (jsoff_t) sizeof(proto_next)); 1458 1458 jsval_t pval = loadval(js, proto_next + (jsoff_t) (sizeof(proto_next) + sizeof(pkoff))); ··· 1470 1470 n += cpy(buf + n, len - n, ": ", 2); 1471 1471 n += tostr(js, pval, buf + n, len - n); 1472 1472 } 1473 - proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK | ARRMASK); 1473 + proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1474 1474 } 1475 1475 1476 1476 stringify_indent--; ··· 1612 1612 continue_object_print: 1613 1613 1614 1614 stringify_indent++; 1615 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1615 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1616 1616 bool first = true; 1617 1617 1618 1618 while (next < js->brk && next != 0) { ··· 1662 1662 n += tostr(js, val, buf + n, len - n); 1663 1663 } 1664 1664 } 1665 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1665 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1666 1666 } 1667 1667 1668 - next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 1668 + next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1669 1669 while (next < js->brk && next != 0) { 1670 1670 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1671 1671 jsoff_t klen = offtolen(loadoff(js, koff)); ··· 1718 1718 } 1719 1719 } 1720 1720 } 1721 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1721 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1722 1722 } 1723 1723 1724 1724 stringify_indent--; ··· 1836 1836 stringify_indent++; 1837 1837 bool first = true; 1838 1838 1839 - jsoff_t next = loadoff(js, (jsoff_t) vdata(func_obj)) & ~(3U | CONSTMASK | ARRMASK); 1839 + jsoff_t next = loadoff(js, (jsoff_t) vdata(func_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1840 1840 while (next < js->brk && next != 0) { 1841 1841 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 1842 1842 jsoff_t klen = offtolen(loadoff(js, koff)); ··· 1851 1851 n += cpy(buf + n, len - n, ": ", 2); 1852 1852 n += tostr(js, val, buf + n, len - n); 1853 1853 } 1854 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 1854 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 1855 1855 } 1856 1856 1857 1857 jsoff_t proto_off = lkp_interned(js, func_obj, INTERN_PROTOTYPE, 9); ··· 2715 2715 jsoff_t max_idx = 0; 2716 2716 bool found_length_prop = false; 2717 2717 jsoff_t length_prop_val = 0; 2718 - jsoff_t scan = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | CONSTMASK | ARRMASK); 2718 + jsoff_t scan = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2719 2719 while (scan < js->brk && scan != 0) { 2720 2720 jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 2721 2721 jsoff_t klen = offtolen(loadoff(js, koff)); ··· 2733 2733 max_idx = (jsoff_t)(idx + 1); 2734 2734 } 2735 2735 } 2736 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 2736 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2737 2737 } 2738 2738 if (found_length_prop) return length_prop_val; 2739 2739 return max_idx; ··· 2743 2743 if (vtype(arr) != T_ARR) return js_mkundef(); 2744 2744 char idxstr[16]; 2745 2745 size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 2746 - jsoff_t prop = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | CONSTMASK | ARRMASK); 2746 + jsoff_t prop = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2747 2747 while (prop < js->brk && prop != 0) { 2748 2748 jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); 2749 2749 jsoff_t klen = offtolen(loadoff(js, koff)); ··· 2751 2751 if (streq(key, klen, idxstr, idxlen)) { 2752 2752 return loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 2753 2753 } 2754 - prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK); 2754 + prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2755 2755 } 2756 2756 return js_mkundef(); 2757 2757 } ··· 2906 2906 const char *interned = intern_string(p, klen); 2907 2907 if (interned) set_koff_intern(koff, interned); 2908 2908 2909 - jsoff_t prop_header = (b & ~(3U | CONSTMASK | ARRMASK)) | T_PROP; 2909 + jsoff_t prop_header = (b & ~(3U | CONSTMASK | ARRMASK | SLOTMASK)) | T_PROP; 2910 2910 if (is_const) prop_header |= CONSTMASK; 2911 2911 return mkentity(js, prop_header, buf, sizeof(buf)); 2912 2912 } ··· 2930 2930 2931 2931 static jsoff_t search_slot(struct js *js, jsval_t obj, internal_slot_t slot) { 2932 2932 jsoff_t off = (jsoff_t) vdata(obj); 2933 + if (off >= js->brk) return 0; 2933 2934 jsoff_t next = loadoff(js, off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2934 2935 jsoff_t header, koff; 2935 2936 ··· 2945 2946 2946 2947 static jsoff_t lkp_header_slot(struct js *js, jsval_t obj, internal_slot_t slot) { 2947 2948 jsoff_t off = (jsoff_t) vdata(obj); 2949 + if (off >= js->brk) return 0; 2948 2950 jsoff_t next = loadoff(js, off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 2949 2951 if (next == 0 || next >= js->brk) return 0; 2950 2952 jsoff_t header = loadoff(js, next); ··· 3250 3252 } 3251 3253 3252 3254 static inline jsoff_t esize(jsoff_t w) { 3253 - jsoff_t cleaned = w & ~(GCMASK | CONSTMASK); 3255 + jsoff_t cleaned = w & ~(CONSTMASK | ARRMASK | SLOTMASK); 3254 3256 switch (cleaned & 3U) { 3255 3257 case T_OBJ: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t)); 3256 3258 case T_PROP: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t) + sizeof(jsval_t)); ··· 3863 3865 return ce->prop_off; 3864 3866 } 3865 3867 3866 - jsoff_t off = loadoff(js, obj_off) & ~(3U | CONSTMASK | ARRMASK); 3868 + jsoff_t off = loadoff(js, obj_off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 3867 3869 while (off < js->brk && off != 0) { 3868 3870 jsoff_t koff = loadoff(js, (jsoff_t) (off + sizeof(off))); 3869 3871 jsoff_t klen = (loadoff(js, koff) >> 2) - 1; ··· 3888 3890 } 3889 3891 } 3890 3892 } 3891 - off = loadoff(js, off) & ~(3U | CONSTMASK | ARRMASK); 3893 + off = loadoff(js, off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 3892 3894 } 3893 3895 return 0; 3894 3896 } ··· 6711 6713 if (st != T_OBJ && st != T_ARR && st != T_FUNC) goto spread_next; 6712 6714 6713 6715 jsval_t src_obj = (st == T_OBJ) ? spread_obj : mkval(T_OBJ, vdata(spread_obj)); 6714 - jsoff_t next_prop = loadoff(js, (jsoff_t) vdata(src_obj)) & ~(3U | CONSTMASK | ARRMASK); 6716 + jsoff_t next_prop = loadoff(js, (jsoff_t) vdata(src_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 6715 6717 6716 6718 while (next_prop < js->brk && next_prop != 0) { 6717 6719 jsoff_t koff = loadoff(js, next_prop + (jsoff_t) sizeof(next_prop)); ··· 6719 6721 const char *prop_key = (char *) &js->mem[koff + sizeof(koff)]; 6720 6722 jsval_t prop_val = loadval(js, next_prop + (jsoff_t) (sizeof(next_prop) + sizeof(koff))); 6721 6723 6722 - next_prop = loadoff(js, next_prop) & ~(3U | CONSTMASK | ARRMASK); 6724 + next_prop = loadoff(js, next_prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 6723 6725 if (is_internal_prop(prop_key, klen)) continue; 6724 6726 6725 6727 jsval_t key_str = js_mkstr(js, prop_key, klen); ··· 7789 7791 if (js->flags & F_STRICT) return js_mkerr_typed(js, JS_ERR_TYPE, "cannot delete non-configurable property"); 7790 7792 return js_mkfalse(); 7791 7793 } 7792 - jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | CONSTMASK | GCMASK); 7794 + jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 7793 7795 if (first_prop == prop_off) { 7794 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 7796 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 7795 7797 jsoff_t current = loadoff(js, obj_off); 7796 - saveoff(js, obj_off, (deleted_next & ~3U) | (current & (GCMASK | CONSTMASK | 3U))); 7797 - saveoff(js, prop_off, loadoff(js, prop_off) | GCMASK); 7798 + saveoff(js, obj_off, (deleted_next & ~3U) | (current & (CONSTMASK | ARRMASK | SLOTMASK | 3U))); 7798 7799 invalidate_prop_cache(obj_off); 7799 7800 return js_mktrue(); 7800 7801 } 7801 7802 jsoff_t prev = first_prop; 7802 7803 while (prev != 0) { 7803 - jsoff_t next_prop = loadoff(js, prev) & ~(3U | CONSTMASK | GCMASK); 7804 + jsoff_t next_prop = loadoff(js, prev) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 7804 7805 if (next_prop == prop_off) { 7805 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 7806 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 7806 7807 jsoff_t current = loadoff(js, prev); 7807 - saveoff(js, prev, (deleted_next & ~3U) | (current & (GCMASK | CONSTMASK | 3U))); 7808 - saveoff(js, prop_off, loadoff(js, prop_off) | GCMASK); 7808 + saveoff(js, prev, (deleted_next & ~3U) | (current & (CONSTMASK | ARRMASK | SLOTMASK | 3U))); 7809 7809 invalidate_prop_cache(obj_off); 7810 7810 return js_mktrue(); 7811 7811 } ··· 7829 7829 7830 7830 for (jsoff_t off = 0; off < js->brk;) { 7831 7831 jsoff_t v = loadoff(js, off); 7832 - jsoff_t cleaned = v & ~(GCMASK | CONSTMASK); 7832 + jsoff_t cleaned = v & ~(CONSTMASK | ARRMASK | SLOTMASK); 7833 7833 jsoff_t n = esize(cleaned); 7834 7834 if ((cleaned & 3) == T_OBJ) { 7835 7835 jsoff_t first_prop = cleaned & ~3U; ··· 7840 7840 } 7841 7841 jsoff_t cur_prop = first_prop; 7842 7842 while (cur_prop != 0 && cur_prop < js->brk) { 7843 - jsoff_t next = loadoff(js, cur_prop) & ~(GCMASK | CONSTMASK | 3U); 7843 + jsoff_t next = loadoff(js, cur_prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 7844 7844 if (next == prop_off) { 7845 7845 owner_obj_off = off; 7846 7846 prev_prop_off = cur_prop; ··· 7884 7884 } 7885 7885 7886 7886 if (is_first_prop) { 7887 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 7887 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 7888 7888 jsoff_t current = loadoff(js, owner_obj_off); 7889 - saveoff(js, owner_obj_off, (deleted_next & ~3U) | (current & (GCMASK | CONSTMASK | 3U))); 7889 + saveoff(js, owner_obj_off, (deleted_next & ~3U) | (current & (CONSTMASK | ARRMASK | SLOTMASK | 3U))); 7890 7890 } else { 7891 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 7891 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 7892 7892 jsoff_t current = loadoff(js, prev_prop_off); 7893 - saveoff(js, prev_prop_off, (deleted_next & ~3U) | (current & (GCMASK | CONSTMASK | 3U))); 7893 + saveoff(js, prev_prop_off, (deleted_next & ~3U) | (current & (CONSTMASK | ARRMASK | SLOTMASK | 3U))); 7894 7894 } 7895 - saveoff(js, prop_off, loadoff(js, prop_off) | GCMASK); 7896 7895 invalidate_prop_cache(owner_obj_off); 7897 7896 } 7898 7897 (void) save_pos; ··· 8381 8380 obj_destruct_rest:; 8382 8381 jsval_t rest_obj = mkobj(js, 0); 8383 8382 if (is_err(rest_obj)) return rest_obj; 8384 - jsoff_t scan = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 8383 + jsoff_t scan = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8385 8384 while (scan < js->brk && scan != 0) { 8386 8385 jsoff_t koff = loadoff(js, scan + (jsoff_t) sizeof(scan)); 8387 8386 jsoff_t klen = offtolen(loadoff(js, koff)); ··· 8401 8400 jsval_t res = setprop(js, rest_obj, key_str, val); 8402 8401 if (is_err(res)) return res; 8403 8402 } 8404 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 8403 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8405 8404 } 8406 8405 { 8407 8406 const char *vn = &js->code[var_off]; ··· 8946 8945 8947 8946 static jsval_t for_in_iter_object(struct js *js, for_iter_ctx_t *ctx, jsval_t obj) { 8948 8947 jsval_t iter_obj = (vtype(obj) == T_FUNC) ? mkval(T_OBJ, vdata(obj)) : obj; 8949 - jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(iter_obj)) & ~(3U | CONSTMASK | ARRMASK); 8948 + jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(iter_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8950 8949 8951 8950 while (prop_off < js->brk && prop_off != 0) { 8952 8951 jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); ··· 8966 8965 if (js->flags & F_RETURN) return v; 8967 8966 } 8968 8967 8969 - prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK | ARRMASK); 8968 + prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8970 8969 } 8971 8970 8972 8971 return js_mkundef(); 8973 8972 } 8974 8973 8975 8974 static jsval_t for_of_iter_array(struct js *js, for_iter_ctx_t *ctx, jsval_t iterable) { 8976 - jsoff_t next_prop = loadoff(js, (jsoff_t) vdata(iterable)) & ~(3U | CONSTMASK | ARRMASK); 8975 + jsoff_t next_prop = loadoff(js, (jsoff_t) vdata(iterable)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8977 8976 jsoff_t length = 0, scan = next_prop; 8978 8977 8979 8978 while (scan < js->brk && scan != 0) { ··· 8985 8984 if (vtype(val) == T_NUM) length = (jsoff_t) tod(val); 8986 8985 break; 8987 8986 } 8988 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 8987 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 8989 8988 } 8990 8989 8991 8990 for (jsoff_t i = 0; i < length; i++) { ··· 9003 9002 val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff))); 9004 9003 break; 9005 9004 } 9006 - prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK); 9005 + prop = loadoff(js, prop) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 9007 9006 } 9008 9007 9009 9008 jsval_t err = for_iter_bind_var(js, ctx, val); ··· 9228 9227 iter_obj = mkval(T_OBJ, vdata(obj)); 9229 9228 } 9230 9229 9231 - jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(iter_obj)) & ~(3U | CONSTMASK | ARRMASK); 9230 + jsoff_t prop_off = loadoff(js, (jsoff_t) vdata(iter_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 9232 9231 9233 9232 while (prop_off < js->brk && prop_off != 0) { 9234 9233 jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); ··· 9292 9291 } 9293 9292 } 9294 9293 9295 - prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK | ARRMASK); 9294 + prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 9296 9295 } 9297 9296 } 9298 9297 ··· 12875 12874 12876 12875 jsval_t arr = mkarr(js); 12877 12876 jsoff_t idx = 0; 12878 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 12877 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12879 12878 12880 12879 while (next < js->brk && next != 0) { 12881 12880 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 12882 12881 jsoff_t klen = offtolen(loadoff(js, koff)); 12883 12882 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 12884 12883 12885 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 12884 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12886 12885 if (is_internal_prop(key, klen)) continue; 12887 12886 12888 12887 bool should_include = true; ··· 12906 12905 } 12907 12906 } 12908 12907 12909 - next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 12908 + next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12910 12909 while (next < js->brk && next != 0) { 12911 12910 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 12912 12911 jsoff_t klen = offtolen(loadoff(js, koff)); 12913 12912 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 12914 12913 12915 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 12914 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12916 12915 12917 12916 if (klen > 7 && key[0] == '_' && key[1] == '_' && key[2] == 'd' && 12918 12917 key[3] == 'e' && key[4] == 's' && key[5] == 'c' && key[6] == '_') { ··· 12983 12982 12984 12983 jsval_t arr = mkarr(js); 12985 12984 jsoff_t idx = 0; 12986 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 12985 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12987 12986 12988 12987 while (next < js->brk && next != 0) { 12989 12988 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 12991 12990 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 12992 12991 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 12993 12992 12994 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 12993 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 12995 12994 if (is_internal_prop(key, klen)) continue; 12996 12995 12997 12996 bool should_include = true; ··· 13038 13037 13039 13038 jsval_t arr = mkarr(js); 13040 13039 jsoff_t idx = 0; 13041 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 13040 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13042 13041 13043 13042 while (next < js->brk && next != 0) { 13044 13043 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 13046 13045 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13047 13046 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 13048 13047 13049 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13048 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13050 13049 13051 13050 if (is_internal_prop(key, klen)) continue; 13052 13051 ··· 13149 13148 13150 13149 if (nargs >= 2 && vtype(args[1]) == T_OBJ) { 13151 13150 jsval_t props = args[1]; 13152 - jsoff_t next = loadoff(js, (jsoff_t) vdata(props)) & ~(3U | CONSTMASK | ARRMASK); 13151 + jsoff_t next = loadoff(js, (jsoff_t) vdata(props)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13153 13152 13154 13153 while (next < js->brk && next != 0) { 13155 13154 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 13166 13165 } 13167 13166 } 13168 13167 13169 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13168 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13170 13169 } 13171 13170 } 13172 13171 ··· 13321 13320 if (!configurable) { 13322 13321 jsoff_t head = (jsoff_t) vdata(as_obj); 13323 13322 jsoff_t firstprop = loadoff(js, head); 13324 - if ((firstprop & ~(3U | CONSTMASK | ARRMASK)) == existing_off) { 13323 + if ((firstprop & ~(3U | CONSTMASK | ARRMASK | SLOTMASK)) == existing_off) { 13325 13324 saveoff(js, head, firstprop | CONSTMASK); 13326 13325 } 13327 13326 } ··· 13355 13354 } 13356 13355 13357 13356 jsval_t props_obj = props; 13358 - jsoff_t next = loadoff(js, (jsoff_t) vdata(props_obj)) & ~(3U | CONSTMASK | ARRMASK); 13357 + jsoff_t next = loadoff(js, (jsoff_t) vdata(props_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13359 13358 13360 13359 while (next < js->brk && next != 0) { 13361 13360 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 13363 13362 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13364 13363 jsval_t descriptor = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 13365 13364 13366 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13365 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13367 13366 if (is_internal_prop(key, klen)) continue; 13368 13367 13369 13368 jsval_t prop_key = js_mkstr(js, key, klen); ··· 13399 13398 if (st != T_OBJ && st != T_ARR && st != T_FUNC) continue; 13400 13399 13401 13400 jsval_t src_obj = (st == T_OBJ) ? source : mkval(T_OBJ, vdata(source)); 13402 - jsoff_t next = loadoff(js, (jsoff_t) vdata(src_obj)) & ~(3U | CONSTMASK | ARRMASK); 13401 + jsoff_t next = loadoff(js, (jsoff_t) vdata(src_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13403 13402 13404 13403 while (next < js->brk && next != 0) { 13405 13404 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 13407 13406 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13408 13407 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 13409 13408 13410 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13409 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13411 13410 if (is_internal_prop(key, klen)) continue; 13412 13411 13413 13412 bool should_copy = true; ··· 13436 13435 if (t != T_OBJ && t != T_ARR && t != T_FUNC) return obj; 13437 13436 jsval_t as_obj = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 13438 13437 13439 - jsoff_t next = loadoff(js, (jsoff_t) vdata(as_obj)) & ~(3U | CONSTMASK | ARRMASK); 13438 + jsoff_t next = loadoff(js, (jsoff_t) vdata(as_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13440 13439 13441 13440 while (next < js->brk && next != 0) { 13442 13441 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); ··· 13444 13443 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13445 13444 13446 13445 jsoff_t cur_prop = next; 13447 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13446 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13448 13447 if (is_internal_prop(key, klen)) continue; 13449 13448 13450 13449 jsoff_t head = (jsoff_t) vdata(as_obj); 13451 13450 jsoff_t firstprop = loadoff(js, head); 13452 - if ((firstprop & ~(3U | CONSTMASK | ARRMASK)) == cur_prop) { 13451 + if ((firstprop & ~(3U | CONSTMASK | ARRMASK | SLOTMASK)) == cur_prop) { 13453 13452 saveoff(js, head, firstprop | CONSTMASK); 13454 13453 } else { 13455 13454 jsoff_t prev = head; 13456 - jsoff_t scan = firstprop & ~(3U | CONSTMASK | ARRMASK); 13455 + jsoff_t scan = firstprop & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13457 13456 while (scan < js->brk && scan != 0) { 13458 13457 if (scan == cur_prop) { 13459 13458 jsoff_t prev_val = loadoff(js, prev); ··· 13461 13460 break; 13462 13461 } 13463 13462 prev = scan; 13464 - scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK); 13463 + scan = loadoff(js, scan) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13465 13464 } 13466 13465 } 13467 13466 ··· 13500 13499 jsval_t as_obj = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 13501 13500 13502 13501 setprop(js, as_obj, js_mkstr(js, "__sealed__", 10), js_mktrue()); 13503 - jsoff_t next = loadoff(js, (jsoff_t) vdata(as_obj)) & ~(3U | CONSTMASK | ARRMASK); 13502 + jsoff_t next = loadoff(js, (jsoff_t) vdata(as_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13504 13503 13505 13504 while (next < js->brk && next != 0) { 13506 13505 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 13507 13506 jsoff_t klen = offtolen(loadoff(js, koff)); 13508 13507 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13509 13508 13510 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13509 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13511 13510 13512 13511 if (is_internal_prop(key, klen)) continue; 13513 13512 ··· 13650 13649 13651 13650 jsval_t arr = mkarr(js); 13652 13651 jsoff_t idx = 0; 13653 - jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK); 13652 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13654 13653 13655 13654 while (next < js->brk && next != 0) { 13656 13655 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 13657 13656 jsoff_t klen = offtolen(loadoff(js, koff)); 13658 13657 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 13659 13658 13660 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 13659 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 13661 13660 if (is_internal_prop(key, klen)) continue; 13662 13661 13663 13662 char idxstr[16]; ··· 20551 20550 descriptor_entry_t *desc = lookup_descriptor(obj_off, key, len); 20552 20551 if (desc && !desc->configurable) return false; 20553 20552 20554 - jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | CONSTMASK | GCMASK); 20553 + jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 20555 20554 if (first_prop == prop_off) { 20556 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 20555 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 20557 20556 jsoff_t current = loadoff(js, obj_off); 20558 - saveoff(js, obj_off, (deleted_next & ~3U) | (current & (GCMASK | CONSTMASK | 3U))); 20559 - saveoff(js, prop_off, loadoff(js, prop_off) | GCMASK); 20557 + saveoff(js, obj_off, (deleted_next & ~3U) | (current & (CONSTMASK | ARRMASK | SLOTMASK | 3U))); 20560 20558 invalidate_prop_cache(obj_off); 20561 20559 return true; 20562 20560 } 20563 20561 20564 20562 jsoff_t prev = first_prop; 20565 20563 while (prev != 0) { 20566 - jsoff_t next_prop = loadoff(js, prev) & ~(GCMASK | CONSTMASK); 20564 + jsoff_t next_prop = loadoff(js, prev) & ~(CONSTMASK | ARRMASK | SLOTMASK); 20567 20565 if (next_prop == prop_off) { 20568 - jsoff_t deleted_next = loadoff(js, prop_off) & ~(GCMASK | CONSTMASK); 20569 - jsoff_t prev_flags = loadoff(js, prev) & (GCMASK | CONSTMASK); 20566 + jsoff_t deleted_next = loadoff(js, prop_off) & ~(CONSTMASK | ARRMASK | SLOTMASK); 20567 + jsoff_t prev_flags = loadoff(js, prev) & (CONSTMASK | ARRMASK | SLOTMASK); 20570 20568 saveoff(js, prev, deleted_next | prev_flags); 20571 - saveoff(js, prop_off, loadoff(js, prop_off) | GCMASK); 20572 20569 invalidate_prop_cache(obj_off); 20573 20570 return true; 20574 20571 } ··· 20624 20621 20625 20622 void js_merge_obj(struct js *js, jsval_t dst, jsval_t src) { 20626 20623 if (vtype(dst) != T_OBJ || vtype(src) != T_OBJ) return; 20627 - jsoff_t next = loadoff(js, (jsoff_t) vdata(src)) & ~(3U | CONSTMASK | ARRMASK); 20624 + jsoff_t next = loadoff(js, (jsoff_t) vdata(src)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 20628 20625 while (next < js->brk && next != 0) { 20629 20626 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 20630 20627 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); ··· 20632 20629 20633 20630 char *key = (char *) &js->mem[koff + sizeof(koff)]; 20634 20631 setprop(js, dst, js_mkstr(js, key, klen), val); 20635 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 20632 + next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 20636 20633 } 20637 20634 } 20638 20635 ··· 20879 20876 20880 20877 if (vtype(obj) == T_OBJ || vtype(obj) == T_ARR || vtype(obj) == T_FUNC) { 20881 20878 jsval_t check_obj = (vtype(obj) == T_FUNC) ? mkval(T_OBJ, vdata(obj)) : obj; 20882 - jsoff_t next = loadoff(js, (jsoff_t) vdata(check_obj)) & ~(3U | CONSTMASK | ARRMASK); 20879 + jsoff_t next = loadoff(js, (jsoff_t) vdata(check_obj)) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK); 20883 20880 iter.current = (void *)(uintptr_t)next; 20884 20881 } 20885 20882 ··· 20905 20902 20906 20903 if (value) *value = val; 20907 20904 20908 - iter->current = (void *)(uintptr_t)(loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK)); 20905 + iter->current = (void *)(uintptr_t)(loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK | SLOTMASK)); 20909 20906 return true; 20910 20907 } 20911 20908 ··· 20927 20924 while (off < js->brk) { 20928 20925 memcpy(&v, &js->mem[off], sizeof(v)); 20929 20926 printf(" %5u: ", off); 20930 - jsoff_t cleaned = v & ~(GCMASK | CONSTMASK); 20927 + jsoff_t cleaned = v & ~(CONSTMASK | ARRMASK | SLOTMASK); 20931 20928 if ((cleaned & 3U) == T_OBJ) { 20932 20929 printf("OBJ %u %u%s\n", cleaned & ~3U, loadoff(js, (jsoff_t) (off + sizeof(off))), (v & CONSTMASK) ? " [CONST]" : ""); 20933 20930 } else if ((cleaned & 3U) == T_PROP) { 20934 20931 jsoff_t koff = loadoff(js, (jsoff_t) (off + sizeof(v))); 20935 20932 jsval_t val = loadval(js, (jsoff_t) (off + sizeof(v) + sizeof(v))); 20936 - printf("PROP next %u, koff %u vtype %d vdata %lu%s\n", cleaned & ~3U, koff, vtype(val), (unsigned long) vdata(val), (v & CONSTMASK) ? " [CONST]" : ""); 20933 + printf("PROP next %u, koff %u vtype %d vdata %lu%s%s\n", cleaned & ~3U, koff, vtype(val), (unsigned long) vdata(val), (v & CONSTMASK) ? " [CONST]" : "", (v & SLOTMASK) ? " [SLOT]" : ""); 20937 20934 } else if ((cleaned & 3) == T_STR) { 20938 20935 jsoff_t len = offtolen(cleaned); 20939 20936 printf("STR %u [%.*s]\n", len, (int) len, js->mem + off + sizeof(v)); ··· 20941 20938 printf("???\n"); 20942 20939 break; 20943 20940 } 20944 - off += esize(v & ~(GCMASK | CONSTMASK)); 20941 + off += esize(v & ~(CONSTMASK | ARRMASK | SLOTMASK)); 20945 20942 } 20946 20943 } 20947 20944 #endif