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 Promise.any

+113 -8
+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.25') 82 + version_conf.set('ANT_VERSION', '0.2.2.26') 83 83 version_conf.set('ANT_GIT_HASH', git_hash) 84 84 version_conf.set('ANT_BUILD_DATE', build_date) 85 85
+112 -7
src/ant.c
··· 733 733 734 734 static jsval_t builtin_Object(struct js *js, jsval_t *args, int nargs); 735 735 static jsval_t builtin_Promise(struct js *js, jsval_t *args, int nargs); 736 - static jsval_t builtin_Promise_resolve(struct js *js, jsval_t *args, int nargs); 737 - static jsval_t builtin_Promise_reject(struct js *js, jsval_t *args, int nargs); 738 - static jsval_t builtin_Promise_try(struct js *js, jsval_t *args, int nargs); 739 - static jsval_t builtin_Promise_all(struct js *js, jsval_t *args, int nargs); 740 - static jsval_t builtin_Promise_race(struct js *js, jsval_t *args, int nargs); 741 736 static jsval_t builtin_promise_then(struct js *js, jsval_t *args, int nargs); 742 - static jsval_t builtin_promise_catch(struct js *js, jsval_t *args, int nargs); 743 - static jsval_t builtin_promise_finally(struct js *js, jsval_t *args, int nargs); 744 737 745 738 static jsval_t proxy_get(struct js *js, jsval_t proxy, const char *key, size_t key_len); 746 739 static jsval_t proxy_set(struct js *js, jsval_t proxy, const char *key, size_t key_len, jsval_t value); ··· 18264 18257 return result_promise; 18265 18258 } 18266 18259 18260 + static jsval_t mk_aggregate_error(struct js *js, jsval_t errors) { 18261 + jsval_t agg_err = js_mkobj(js); 18262 + js_set(js, agg_err, "name", js_mkstr(js, "AggregateError", 14)); 18263 + js_set(js, agg_err, "message", js_mkstr(js, "All promises were rejected", 26)); 18264 + js_set(js, agg_err, "errors", errors); 18265 + return agg_err; 18266 + } 18267 + 18268 + static bool promise_any_try_resolve(struct js *js, jsval_t tracker, jsval_t value) { 18269 + if (js_truthy(js, js_get(js, tracker, "resolved"))) return false; 18270 + js_set(js, tracker, "resolved", js_mktrue()); 18271 + resolve_promise(js, js_get(js, tracker, "promise"), value); 18272 + return true; 18273 + } 18274 + 18275 + static void promise_any_record_rejection(struct js *js, jsval_t tracker, int index, jsval_t reason) { 18276 + jsval_t errors = resolveprop(js, js_get(js, tracker, "errors")); 18277 + char idx[16]; 18278 + snprintf(idx, sizeof(idx), "%d", index); 18279 + setprop(js, errors, js_mkstr(js, idx, strlen(idx)), reason); 18280 + 18281 + int remaining = (int)tod(js_get(js, tracker, "remaining")) - 1; 18282 + js_set(js, tracker, "remaining", tov((double)remaining)); 18283 + 18284 + if (remaining == 0) { 18285 + reject_promise(js, js_get(js, tracker, "promise"), mk_aggregate_error(js, errors)); 18286 + } 18287 + } 18288 + 18289 + static jsval_t builtin_Promise_any_resolve_handler(struct js *js, jsval_t *args, int nargs) { 18290 + jsval_t tracker = js_get(js, js->this_val, "tracker"); 18291 + promise_any_try_resolve(js, tracker, nargs > 0 ? args[0] : js_mkundef()); 18292 + return js_mkundef(); 18293 + } 18294 + 18295 + static jsval_t builtin_Promise_any_reject_handler(struct js *js, jsval_t *args, int nargs) { 18296 + jsval_t tracker = js_get(js, js->this_val, "tracker"); 18297 + if (js_truthy(js, js_get(js, tracker, "resolved"))) return js_mkundef(); 18298 + 18299 + int index = (int)tod(js_get(js, js->this_val, "index")); 18300 + promise_any_record_rejection(js, tracker, index, nargs > 0 ? args[0] : js_mkundef()); 18301 + return js_mkundef(); 18302 + } 18303 + 18304 + static jsval_t builtin_Promise_any(struct js *js, jsval_t *args, int nargs) { 18305 + if (nargs < 1) return js_mkerr(js, "Promise.any requires an array"); 18306 + 18307 + jsval_t arr = args[0]; 18308 + if (vtype(arr) != T_ARR) return js_mkerr(js, "Promise.any requires an array"); 18309 + 18310 + jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 18311 + int len = len_off ? (int)tod(resolveprop(js, mkval(T_PROP, len_off))) : 0; 18312 + 18313 + if (len == 0) { 18314 + jsval_t reject_args[] = { mk_aggregate_error(js, mkarr(js)) }; 18315 + return builtin_Promise_reject(js, reject_args, 1); 18316 + } 18317 + 18318 + jsval_t result_promise = mkpromise(js); 18319 + jsval_t tracker = mkobj(js, 0); 18320 + jsval_t errors = mkarr(js); 18321 + 18322 + setprop(js, tracker, js_mkstr(js, "remaining", 9), tov((double)len)); 18323 + setprop(js, tracker, js_mkstr(js, "errors", 6), errors); 18324 + setprop(js, tracker, js_mkstr(js, "promise", 7), result_promise); 18325 + setprop(js, tracker, js_mkstr(js, "resolved", 8), js_mkfalse()); 18326 + setprop(js, errors, js_mkstr(js, "length", 6), tov((double)len)); 18327 + 18328 + for (int i = 0; i < len; i++) { 18329 + char idx[16]; 18330 + snprintf(idx, sizeof(idx), "%d", i); 18331 + jsval_t item = resolveprop(js, js_get(js, arr, idx)); 18332 + 18333 + if (vtype(item) != T_PROMISE) { 18334 + promise_any_try_resolve(js, tracker, item); 18335 + return result_promise; 18336 + } 18337 + 18338 + jsval_t item_obj = mkval(T_OBJ, vdata(item)); 18339 + jsoff_t state_off = lkp(js, item_obj, "__state", 7); 18340 + int state = (int)tod(resolveprop(js, mkval(T_PROP, state_off))); 18341 + 18342 + if (state == 1) { 18343 + jsoff_t val_off = lkp(js, item_obj, "__value", 7); 18344 + promise_any_try_resolve(js, tracker, resolveprop(js, mkval(T_PROP, val_off))); 18345 + return result_promise; 18346 + } else if (state == 2) { 18347 + jsoff_t val_off = lkp(js, item_obj, "__value", 7); 18348 + promise_any_record_rejection(js, tracker, i, resolveprop(js, mkval(T_PROP, val_off))); 18349 + continue; 18350 + } 18351 + 18352 + jsval_t resolve_obj = mkobj(js, 0); 18353 + setprop(js, resolve_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_Promise_any_resolve_handler)); 18354 + setprop(js, resolve_obj, js_mkstr(js, "tracker", 7), tracker); 18355 + 18356 + jsval_t reject_obj = mkobj(js, 0); 18357 + setprop(js, reject_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_Promise_any_reject_handler)); 18358 + setprop(js, reject_obj, js_mkstr(js, "index", 5), tov((double)i)); 18359 + setprop(js, reject_obj, js_mkstr(js, "tracker", 7), tracker); 18360 + 18361 + jsval_t then_args[] = { mkval(T_FUNC, vdata(resolve_obj)), mkval(T_FUNC, vdata(reject_obj)) }; 18362 + jsval_t saved_this = js->this_val; 18363 + js->this_val = item; 18364 + builtin_promise_then(js, then_args, 2); 18365 + js->this_val = saved_this; 18366 + } 18367 + 18368 + return result_promise; 18369 + } 18370 + 18267 18371 static jsval_t do_instanceof(struct js *js, jsval_t l, jsval_t r) { 18268 18372 uint8_t ltype = vtype(l); 18269 18373 uint8_t rtype = vtype(r); ··· 20540 20644 setprop(js, p_ctor_obj, js_mkstr(js, "try", 3), js_mkfun(builtin_Promise_try)); 20541 20645 setprop(js, p_ctor_obj, js_mkstr(js, "all", 3), js_mkfun(builtin_Promise_all)); 20542 20646 setprop(js, p_ctor_obj, js_mkstr(js, "race", 4), js_mkfun(builtin_Promise_race)); 20647 + setprop(js, p_ctor_obj, js_mkstr(js, "any", 3), js_mkfun(builtin_Promise_any)); 20543 20648 setprop_nonconfigurable(js, p_ctor_obj, "prototype", 9, promise_proto); 20544 20649 setprop(js, glob, js_mkstr(js, "Promise", 7), mkval(T_FUNC, vdata(p_ctor_obj))); 20545 20650