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 support for descriptor cache and invalidation

+321 -247
+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.2.1.16') 77 + version_conf.set('ANT_VERSION', '0.2.1.17') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+317 -245
src/ant.c
··· 255 255 } intern_prop_cache_entry_t; 256 256 static intern_prop_cache_entry_t intern_prop_cache[INTERN_PROP_CACHE_SIZE]; 257 257 258 + #define DESC_CACHE_SIZE 1024 259 + typedef struct { 260 + jsoff_t obj_off; 261 + uint32_t key_hash; 262 + jsoff_t desc_off; 263 + uint8_t valid; 264 + } desc_cache_entry_t; 265 + static desc_cache_entry_t desc_cache[DESC_CACHE_SIZE]; 266 + 267 + static inline void invalidate_desc_cache_for_obj(jsoff_t obj_off) { 268 + desc_cache_entry_t *cache = desc_cache; 269 + desc_cache_entry_t *end = cache + DESC_CACHE_SIZE; 270 + while (cache < end) { if (cache->obj_off == obj_off) cache->valid = 0; cache++; } 271 + } 272 + 258 273 typedef struct map_entry { 259 - char *key; 260 - jsval_t value; 261 - UT_hash_handle hh; 274 + char *key; 275 + jsval_t value; 276 + UT_hash_handle hh; 262 277 } map_entry_t; 263 278 264 279 typedef struct set_entry { 265 - jsval_t value; 266 - char *key; 267 - UT_hash_handle hh; 280 + jsval_t value; 281 + char *key; 282 + UT_hash_handle hh; 268 283 } set_entry_t; 269 284 270 285 typedef struct proxy_data { 271 - jsoff_t obj_offset; 272 - jsval_t target; 273 - jsval_t handler; 274 - bool revoked; 275 - UT_hash_handle hh; 286 + jsoff_t obj_offset; 287 + jsval_t target; 288 + jsval_t handler; 289 + bool revoked; 290 + UT_hash_handle hh; 276 291 } proxy_data_t; 277 292 278 293 #define MAX_FUNC_PARAMS 64 ··· 422 437 }; 423 438 424 439 enum { 425 - T_OBJ, T_PROP, T_STR, T_UNDEF, T_NULL, T_NUM, 426 - T_BOOL, T_FUNC, T_CODEREF, T_CFUNC, T_ERR, T_ARR, 427 - T_PROMISE, T_TYPEDARRAY, T_BIGINT, T_PROPREF, T_SYMBOL, T_GENERATOR 440 + T_OBJ, T_PROP, T_STR, T_UNDEF, T_NULL, T_NUM, T_BOOL, T_FUNC, 441 + T_CODEREF, T_CFUNC, T_ERR, T_ARR, T_PROMISE, T_TYPEDARRAY, 442 + T_BIGINT, T_PROPREF, T_SYMBOL, T_GENERATOR 428 443 }; 429 444 430 445 static const char *typestr_raw(uint8_t t) { ··· 979 994 for (i = 0; i < dstlen && i < srclen && src[i] != 0; i++) dst[i] = src[i]; 980 995 if (dstlen > 0) dst[i < dstlen ? i : dstlen - 1] = '\0'; 981 996 return i; 997 + } 998 + 999 + static inline size_t build_desc_key(char *buf, size_t bufsize, const char *key, size_t klen) { 1000 + size_t total = 7 + klen + 1; 1001 + if (total > bufsize) return 0; 1002 + memcpy(buf, "__desc_", 7); 1003 + memcpy(buf + 7, key, klen); 1004 + buf[7 + klen] = '\0'; 1005 + return 7 + klen; 1006 + } 1007 + 1008 + static inline size_t uint_to_str(char *buf, size_t bufsize, unsigned int val) { 1009 + if (bufsize == 0) return 0; 1010 + if (val == 0) { 1011 + buf[0] = '0'; 1012 + buf[1] = '\0'; 1013 + return 1; 1014 + } 1015 + char temp[12]; 1016 + size_t len = 0; 1017 + while (val > 0 && len < sizeof(temp)) { 1018 + temp[len++] = '0' + (val % 10); 1019 + val /= 10; 1020 + } 1021 + if (len >= bufsize) len = bufsize - 1; 1022 + for (size_t i = 0; i < len; i++) { 1023 + buf[i] = temp[len - 1 - i]; 1024 + } 1025 + buf[len] = '\0'; 1026 + return len; 982 1027 } 983 1028 984 1029 #define MAX_STRINGIFY_DEPTH 64 ··· 2672 2717 static jsval_t arr_get(struct js *js, jsval_t arr, jsoff_t idx) { 2673 2718 if (vtype(arr) != T_ARR) return js_mkundef(); 2674 2719 char idxstr[16]; 2675 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 2676 - jsoff_t idxlen = (jsoff_t) strlen(idxstr); 2720 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 2677 2721 jsoff_t prop = loadoff(js, (jsoff_t) vdata(arr)) & ~(3U | CONSTMASK | ARRMASK); 2678 2722 while (prop < js->brk && prop != 0) { 2679 2723 jsoff_t koff = loadoff(js, prop + (jsoff_t) sizeof(prop)); ··· 3002 3046 3003 3047 jsoff_t existing = lkp(js, obj, key, klen); 3004 3048 3005 - char desc_key[128]; 3006 - snprintf(desc_key, sizeof(desc_key), "__desc_%.*s", (int)klen, key); 3007 - jsoff_t desc_off = lkp(js, obj, desc_key, strlen(desc_key)); 3008 - 3009 - if (desc_off == 0) { 3010 - desc_off = lkp_proto(js, obj, desc_key, strlen(desc_key)); 3011 - } 3012 - 3013 - jsval_t desc_obj = js_mkundef(); 3014 - if (desc_off != 0) { 3015 - desc_obj = resolveprop(js, mkval(T_PROP, desc_off)); 3016 - if (vtype(desc_obj) == T_OBJ) { 3017 - jsoff_t set_off = lkp_interned(js, desc_obj, INTERN_SET, 3); 3018 - if (set_off != 0) { 3019 - jsval_t setter = resolveprop(js, mkval(T_PROP, set_off)); 3020 - if (vtype(setter) == T_FUNC || vtype(setter) == T_CFUNC) { 3021 - js_parse_state_t saved; 3022 - JS_SAVE_STATE(js, saved); 3023 - uint8_t saved_flags = js->flags; 3024 - jsoff_t saved_toff = js->toff; 3025 - jsoff_t saved_tlen = js->tlen; 3026 - 3027 - jsval_t saved_this = js->this_val; 3028 - js->this_val = obj; 3029 - push_this(obj); 3030 - jsval_t result = call_js_with_args(js, setter, &v, 1); 3031 - pop_this(); 3032 - js->this_val = saved_this; 3033 - 3034 - JS_RESTORE_STATE(js, saved); 3035 - js->flags = saved_flags; 3036 - js->toff = saved_toff; 3037 - js->tlen = saved_tlen; 3038 - 3039 - if (is_err(result)) return result; 3040 - return v; 3041 - } 3049 + if (js->has_descriptors) { 3050 + jsoff_t obj_off = (jsoff_t)vdata(obj); 3051 + uint32_t hash = (uint32_t)(hash_key(key, klen) ^ obj_off); 3052 + uint32_t slot = hash & (DESC_CACHE_SIZE - 1); 3053 + 3054 + jsoff_t desc_off; 3055 + if (desc_cache[slot].valid && 3056 + desc_cache[slot].obj_off == obj_off && 3057 + desc_cache[slot].key_hash == hash) { 3058 + desc_off = desc_cache[slot].desc_off; 3059 + } else { 3060 + char desc_key[128]; 3061 + size_t desc_key_len = build_desc_key(desc_key, sizeof(desc_key), key, klen); 3062 + desc_off = 0; 3063 + if (desc_key_len > 0) { 3064 + desc_off = lkp(js, obj, desc_key, desc_key_len); 3065 + if (desc_off == 0) desc_off = lkp_proto(js, obj, desc_key, desc_key_len); 3042 3066 } 3043 - 3044 - jsoff_t get_off = lkp_interned(js, desc_obj, INTERN_GET, 3); 3045 - if (get_off != 0 && set_off == 0) { 3046 - if (js->flags & F_STRICT) { 3047 - return js_mkerr_typed(js, JS_ERR_TYPE, "Cannot set property which has only a getter"); 3048 - } 3049 - return v; 3050 - } 3067 + desc_cache[slot].obj_off = obj_off; 3068 + desc_cache[slot].key_hash = hash; 3069 + desc_cache[slot].desc_off = desc_off; 3070 + desc_cache[slot].valid = 1; 3071 + } 3072 + 3073 + if (desc_off == 0) goto no_descriptor; 3074 + 3075 + jsval_t desc_obj = resolveprop(js, mkval(T_PROP, desc_off)); 3076 + if (vtype(desc_obj) != T_OBJ) goto no_descriptor; 3077 + 3078 + jsoff_t set_off = lkp_interned(js, desc_obj, INTERN_SET, 3); 3079 + if (set_off == 0) goto check_getter_only; 3080 + 3081 + jsval_t setter = resolveprop(js, mkval(T_PROP, set_off)); 3082 + uint8_t setter_type = vtype(setter); 3083 + if (setter_type != T_FUNC && setter_type != T_CFUNC) goto check_getter_only; 3084 + 3085 + js_parse_state_t saved; 3086 + JS_SAVE_STATE(js, saved); 3087 + uint8_t saved_flags = js->flags; 3088 + jsoff_t saved_toff = js->toff; 3089 + jsoff_t saved_tlen = js->tlen; 3090 + 3091 + jsval_t saved_this = js->this_val; 3092 + js->this_val = obj; 3093 + push_this(obj); 3094 + jsval_t result = call_js_with_args(js, setter, &v, 1); 3095 + pop_this(); 3096 + js->this_val = saved_this; 3097 + 3098 + JS_RESTORE_STATE(js, saved); 3099 + js->flags = saved_flags; 3100 + js->toff = saved_toff; 3101 + js->tlen = saved_tlen; 3102 + 3103 + if (is_err(result)) return result; 3104 + return v; 3105 + 3106 + check_getter_only:; 3107 + jsoff_t get_off = lkp_interned(js, desc_obj, INTERN_GET, 3); 3108 + if (get_off != 0 && set_off == 0) { 3109 + if (js->flags & F_STRICT) return js_mkerr_typed(js, JS_ERR_TYPE, "Cannot set property which has only a getter"); 3110 + return v; 3051 3111 } 3112 + 3113 + if (existing <= 0) goto no_descriptor; 3114 + 3115 + jsoff_t writable_off = lkp(js, desc_obj, "writable", 8); 3116 + if (writable_off == 0) goto no_descriptor; 3117 + 3118 + jsval_t writable_val = resolveprop(js, mkval(T_PROP, writable_off)); 3119 + if (js_truthy(js, writable_val)) goto no_descriptor; 3120 + 3121 + if (js->flags & F_STRICT) return js_mkerr(js, "assignment to read-only property"); 3122 + return mkval(T_PROP, existing); 3052 3123 } 3053 3124 3125 + no_descriptor: 3054 3126 if (existing <= 0) goto create_new; 3055 3127 3056 - if (desc_off == 0) { 3057 - if (is_const_prop(js, existing)) { 3058 - if (js->flags & F_STRICT) return js_mkerr(js, "assignment to constant"); 3059 - return mkval(T_PROP, existing); 3060 - } 3061 - goto do_update; 3062 - } 3063 - 3064 - if (vtype(desc_obj) != T_OBJ) goto do_update; 3065 - 3066 - jsoff_t writable_off = lkp(js, desc_obj, "writable", 8); 3067 - if (writable_off != 0) { 3068 - jsval_t writable_val = resolveprop(js, mkval(T_PROP, writable_off)); 3069 - if (!js_truthy(js, writable_val)) { 3070 - if (js->flags & F_STRICT) return js_mkerr(js, "assignment to read-only property"); 3071 - return mkval(T_PROP, existing); 3072 - } 3128 + if (is_const_prop(js, existing)) { 3129 + if (js->flags & F_STRICT) return js_mkerr(js, "assignment to constant"); 3130 + return mkval(T_PROP, existing); 3073 3131 } 3074 3132 3075 - do_update: 3076 3133 saveval(js, existing + sizeof(jsoff_t) * 2, v); 3077 - 3078 3134 if (vtype(obj) != T_ARR || klen == 0 || key[0] < '0' || key[0] > '9') goto done_update; 3079 3135 3080 3136 char *endptr; ··· 3098 3154 return mkval(T_PROP, existing); 3099 3155 3100 3156 create_new: 3101 - 3102 3157 jsoff_t frozen_off = lkp(js, obj, "__frozen__", 10); 3103 3158 if (frozen_off != 0) { 3104 3159 jsval_t frozen_val = resolveprop(js, mkval(T_PROP, frozen_off)); ··· 3565 3620 3566 3621 static int is_unicode_space(const unsigned char *p, jsoff_t remaining, bool *is_line_term) { 3567 3622 if (is_line_term) *is_line_term = false; 3623 + if (p[0] < 0x80) return 0; 3568 3624 if (remaining >= 2 && p[0] == 0xC2 && p[1] == 0xA0) return 2; 3569 3625 if (remaining >= 3 && p[0] == 0xE2 && p[1] == 0x80) { 3570 3626 if (p[2] >= 0x80 && p[2] <= 0x8A) return 3; ··· 4063 4119 while ((tok = next(js)) != TOK_EOF && !(tok == TOK_RBRACE && depth == 0)) { 4064 4120 if (tok == TOK_LBRACE) { depth++; js->consumed = 1; continue; } 4065 4121 if (tok == TOK_RBRACE) { depth--; js->consumed = 1; continue; } 4122 + if (depth > 0) { js->consumed = 1; continue; } 4066 4123 4067 - if (depth == 0 && tok == TOK_EXPORT) { 4124 + if (tok == TOK_EXPORT) { 4068 4125 js->consumed = 1; 4069 4126 uint8_t next_tok = next(js); 4070 4127 if (next_tok != TOK_FUNC && next_tok != TOK_ASYNC && next_tok != TOK_DEFAULT) ··· 4491 4548 jsoff_t header = loadoff(js, scan_off); 4492 4549 jsoff_t cleaned = header & ~(GCMASK | CONSTMASK | ARRMASK); 4493 4550 4494 - if ((cleaned & 3) != T_OBJ) { 4495 - scan_off += esize(cleaned); 4496 - continue; 4497 - } 4551 + if ((cleaned & 3) != T_OBJ) goto next_scan; 4498 4552 4499 - jsoff_t next = cleaned & ~3U; 4500 - while (next < js->brk && next != 0) { 4501 - if (next == propoff) { 4502 - jsval_t obj = mkval(T_OBJ, scan_off); 4503 - *out_owner = obj; 4504 - 4505 - char desc_key[128]; 4506 - snprintf(desc_key, sizeof(desc_key), "__desc_%.*s", (int)klen, key); 4507 - jsoff_t desc_off = lkp(js, obj, desc_key, strlen(desc_key)); 4508 - if (desc_off != 0) { 4509 - jsval_t desc_obj = loadval(js, desc_off + sizeof(jsoff_t) * 2); 4510 - if (vtype(desc_obj) == T_OBJ) { 4511 - jsoff_t set_off = lkp_interned(js, desc_obj, INTERN_SET, 3); 4512 - if (set_off != 0) { 4513 - jsval_t setter = loadval(js, set_off + sizeof(jsoff_t) * 2); 4514 - if (vtype(setter) == T_FUNC || vtype(setter) == T_CFUNC) return 2; 4515 - } 4516 - jsoff_t writable_off = lkp(js, desc_obj, "writable", 8); 4517 - if (writable_off != 0) { 4518 - jsval_t writable_val = resolveprop(js, mkval(T_PROP, writable_off)); 4519 - if (!js_truthy(js, writable_val)) return 0; 4520 - } 4521 - } 4522 - } 4523 - return 1; 4553 + for (jsoff_t next = cleaned & ~3U; next < js->brk && next != 0; next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK)) { 4554 + if (next != propoff) continue; 4555 + 4556 + jsval_t obj = mkval(T_OBJ, scan_off); 4557 + *out_owner = obj; 4558 + 4559 + char desc_key[128]; 4560 + size_t desc_key_len = build_desc_key(desc_key, sizeof(desc_key), key, klen); 4561 + if (desc_key_len == 0) return 1; 4562 + 4563 + jsoff_t desc_off = lkp(js, obj, desc_key, desc_key_len); 4564 + if (desc_off == 0) return 1; 4565 + 4566 + jsval_t desc_obj = loadval(js, desc_off + sizeof(jsoff_t) * 2); 4567 + if (vtype(desc_obj) != T_OBJ) return 1; 4568 + 4569 + jsoff_t set_off = lkp_interned(js, desc_obj, INTERN_SET, 3); 4570 + if (set_off != 0) { 4571 + jsval_t setter = loadval(js, set_off + sizeof(jsoff_t) * 2); 4572 + uint8_t st = vtype(setter); 4573 + if (st == T_FUNC || st == T_CFUNC) return 2; 4524 4574 } 4525 - next = loadoff(js, next) & ~(3U | CONSTMASK | ARRMASK); 4575 + 4576 + jsoff_t writable_off = lkp(js, desc_obj, "writable", 8); 4577 + if (writable_off == 0) return 1; 4578 + 4579 + jsval_t writable_val = resolveprop(js, mkval(T_PROP, writable_off)); 4580 + return js_truthy(js, writable_val) ? 1 : 0; 4526 4581 } 4527 4582 4583 + next_scan: 4528 4584 scan_off += esize(cleaned); 4529 4585 } 4530 4586 return -1; ··· 5333 5389 setprop(js, arguments_obj, js_mkstr(js, INTERN_IDX[i], 1), args[i]); 5334 5390 } else { 5335 5391 char idxstr[16]; 5336 - snprintf(idxstr, sizeof(idxstr), "%d", i); 5337 - setprop(js, arguments_obj, js_mkstr(js, idxstr, strlen(idxstr)), args[i]); 5392 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 5393 + setprop(js, arguments_obj, js_mkstr(js, idxstr, idxlen), args[i]); 5338 5394 } 5339 5395 } 5340 5396 setprop_interned(js, arguments_obj, INTERN_LENGTH, 6, tov((double) nargs)); ··· 5449 5505 if (!is_err(rest_array)) { 5450 5506 jsoff_t idx = 0; 5451 5507 while (argi < argc) { 5452 - char idxstr[16]; 5453 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 5454 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 5508 + jsval_t key; 5509 + if (idx < 10 && INTERN_IDX[idx]) { 5510 + key = js_mkstr(js, INTERN_IDX[idx], 1); 5511 + } else { 5512 + char idxstr[16]; 5513 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 5514 + key = js_mkstr(js, idxstr, idxlen); 5515 + } 5455 5516 setprop(js, rest_array, key, args[argi++]); 5456 5517 idx++; 5457 5518 } ··· 5730 5791 jsoff_t idx = 0; 5731 5792 while (arg_idx < nargs) { 5732 5793 char idxstr[16]; 5733 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 5734 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 5794 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 5795 + jsval_t key = js_mkstr(js, idxstr, idxlen); 5735 5796 setprop(js, rest_array, key, args[arg_idx]); 5736 5797 idx++; 5737 5798 arg_idx++; ··· 6843 6904 jsval_t resolved = resolveprop(js, val); 6844 6905 if (!is_spread) { 6845 6906 char idxstr[16]; 6846 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 6847 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 6907 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 6908 + jsval_t key = js_mkstr(js, idxstr, idxlen); 6848 6909 jsval_t res = setprop(js, arr, key, resolved); 6849 6910 if (is_err(res)) return res; 6850 6911 idx++; ··· 6858 6919 jsoff_t slen, soff = vstr(js, resolved, &slen); 6859 6920 for (jsoff_t i = 0; i < slen; i++) { 6860 6921 char idxstr[16]; 6861 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 6862 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 6922 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 6923 + jsval_t key = js_mkstr(js, idxstr, idxlen); 6863 6924 jsval_t ch = js_mkstr(js, (char *)&js->mem[soff + i], 1); 6864 6925 setprop(js, arr, key, ch); 6865 6926 idx++; ··· 7173 7234 7174 7235 if (is_getter || is_setter) { 7175 7236 js->has_descriptors = true; 7237 + invalidate_desc_cache_for_obj((jsoff_t)vdata(obj)); 7176 7238 jsoff_t key_len; 7177 7239 const char *key_str = NULL; 7178 7240 if (vtype(key) == T_STR) { ··· 11862 11924 } else { 11863 11925 for (int i = 0; i < nargs; i++) { 11864 11926 char idxstr[16]; 11865 - snprintf(idxstr, sizeof(idxstr), "%d", i); 11866 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 11927 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 11928 + jsval_t key = js_mkstr(js, idxstr, idxlen); 11867 11929 setprop(js, arr, key, args[i]); 11868 11930 } 11869 11931 jsval_t len_key = js_mkstr(js, "length", 6); ··· 11876 11938 11877 11939 static jsval_t builtin_Error(struct js *js, jsval_t *args, int nargs) { 11878 11940 jsval_t err_obj = js->this_val; 11879 - bool use_this = (vtype(err_obj) == T_OBJ); 11941 + jsval_t error_proto = get_ctor_proto(js, "Error", 5); 11942 + bool is_constructor_call = (vtype(err_obj) == T_OBJ); 11880 11943 11881 - if (!use_this) { 11944 + if (!is_constructor_call) { 11882 11945 err_obj = mkobj(js, 0); 11946 + set_proto(js, err_obj, error_proto); 11883 11947 } 11884 11948 11885 11949 jsval_t message = js_mkstr(js, "", 0); ··· 11905 11969 #define DEFINE_ERROR_BUILTIN(name, name_str, name_len) \ 11906 11970 static jsval_t builtin_##name(struct js *js, jsval_t *args, int nargs) { \ 11907 11971 jsval_t err_obj = js->this_val; \ 11908 - bool use_this = (vtype(err_obj) == T_OBJ); \ 11909 - if (!use_this) err_obj = mkobj(js, 0); \ 11972 + jsval_t error_proto = get_ctor_proto(js, name_str, name_len); \ 11973 + bool is_constructor_call = (vtype(err_obj) == T_OBJ); \ 11974 + if (!is_constructor_call) { \ 11975 + err_obj = mkobj(js, 0); \ 11976 + set_proto(js, err_obj, error_proto); \ 11977 + } \ 11910 11978 jsval_t message = js_mkstr(js, "", 0); \ 11911 11979 if (nargs > 0) { \ 11912 11980 if (vtype(args[0]) == T_STR) { \ ··· 13222 13290 13223 13291 if (should_include) { 13224 13292 char idxstr[16]; 13225 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 13226 - jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 13293 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 13294 + jsval_t idx_key = js_mkstr(js, idxstr, idxlen); 13227 13295 jsval_t key_val = js_mkstr(js, key, klen); 13228 13296 setprop(js, arr, idx_key, key_val); 13229 13297 idx++; ··· 13268 13336 size_t prop_len = klen - 7; 13269 13337 13270 13338 char idxstr[16]; 13271 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 13272 - jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 13339 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 13340 + jsval_t idx_key = js_mkstr(js, idxstr, idxlen); 13273 13341 jsval_t key_val = js_mkstr(js, prop_name, prop_len); 13274 13342 setprop(js, arr, idx_key, key_val); 13275 13343 idx++; ··· 13336 13404 13337 13405 if (should_include) { 13338 13406 char idxstr[16]; 13339 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 13340 - jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 13407 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 13408 + jsval_t idx_key = js_mkstr(js, idxstr, idxlen); 13341 13409 setprop(js, arr, idx_key, val); 13342 13410 idx++; 13343 13411 } ··· 13407 13475 setprop(js, pair, js_mkstr(js, "length", 6), tov(2.0)); 13408 13476 13409 13477 char idxstr[16]; 13410 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 13411 - jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 13478 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 13479 + jsval_t idx_key = js_mkstr(js, idxstr, idxlen); 13412 13480 setprop(js, arr, idx_key, mkval(T_ARR, vdata(pair))); 13413 13481 idx++; 13414 13482 } ··· 13546 13614 if (t != T_OBJ && t != T_ARR && t != T_FUNC) { 13547 13615 return js_mkerr(js, "Object.defineProperty called on non-object"); 13548 13616 } 13617 + 13618 + jsval_t as_obj_tmp = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 13619 + invalidate_desc_cache_for_obj((jsoff_t)vdata(as_obj_tmp)); 13549 13620 13550 13621 if (vtype(prop) != T_STR) { 13551 13622 return js_mkerr(js, "Property key must be a string"); ··· 13783 13854 jsval_t as_obj = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 13784 13855 13785 13856 js->has_descriptors = true; 13857 + invalidate_desc_cache_for_obj((jsoff_t)vdata(as_obj)); 13786 13858 jsoff_t next = loadoff(js, (jsoff_t) vdata(as_obj)) & ~(3U | CONSTMASK | ARRMASK); 13787 13859 13788 13860 while (next < js->brk && next != 0) { ··· 14076 14148 if (is_internal_prop(key, klen)) continue; 14077 14149 14078 14150 char idxstr[16]; 14079 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 14080 - jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 14151 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 14152 + jsval_t idx_key = js_mkstr(js, idxstr, idxlen); 14081 14153 jsval_t key_val = js_mkstr(js, key, klen); 14082 14154 setprop(js, arr, idx_key, key_val); 14083 14155 idx++; ··· 14304 14376 14305 14377 for (int i = 0; i < nargs; i++) { 14306 14378 char idxstr[16]; 14307 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) len); 14308 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 14379 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)len); 14380 + jsval_t key = js_mkstr(js, idxstr, idxlen); 14309 14381 setprop(js, arr, key, args[i]); 14310 14382 len++; 14311 14383 } ··· 14329 14401 } 14330 14402 14331 14403 char idxstr[16]; 14332 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) len); 14333 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 14404 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)len); 14405 + jsval_t key = js_mkstr(js, idxstr, idxlen); 14334 14406 setprop(js, arr, key, val); 14335 14407 14336 14408 jsval_t len_key = js_mkstr(js, "length", 6); ··· 14357 14429 if (len == 0) return js_mkundef(); 14358 14430 len--; 14359 14431 char idxstr[16]; 14360 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) len); 14432 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)len); 14361 14433 14362 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14434 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14363 14435 jsval_t result = js_mkundef(); 14364 14436 if (elem_off != 0) { 14365 14437 result = resolveprop(js, mkval(T_PROP, elem_off)); ··· 14412 14484 14413 14485 for (jsoff_t i = start; i < end; i++) { 14414 14486 char idxstr[16]; 14415 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14416 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14487 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14488 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14417 14489 if (elem_off != 0) { 14418 14490 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 14419 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) result_idx); 14420 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 14491 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)result_idx); 14492 + jsval_t key = js_mkstr(js, idxstr, idxlen); 14421 14493 setprop(js, result, key, elem); 14422 14494 } 14423 14495 result_idx++; ··· 14462 14534 14463 14535 for (jsoff_t i = 0; i < len; i++) { 14464 14536 char idxstr[16]; 14465 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14466 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14537 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14538 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14467 14539 14468 14540 if (i > 0 && result_len + sep_len < sizeof(result)) { 14469 14541 memcpy(result + result_len, sep, sep_len); ··· 14517 14589 14518 14590 for (jsoff_t i = 0; i < len; i++) { 14519 14591 char idxstr[16]; 14520 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14521 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14592 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14593 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14522 14594 if (elem_off != 0) { 14523 14595 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 14524 14596 if (vtype(elem) == vtype(search)) { ··· 14562 14634 14563 14635 for (jsoff_t i = 0; i < len; i++) { 14564 14636 char idxstr[16]; 14565 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14566 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14637 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14638 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14567 14639 if (elem_off == 0) continue; 14568 14640 14569 14641 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); ··· 14639 14711 14640 14712 for (jsoff_t i = 0; i < len; i++) { 14641 14713 char idxstr[16]; 14642 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14643 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14714 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14715 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14644 14716 14645 14717 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 14646 14718 jsval_t call_args[3] = { elem, tov((double)i), arr }; 14647 14719 jsval_t mapped = call_js_with_args(js, callback, call_args, 3); 14648 14720 if (is_err(mapped)) return mapped; 14649 14721 14650 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 14722 + jsval_t key = js_mkstr(js, idxstr, idxlen); 14651 14723 setprop(js, result, key, mapped); 14652 14724 } 14653 14725 ··· 14680 14752 14681 14753 for (jsoff_t i = 0; i < len; i++) { 14682 14754 char idxstr[16]; 14683 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14684 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14755 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14756 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14685 14757 if (elem_off == 0) continue; 14686 14758 14687 14759 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); ··· 14731 14803 bool found = false; 14732 14804 for (jsoff_t i = 0; i < len; i++) { 14733 14805 char idxstr[16]; 14734 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14735 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14806 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14807 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14736 14808 if (elem_off != 0) { 14737 14809 accumulator = resolveprop(js, mkval(T_PROP, elem_off)); 14738 14810 start_idx = i + 1; ··· 14745 14817 14746 14818 for (jsoff_t i = start_idx; i < len; i++) { 14747 14819 char idxstr[16]; 14748 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14749 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14820 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14821 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14750 14822 if (elem_off == 0) continue; 14751 14823 14752 14824 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); ··· 14768 14840 14769 14841 for (jsoff_t i = 0; i < len; i++) { 14770 14842 char idxstr[16]; 14771 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14772 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14843 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14844 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14773 14845 14774 14846 if (elem_off != 0) { 14775 14847 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); ··· 14828 14900 14829 14901 for (jsoff_t i = 0; i < len; i++) { 14830 14902 char idxstr[16]; 14831 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14832 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14903 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14904 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14833 14905 if (elem_off != 0) { 14834 14906 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 14835 14907 char res_idx[16]; ··· 14852 14924 14853 14925 for (jsoff_t i = 0; i < arg_len; i++) { 14854 14926 char idxstr[16]; 14855 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14856 - jsoff_t elem_off = lkp(js, arg, idxstr, strlen(idxstr)); 14927 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 14928 + jsoff_t elem_off = lkp(js, arg, idxstr, idxlen); 14857 14929 if (elem_off != 0) { 14858 14930 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 14859 14931 char res_idx[16]; 14860 - snprintf(res_idx, sizeof(res_idx), "%u", (unsigned) result_idx); 14861 - jsval_t key = js_mkstr(js, res_idx, strlen(res_idx)); 14932 + size_t res_idx_len = uint_to_str(res_idx, sizeof(res_idx), (unsigned)result_idx); 14933 + jsval_t key = js_mkstr(js, res_idx, res_idx_len); 14862 14934 setprop(js, result, key, elem); 14863 14935 } 14864 14936 result_idx++; ··· 14897 14969 if (idx < 0 || (jsoff_t)idx >= len) return js_mkundef(); 14898 14970 14899 14971 char idxstr[16]; 14900 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 14901 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 14972 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 14973 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14902 14974 return elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 14903 14975 } 14904 14976 ··· 14935 15007 14936 15008 for (jsoff_t i = start; i < end; i++) { 14937 15009 char idxstr[16]; 14938 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14939 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15010 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15011 + jsval_t key = js_mkstr(js, idxstr, idxlen); 14940 15012 setprop(js, arr, key, value); 14941 15013 } 14942 15014 ··· 14962 15034 14963 15035 for (jsoff_t i = 0; i < len; i++) { 14964 15036 char idxstr[16]; 14965 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14966 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15037 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15038 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14967 15039 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 14968 15040 jsval_t call_args[3] = { elem, tov((double)i), arr }; 14969 15041 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 14992 15064 14993 15065 for (jsoff_t i = 0; i < len; i++) { 14994 15066 char idxstr[16]; 14995 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 14996 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15067 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15068 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 14997 15069 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 14998 15070 jsval_t call_args[3] = { elem, tov((double)i), arr }; 14999 15071 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15022 15094 15023 15095 for (jsoff_t i = len; i > 0; i--) { 15024 15096 char idxstr[16]; 15025 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(i - 1)); 15026 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15097 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(i - 1)); 15098 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15027 15099 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15028 15100 jsval_t call_args[3] = { elem, tov((double)(i - 1)), arr }; 15029 15101 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15052 15124 15053 15125 for (jsoff_t i = len; i > 0; i--) { 15054 15126 char idxstr[16]; 15055 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(i - 1)); 15056 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15127 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(i - 1)); 15128 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15057 15129 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15058 15130 jsval_t call_args[3] = { elem, tov((double)(i - 1)), arr }; 15059 15131 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15086 15158 15087 15159 for (jsoff_t i = 0; i < len; i++) { 15088 15160 char idxstr[16]; 15089 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15090 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15161 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15162 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15091 15163 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15092 15164 jsval_t call_args[3] = { elem, tov((double)i), arr }; 15093 15165 jsval_t mapped = call_js_with_args(js, callback, call_args, 3); ··· 15146 15218 15147 15219 for (jsoff_t i = 0; i < len; i++) { 15148 15220 char idxstr[16]; 15149 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15150 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15221 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15222 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15151 15223 if (elem_off == 0) continue; 15152 15224 15153 15225 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); ··· 15195 15267 15196 15268 for (jsoff_t i = start; i < len; i++) { 15197 15269 char idxstr[16]; 15198 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15199 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15270 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15271 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15200 15272 if (elem_off != 0) { 15201 15273 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 15202 15274 if (vtype(elem) == vtype(search)) { ··· 15238 15310 15239 15311 for (int i = start; i >= 0; i--) { 15240 15312 char idxstr[16]; 15241 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15242 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15313 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15314 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15243 15315 if (elem_off != 0) { 15244 15316 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 15245 15317 if (vtype(elem) == vtype(search)) { ··· 15282 15354 } else { 15283 15355 if (len == 0) return js_mkerr(js, "reduceRight of empty array with no initial value"); 15284 15356 char idxstr[16]; 15285 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(len - 1)); 15286 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15357 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(len - 1)); 15358 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15287 15359 accumulator = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15288 15360 start_idx = (int)len - 2; 15289 15361 } 15290 15362 15291 15363 for (int i = start_idx; i >= 0; i--) { 15292 15364 char idxstr[16]; 15293 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15294 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15365 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15366 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15295 15367 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15296 15368 jsval_t call_args[4] = { accumulator, elem, tov((double)i), arr }; 15297 15369 accumulator = call_js_with_args(js, callback, call_args, 4); ··· 15361 15433 15362 15434 for (int i = 0; i < nargs; i++) { 15363 15435 char idxstr[16]; 15364 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15365 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15436 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15437 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15366 15438 setprop(js, arr, key, args[i]); 15367 15439 } 15368 15440 ··· 15391 15463 15392 15464 for (jsoff_t i = 0; i < len; i++) { 15393 15465 char idxstr[16]; 15394 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15395 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15466 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15467 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15396 15468 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15397 15469 jsval_t call_args[3] = { elem, tov((double)i), arr }; 15398 15470 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15517 15589 15518 15590 for (int i = 0; i < insertCount; i++) { 15519 15591 char idxstr[16]; 15520 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(start + i)); 15521 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15592 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(start + i)); 15593 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15522 15594 setprop(js, arr, key, args[2 + i]); 15523 15595 } 15524 15596 ··· 15564 15636 jsval_t *temp = (jsval_t *)malloc(count * sizeof(jsval_t)); 15565 15637 for (int i = 0; i < count; i++) { 15566 15638 char idxstr[16]; 15567 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(start + i)); 15568 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15639 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(start + i)); 15640 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15569 15641 temp[i] = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15570 15642 } 15571 15643 15572 15644 for (int i = 0; i < count; i++) { 15573 15645 char idxstr[16]; 15574 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)(target + i)); 15575 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15646 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)(target + i)); 15647 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15576 15648 setprop(js, arr, key, temp[i]); 15577 15649 } 15578 15650 ··· 15633 15705 15634 15706 for (jsoff_t i = 0; i < len; i++) { 15635 15707 char idxstr[16]; 15636 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15637 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15708 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15709 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15638 15710 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15639 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15711 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15640 15712 setprop(js, result, key, elem); 15641 15713 } 15642 15714 jsval_t len_key = js_mkstr(js, "length", 6); ··· 15757 15829 15758 15830 for (jsoff_t i = 0; i < len; i++) { 15759 15831 char idxstr[16]; 15760 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15832 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15761 15833 jsval_t elem; 15762 15834 if ((jsoff_t)idx == i) { 15763 15835 elem = args[1]; 15764 15836 } else { 15765 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15837 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15766 15838 elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15767 15839 } 15768 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15840 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15769 15841 setprop(js, result, key, elem); 15770 15842 } 15771 15843 ··· 15794 15866 15795 15867 for (jsoff_t i = 0; i < len; i++) { 15796 15868 char idxstr[16]; 15797 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15798 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15869 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15870 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15799 15871 setprop(js, result, key, tov((double) i)); 15800 15872 } 15801 15873 ··· 15824 15896 15825 15897 for (jsoff_t i = 0; i < len; i++) { 15826 15898 char idxstr[16]; 15827 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15828 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15899 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15900 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15829 15901 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15830 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15902 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15831 15903 setprop(js, result, key, elem); 15832 15904 } 15833 15905 ··· 15859 15931 if (is_err(entry)) return entry; 15860 15932 15861 15933 char idxstr[16]; 15862 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15863 - jsoff_t elem_off = lkp(js, arr, idxstr, strlen(idxstr)); 15934 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15935 + jsoff_t elem_off = lkp(js, arr, idxstr, idxlen); 15864 15936 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15865 15937 15866 15938 setprop(js, entry, js_mkstr(js, "0", 1), tov((double) i)); 15867 15939 setprop(js, entry, js_mkstr(js, "1", 1), elem); 15868 15940 setprop(js, entry, js_mkstr(js, "length", 6), tov(2)); 15869 15941 15870 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 15942 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15871 15943 setprop(js, result, key, mkval(T_ARR, vdata(entry))); 15872 15944 } 15873 15945 ··· 15968 16040 const char *str_ptr = (const char *)&js->mem[str_off]; 15969 16041 for (jsoff_t i = 0; i < str_len; i++) { 15970 16042 char idxstr[16]; 15971 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 16043 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 15972 16044 jsval_t elem = js_mkstr(js, str_ptr + i, 1); 15973 16045 if (vtype(mapFn) == T_FUNC) { 15974 16046 jsval_t call_args[2] = { elem, tov((double)i) }; 15975 16047 elem = call_js_with_args(js, mapFn, call_args, 2); 15976 16048 if (is_err(elem)) return elem; 15977 16049 } 15978 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16050 + jsval_t key = js_mkstr(js, idxstr, idxlen); 15979 16051 setprop(js, result, key, elem); 15980 16052 } 15981 16053 jsval_t len_key = js_mkstr(js, "length", 6); ··· 15989 16061 } 15990 16062 for (jsoff_t i = 0; i < len; i++) { 15991 16063 char idxstr[16]; 15992 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 15993 - jsoff_t elem_off = lkp(js, src, idxstr, strlen(idxstr)); 16064 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 16065 + jsoff_t elem_off = lkp(js, src, idxstr, idxlen); 15994 16066 jsval_t elem = elem_off ? resolveprop(js, mkval(T_PROP, elem_off)) : js_mkundef(); 15995 16067 if (vtype(mapFn) == T_FUNC) { 15996 16068 jsval_t call_args[2] = { elem, tov((double)i) }; 15997 16069 elem = call_js_with_args(js, mapFn, call_args, 2); 15998 16070 if (is_err(elem)) return elem; 15999 16071 } 16000 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16072 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16001 16073 setprop(js, result, key, elem); 16002 16074 } 16003 16075 jsval_t len_key = js_mkstr(js, "length", 6); ··· 16013 16085 16014 16086 for (int i = 0; i < nargs; i++) { 16015 16087 char idxstr[16]; 16016 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) i); 16017 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16088 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)i); 16089 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16018 16090 setprop(js, arr, key, args[i]); 16019 16091 } 16020 16092 jsval_t len_key = js_mkstr(js, "length", 6); ··· 16145 16217 jsoff_t idx = 0; 16146 16218 for (jsoff_t i = 0; i < str_len && idx < limit; i++) { 16147 16219 char idxstr[16]; 16148 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 16149 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16220 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16221 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16150 16222 jsval_t part = js_mkstr(js, str_ptr + i, 1); 16151 16223 setprop(js, arr, key, part); 16152 16224 idx++; ··· 16217 16289 had_any_split = true; 16218 16290 16219 16291 char idxstr[16]; 16220 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 16221 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16292 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16293 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16222 16294 jsval_t part = js_mkstr(js, str_ptr + segment_start, match_start - segment_start); 16223 16295 setprop(js, arr, key, part); 16224 16296 idx++; ··· 16226 16298 for (uint32_t i = 1; i <= capture_count && idx < limit; i++) { 16227 16299 PCRE2_SIZE cap_start = ovector[2*i]; 16228 16300 PCRE2_SIZE cap_end = ovector[2*i+1]; 16229 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 16230 - key = js_mkstr(js, idxstr, strlen(idxstr)); 16301 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16302 + key = js_mkstr(js, idxstr, idxlen); 16231 16303 if (cap_start == PCRE2_UNSET) { 16232 16304 setprop(js, arr, key, js_mkundef()); 16233 16305 } else { ··· 16256 16328 16257 16329 if (idx < limit) { 16258 16330 char idxstr[16]; 16259 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned)idx); 16260 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16331 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16332 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16261 16333 jsval_t part = js_mkstr(js, str_ptr + segment_start, str_len - segment_start); 16262 16334 setprop(js, arr, key, part); 16263 16335 idx++; ··· 16279 16351 if (sep_len == 0) { 16280 16352 for (jsoff_t i = 0; i < str_len && idx < limit; i++) { 16281 16353 char idxstr[16]; 16282 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 16283 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16354 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16355 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16284 16356 jsval_t part = js_mkstr(js, str_ptr + i, 1); 16285 16357 setprop(js, arr, key, part); 16286 16358 idx++; ··· 16291 16363 for (jsoff_t i = 0; i + sep_len <= str_len && idx < limit; i++) { 16292 16364 if (memcmp(str_ptr + i, sep_ptr, sep_len) != 0) continue; 16293 16365 char idxstr[16]; 16294 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 16295 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16366 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16367 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16296 16368 jsval_t part = js_mkstr(js, str_ptr + start, i - start); 16297 16369 setprop(js, arr, key, part); 16298 16370 idx++; ··· 16301 16373 } 16302 16374 if (idx < limit && start <= str_len) { 16303 16375 char idxstr[16]; 16304 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 16305 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 16376 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 16377 + jsval_t key = js_mkstr(js, idxstr, idxlen); 16306 16378 jsval_t part = js_mkstr(js, str_ptr + start, str_len - start); 16307 16379 setprop(js, arr, key, part); 16308 16380 idx++; ··· 19655 19727 js_set(js, result, "value", js_mkundef()); 19656 19728 } else { 19657 19729 char idxstr[16]; 19658 - snprintf(idxstr, sizeof(idxstr), "%d", idx); 19730 + uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 19659 19731 jsval_t k = js_get(js, keys, idxstr); 19660 19732 jsval_t v = js_get(js, vals, idxstr); 19661 19733 jsval_t entry = js_mkarr(js); ··· 19711 19783 js_set(js, result, "value", js_mkundef()); 19712 19784 } else { 19713 19785 char idxstr[16]; 19714 - snprintf(idxstr, sizeof(idxstr), "%d", idx); 19786 + uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 19715 19787 jsval_t v = js_get(js, vals, idxstr); 19716 19788 js_set(js, result, "value", v); 19717 19789 js_set(js, result, "done", js_mkfalse()); ··· 21181 21253 jsoff_t idx = 0; 21182 21254 while (arg_idx < nargs) { 21183 21255 char idxstr[16]; 21184 - snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 21185 - jsval_t key = js_mkstr(js, idxstr, strlen(idxstr)); 21256 + size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx); 21257 + jsval_t key = js_mkstr(js, idxstr, idxlen); 21186 21258 setprop(js, rest_array, key, args[arg_idx]); 21187 21259 idx++; 21188 21260 arg_idx++;
+3 -1
src/core/index.js
··· 23 23 T_PROMISE: 'promise', 24 24 T_TYPEDARRAY: 'typedarray', 25 25 T_BIGINT: 'bigint', 26 - T_PROPREF: 'propref' 26 + T_PROPREF: 'propref', 27 + T_SYMBOL: 'symbol', 28 + T_GENERATOR: 'generator' 27 29 }; 28 30 29 31 const names = Object.values(types);