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.

refactor: extract helpers and deduplicate array method implementations

+82 -281
+82 -281
src/ant.c
··· 15496 15496 return js_call_toString(js, js->this_val); 15497 15497 } 15498 15498 15499 + static inline bool parse_array_index(const char *key, size_t key_len, jsoff_t len, unsigned *out_idx) { 15500 + if (key_len == 0 || key[0] > '9' || key[0] < '0') return false; 15501 + unsigned parsed_idx = 0; 15502 + for (size_t i = 0; i < key_len; i++) { 15503 + if (key[i] < '0' || key[i] > '9') return false; 15504 + parsed_idx = parsed_idx * 10 + (key[i] - '0'); 15505 + } 15506 + if (parsed_idx >= len) return false; 15507 + *out_idx = parsed_idx; 15508 + return true; 15509 + } 15510 + 15511 + static jsval_t array_shallow_copy(struct js *js, jsval_t arr, jsoff_t len) { 15512 + jsval_t result = mkarr(js); 15513 + if (is_err(result)) return result; 15514 + 15515 + ant_iter_t iter = js_prop_iter_begin(js, arr); 15516 + const char *key; 15517 + size_t key_len; 15518 + jsval_t val; 15519 + 15520 + while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 15521 + if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 15522 + js_mkprop_fast(js, result, key, key_len, val); 15523 + } 15524 + 15525 + js_prop_iter_end(&iter); 15526 + js_mkprop_fast(js, result, "length", 6, tov((double)len)); 15527 + return result; 15528 + } 15529 + 15499 15530 static jsval_t builtin_array_push(struct js *js, jsval_t *args, int nargs) { 15500 15531 jsval_t arr = js->this_val; 15501 15532 arr = resolveprop(js, arr); ··· 15810 15841 jsval_t val; 15811 15842 15812 15843 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 15813 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 15814 - 15815 - unsigned parsed_idx = 0; 15816 - bool valid = true; 15817 - for (size_t i = 0; i < key_len && valid; i++) { 15818 - if (key[i] < '0' || key[i] > '9') valid = false; 15819 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 15820 - } 15821 - if (!valid || parsed_idx >= len) continue; 15844 + unsigned parsed_idx; 15845 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 15822 15846 15823 15847 jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 15824 15848 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15862 15886 jsval_t val; 15863 15887 15864 15888 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 15865 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 15866 - 15867 - unsigned parsed_idx = 0; 15868 - bool valid = true; 15869 - for (size_t i = 0; i < key_len && valid; i++) { 15870 - if (key[i] < '0' || key[i] > '9') valid = false; 15871 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 15872 - } 15873 - if (!valid || parsed_idx >= len) continue; 15889 + unsigned parsed_idx; 15890 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 15874 15891 15875 15892 jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 15876 15893 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 15911 15928 jsval_t val; 15912 15929 15913 15930 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 15914 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 15915 - 15916 - unsigned parsed_idx = 0; 15917 - bool valid = true; 15918 - for (size_t i = 0; i < key_len && valid; i++) { 15919 - if (key[i] < '0' || key[i] > '9') valid = false; 15920 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 15921 - } 15922 - if (!valid || parsed_idx >= len || count >= len) continue; 15931 + unsigned parsed_idx; 15932 + if (!parse_array_index(key, key_len, len, &parsed_idx) || count >= len) continue; 15923 15933 15924 15934 vals[count] = val; 15925 15935 offs[count] = iter.off; ··· 15974 15984 jsval_t val; 15975 15985 15976 15986 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 15977 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 15978 - 15979 - unsigned parsed_idx = 0; 15980 - bool valid = true; 15981 - for (size_t i = 0; i < key_len && valid; i++) { 15982 - if (key[i] < '0' || key[i] > '9') valid = false; 15983 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 15984 - } 15985 - if (!valid || parsed_idx >= len) continue; 15987 + unsigned parsed_idx; 15988 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 15986 15989 15987 15990 jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 15988 15991 jsval_t mapped = call_js_with_args(js, callback, call_args, 3); ··· 16035 16038 jsval_t val; 16036 16039 16037 16040 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16038 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16039 - 16040 - unsigned parsed_idx = 0; 16041 - bool valid = true; 16042 - for (size_t i = 0; i < key_len && valid; i++) { 16043 - if (key[i] < '0' || key[i] > '9') valid = false; 16044 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16045 - } 16046 - if (!valid || parsed_idx >= len) continue; 16041 + unsigned parsed_idx; 16042 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 16047 16043 16048 16044 jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 16049 16045 jsval_t test = call_js_with_args(js, callback, call_args, 3); ··· 16099 16095 jsval_t val; 16100 16096 16101 16097 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16102 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16103 - 16104 - unsigned parsed_idx = 0; 16105 - bool valid = true; 16106 - for (size_t i = 0; i < key_len && valid; i++) { 16107 - if (key[i] < '0' || key[i] > '9') valid = false; 16108 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16109 - } 16110 - if (!valid || parsed_idx >= len) continue; 16098 + unsigned parsed_idx; 16099 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 16111 16100 16112 16101 if (first) { 16113 16102 accumulator = val; ··· 16145 16134 jsval_t val; 16146 16135 16147 16136 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16148 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16149 - 16150 - unsigned parsed_idx = 0; 16151 - bool valid = true; 16152 - for (size_t i = 0; i < key_len && valid; i++) { 16153 - if (key[i] < '0' || key[i] > '9') valid = false; 16154 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16155 - } 16156 - if (!valid || parsed_idx >= len) continue; 16137 + unsigned parsed_idx; 16138 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 16157 16139 16158 16140 if (depth > 0 && (vtype(val) == T_ARR || vtype(val) == T_OBJ)) { 16159 16141 flat_helper(js, val, result, result_idx, depth - 1); ··· 16215 16197 if (elem_off != 0) { 16216 16198 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 16217 16199 char res_idx[16]; 16218 - snprintf(res_idx, sizeof(res_idx), "%u", (unsigned) result_idx); 16219 - jsval_t key = js_mkstr(js, res_idx, strlen(res_idx)); 16220 - setprop(js, result, key, elem); 16200 + size_t res_idx_len = uint_to_str(res_idx, sizeof(res_idx), (unsigned)result_idx); 16201 + js_mkprop_fast(js, result, res_idx, res_idx_len, elem); 16221 16202 } 16222 16203 result_idx++; 16223 16204 } ··· 16240 16221 jsval_t elem = resolveprop(js, mkval(T_PROP, elem_off)); 16241 16222 char res_idx[16]; 16242 16223 size_t res_idx_len = uint_to_str(res_idx, sizeof(res_idx), (unsigned)result_idx); 16243 - jsval_t key = js_mkstr(js, res_idx, res_idx_len); 16244 - setprop(js, result, key, elem); 16224 + js_mkprop_fast(js, result, res_idx, res_idx_len, elem); 16245 16225 } 16246 16226 result_idx++; 16247 16227 } 16248 16228 } else { 16249 16229 char res_idx[16]; 16250 - snprintf(res_idx, sizeof(res_idx), "%u", (unsigned) result_idx); 16251 - jsval_t key = js_mkstr(js, res_idx, strlen(res_idx)); 16252 - setprop(js, result, key, arg); 16230 + size_t res_idx_len = uint_to_str(res_idx, sizeof(res_idx), (unsigned)result_idx); 16231 + js_mkprop_fast(js, result, res_idx, res_idx_len, arg); 16253 16232 result_idx++; 16254 16233 } 16255 16234 } 16256 16235 16257 - jsval_t len_key = js_mkstr(js, "length", 6); 16258 - setprop(js, result, len_key, tov((double) result_idx)); 16236 + js_mkprop_fast(js, result, "length", 6, tov((double)result_idx)); 16259 16237 return mkval(T_ARR, vdata(result)); 16260 16238 } 16261 16239 ··· 16325 16303 return arr; 16326 16304 } 16327 16305 16328 - static jsval_t builtin_array_find(struct js *js, jsval_t *args, int nargs) { 16306 + static jsval_t array_find_impl(struct js *js, jsval_t *args, int nargs, bool return_index, const char *name) { 16329 16307 jsval_t arr = js->this_val; 16330 16308 16331 16309 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16332 - return js_mkerr(js, "find called on non-array"); 16310 + return js_mkerr(js, "%s called on non-array", name); 16333 16311 16334 16312 if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16335 - return js_mkerr(js, "find requires a function argument"); 16313 + return js_mkerr(js, "%s requires a function argument", name); 16336 16314 16337 16315 jsval_t callback = args[0]; 16338 16316 ··· 16342 16320 jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 16343 16321 if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 16344 16322 } 16345 - if (len == 0) return js_mkundef(); 16323 + if (len == 0) return return_index ? tov(-1) : js_mkundef(); 16346 16324 16347 16325 ant_iter_t iter = js_prop_iter_begin(js, arr); 16348 16326 const char *key; ··· 16350 16328 jsval_t val; 16351 16329 16352 16330 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16353 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16354 - 16355 - unsigned parsed_idx = 0; 16356 - bool valid = true; 16357 - for (size_t i = 0; i < key_len && valid; i++) { 16358 - if (key[i] < '0' || key[i] > '9') valid = false; 16359 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16360 - } 16361 - if (!valid || parsed_idx >= len) continue; 16331 + unsigned parsed_idx; 16332 + if (!parse_array_index(key, key_len, len, &parsed_idx)) continue; 16362 16333 16363 16334 jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 16364 16335 jsval_t result = call_js_with_args(js, callback, call_args, 3); ··· 16369 16340 } 16370 16341 if (js_truthy(js, result)) { 16371 16342 js_prop_iter_end(&iter); 16372 - return val; 16343 + return return_index ? tov((double)parsed_idx) : val; 16373 16344 } 16374 16345 } 16375 16346 js_prop_iter_end(&iter); 16376 16347 16377 - return js_mkundef(); 16348 + return return_index ? tov(-1) : js_mkundef(); 16349 + } 16350 + 16351 + static jsval_t builtin_array_find(struct js *js, jsval_t *args, int nargs) { 16352 + return array_find_impl(js, args, nargs, false, "find"); 16378 16353 } 16379 16354 16380 16355 static jsval_t builtin_array_findIndex(struct js *js, jsval_t *args, int nargs) { 16381 - jsval_t arr = js->this_val; 16382 - 16383 - if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16384 - return js_mkerr(js, "findIndex called on non-array"); 16385 - 16386 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16387 - return js_mkerr(js, "findIndex requires a function argument"); 16388 - 16389 - jsval_t callback = args[0]; 16390 - 16391 - jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16392 - jsoff_t len = 0; 16393 - if (len_off != 0) { 16394 - jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 16395 - if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 16396 - } 16397 - if (len == 0) return tov(-1); 16398 - 16399 - ant_iter_t iter = js_prop_iter_begin(js, arr); 16400 - const char *key; 16401 - size_t key_len; 16402 - jsval_t val; 16403 - 16404 - while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16405 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16406 - 16407 - unsigned parsed_idx = 0; 16408 - bool valid = true; 16409 - for (size_t i = 0; i < key_len && valid; i++) { 16410 - if (key[i] < '0' || key[i] > '9') valid = false; 16411 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16412 - } 16413 - if (!valid || parsed_idx >= len) continue; 16414 - 16415 - jsval_t call_args[3] = { val, tov((double)parsed_idx), arr }; 16416 - jsval_t result = call_js_with_args(js, callback, call_args, 3); 16417 - 16418 - if (is_err(result)) { 16419 - js_prop_iter_end(&iter); 16420 - return result; 16421 - } 16422 - if (js_truthy(js, result)) { 16423 - js_prop_iter_end(&iter); 16424 - return tov((double)parsed_idx); 16425 - } 16426 - } 16427 - js_prop_iter_end(&iter); 16428 - 16429 - return tov(-1); 16356 + return array_find_impl(js, args, nargs, true, "findIndex"); 16430 16357 } 16431 16358 16432 - static jsval_t builtin_array_findLast(struct js *js, jsval_t *args, int nargs) { 16359 + static jsval_t array_find_last_impl(struct js *js, jsval_t *args, int nargs, bool return_index, const char *name) { 16433 16360 jsval_t arr = js->this_val; 16434 16361 16435 16362 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16436 - return js_mkerr(js, "findLast called on non-array"); 16363 + return js_mkerr(js, "%s called on non-array", name); 16437 16364 16438 16365 if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16439 - return js_mkerr(js, "findLast requires a function argument"); 16366 + return js_mkerr(js, "%s requires a function argument", name); 16440 16367 16441 16368 jsval_t callback = args[0]; 16442 16369 ··· 16446 16373 jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 16447 16374 if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 16448 16375 } 16449 - if (len == 0) return js_mkundef(); 16376 + if (len == 0) return return_index ? tov(-1) : js_mkundef(); 16450 16377 16451 16378 jsval_t *vals = malloc(len * sizeof(jsval_t)); 16452 16379 unsigned *idxs = malloc(len * sizeof(unsigned)); ··· 16457 16384 const char *key; size_t key_len; jsval_t val; 16458 16385 16459 16386 while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16460 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16461 - 16462 - unsigned parsed_idx = 0; 16463 - bool valid = true; 16464 - for (size_t i = 0; i < key_len && valid; i++) { 16465 - if (key[i] < '0' || key[i] > '9') valid = false; 16466 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16467 - } 16468 - if (!valid || parsed_idx >= len || count >= len) continue; 16387 + unsigned parsed_idx; 16388 + if (!parse_array_index(key, key_len, len, &parsed_idx) || count >= len) continue; 16469 16389 16470 16390 vals[count] = val; 16471 16391 idxs[count] = parsed_idx; ··· 16482 16402 return result; 16483 16403 } 16484 16404 if (js_truthy(js, result)) { 16485 - jsval_t found = vals[i-1]; 16405 + jsval_t found_val = vals[i-1]; 16406 + unsigned found_idx = idxs[i-1]; 16486 16407 free(vals); free(idxs); 16487 - return found; 16408 + return return_index ? tov((double)found_idx) : found_val; 16488 16409 } 16489 16410 } 16490 16411 16491 16412 free(vals); free(idxs); 16492 - return js_mkundef(); 16413 + return return_index ? tov(-1) : js_mkundef(); 16414 + } 16415 + 16416 + static jsval_t builtin_array_findLast(struct js *js, jsval_t *args, int nargs) { 16417 + return array_find_last_impl(js, args, nargs, false, "findLast"); 16493 16418 } 16494 16419 16495 16420 static jsval_t builtin_array_findLastIndex(struct js *js, jsval_t *args, int nargs) { 16496 - jsval_t arr = js->this_val; 16497 - 16498 - if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16499 - return js_mkerr(js, "findLastIndex called on non-array"); 16500 - 16501 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16502 - return js_mkerr(js, "findLastIndex requires a function argument"); 16503 - 16504 - jsval_t callback = args[0]; 16505 - 16506 - jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16507 - jsoff_t len = 0; 16508 - if (len_off != 0) { 16509 - jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 16510 - if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 16511 - } 16512 - if (len == 0) return tov(-1); 16513 - 16514 - jsval_t *vals = malloc(len * sizeof(jsval_t)); 16515 - unsigned *idxs = malloc(len * sizeof(unsigned)); 16516 - if (!vals || !idxs) { free(vals); free(idxs); return js_mkerr(js, "out of memory"); } 16517 - 16518 - jsoff_t count = 0; 16519 - ant_iter_t iter = js_prop_iter_begin(js, arr); 16520 - const char *key; 16521 - size_t key_len; 16522 - jsval_t val; 16523 - 16524 - while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 16525 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 16526 - 16527 - unsigned parsed_idx = 0; 16528 - bool valid = true; 16529 - for (size_t i = 0; i < key_len && valid; i++) { 16530 - if (key[i] < '0' || key[i] > '9') valid = false; 16531 - else parsed_idx = parsed_idx * 10 + (key[i] - '0'); 16532 - } 16533 - if (!valid || parsed_idx >= len || count >= len) continue; 16534 - 16535 - vals[count] = val; 16536 - idxs[count] = parsed_idx; 16537 - count++; 16538 - } 16539 - js_prop_iter_end(&iter); 16540 - 16541 - for (jsoff_t i = count; i > 0; i--) { 16542 - jsval_t call_args[3] = { vals[i-1], tov((double)idxs[i-1]), arr }; 16543 - jsval_t result = call_js_with_args(js, callback, call_args, 3); 16544 - 16545 - if (is_err(result)) { 16546 - free(vals); free(idxs); 16547 - return result; 16548 - } 16549 - if (js_truthy(js, result)) { 16550 - unsigned found_idx = idxs[i-1]; 16551 - free(vals); free(idxs); 16552 - return tov((double)found_idx); 16553 - } 16554 - } 16555 - 16556 - free(vals); free(idxs); 16557 - return tov(-1); 16421 + return array_find_last_impl(js, args, nargs, true, "findLastIndex"); 16558 16422 } 16559 16423 16560 16424 static jsval_t builtin_array_flatMap(struct js *js, jsval_t *args, int nargs) { ··· 17177 17041 17178 17042 static jsval_t builtin_array_toSorted(struct js *js, jsval_t *args, int nargs) { 17179 17043 jsval_t arr = js->this_val; 17180 - 17181 17044 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 17182 17045 return js_mkerr(js, "toSorted called on non-array"); 17183 17046 17184 - jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 17185 - jsoff_t len = 0; 17186 - if (len_off != 0) { 17187 - jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 17188 - if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 17189 - } 17190 - 17191 - jsval_t result = mkarr(js); 17047 + jsval_t result = array_shallow_copy(js, arr, get_array_length(js, arr)); 17192 17048 if (is_err(result)) return result; 17193 17049 17194 - ant_iter_t iter = js_prop_iter_begin(js, arr); 17195 - const char *key; 17196 - size_t key_len; 17197 - jsval_t val; 17198 - 17199 - while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 17200 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 17201 - js_mkprop_fast(js, result, key, key_len, val); 17202 - } 17203 - 17204 - js_prop_iter_end(&iter); 17205 - js_mkprop_fast(js, result, "length", 6, tov((double)len)); 17206 - 17207 17050 jsval_t saved_this = js->this_val; 17208 17051 js->this_val = result; 17209 17052 jsval_t sorted = builtin_array_sort(js, args, nargs); ··· 17216 17059 static jsval_t builtin_array_toReversed(struct js *js, jsval_t *args, int nargs) { 17217 17060 (void)args; (void)nargs; 17218 17061 jsval_t arr = js->this_val; 17219 - 17220 17062 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 17221 17063 return js_mkerr(js, "toReversed called on non-array"); 17222 17064 17223 - jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 17224 - jsoff_t len = 0; 17225 - if (len_off != 0) { 17226 - jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 17227 - if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 17228 - } 17229 - 17230 - jsval_t result = mkarr(js); 17065 + jsval_t result = array_shallow_copy(js, arr, get_array_length(js, arr)); 17231 17066 if (is_err(result)) return result; 17232 17067 17233 - ant_iter_t iter = js_prop_iter_begin(js, arr); 17234 - const char *key; 17235 - size_t key_len; 17236 - jsval_t val; 17237 - 17238 - while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 17239 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 17240 - js_mkprop_fast(js, result, key, key_len, val); 17241 - } 17242 - 17243 - js_prop_iter_end(&iter); 17244 - js_mkprop_fast(js, result, "length", 6, tov((double)len)); 17245 - 17246 17068 jsval_t saved_this = js->this_val; 17247 17069 js->this_val = result; 17248 17070 jsval_t reversed = builtin_array_reverse(js, NULL, 0); ··· 17254 17076 17255 17077 static jsval_t builtin_array_toSpliced(struct js *js, jsval_t *args, int nargs) { 17256 17078 jsval_t arr = js->this_val; 17257 - 17258 17079 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 17259 17080 return js_mkerr(js, "toSpliced called on non-array"); 17260 17081 17261 - jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 17262 - jsoff_t len = 0; 17263 - if (len_off != 0) { 17264 - jsval_t len_val = resolveprop(js, mkval(T_PROP, len_off)); 17265 - if (vtype(len_val) == T_NUM) len = (jsoff_t)tod(len_val); 17266 - } 17267 - 17268 - jsval_t result = mkarr(js); 17082 + jsval_t result = array_shallow_copy(js, arr, get_array_length(js, arr)); 17269 17083 if (is_err(result)) return result; 17270 - 17271 - ant_iter_t iter = js_prop_iter_begin(js, arr); 17272 - const char *key; 17273 - size_t key_len; 17274 - jsval_t val; 17275 - 17276 - while (js_prop_iter_next(&iter, &key, &key_len, &val)) { 17277 - if (key_len == 0 || key[0] > '9' || key[0] < '0') continue; 17278 - js_mkprop_fast(js, result, key, key_len, val); 17279 - } 17280 - 17281 - js_prop_iter_end(&iter); 17282 - js_mkprop_fast(js, result, "length", 6, tov((double)len)); 17283 17084 17284 17085 jsval_t saved_this = js->this_val; 17285 17086 js->this_val = result;