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.

migrate to data slot for promise

+36 -29
+33 -27
src/ant.c
··· 216 216 static const char *INTERN_ARGUMENTS = NULL; 217 217 static const char *INTERN_CALLEE = NULL; 218 218 static const char *INTERN_IDX[10] = {NULL}; 219 - static const char *INTERN_PROMISE = NULL; 220 219 221 220 typedef struct interned_string { 222 221 uint64_t hash; ··· 3049 3048 INTERN_VALUE = intern_string("value", 5); 3050 3049 INTERN_GET = intern_string("get", 3); 3051 3050 INTERN_SET = intern_string("set", 3); 3052 - INTERN_PROMISE = intern_string("promise", 7); 3053 3051 INTERN_ARGUMENTS = intern_string("arguments", 9); 3054 3052 INTERN_CALLEE = intern_string("callee", 6); 3055 3053 INTERN_IDX[0] = intern_string("0", 1); ··· 18437 18435 static void trigger_handlers(struct js *js, jsval_t p) { 18438 18436 jsval_t wrapper_obj = mkobj(js, 0); 18439 18437 set_slot(js, wrapper_obj, SLOT_CFUNC, js_mkfun(builtin_trigger_handler_wrapper)); 18440 - setprop_fast(js, wrapper_obj, "promise", 7, p); 18438 + set_slot(js, wrapper_obj, SLOT_DATA, p); 18441 18439 jsval_t wrapper_fn = mkval(T_FUNC, vdata(wrapper_obj)); 18442 18440 queue_microtask(js, wrapper_fn); 18443 18441 } 18444 18442 18445 18443 static jsval_t builtin_trigger_handler_wrapper(struct js *js, jsval_t *args, int nargs) { 18446 18444 jsval_t me = js->current_func; 18447 - jsoff_t promise_prop_off = lkp_interned(js, me, INTERN_PROMISE, 7); 18448 - if (promise_prop_off == 0) return js_mkundef(); 18449 - jsval_t p = resolveprop(js, mkval(T_PROP, promise_prop_off)); 18445 + jsval_t p = get_slot(js, me, SLOT_DATA); 18450 18446 if (vtype(p) != T_PROMISE) return js_mkundef(); 18451 18447 18452 18448 uint32_t pid = get_promise_id(js, p); ··· 18506 18502 18507 18503 jsval_t res_obj = mkobj(js, 0); 18508 18504 set_slot(js, res_obj, SLOT_CFUNC, js_mkfun(builtin_resolve_internal)); 18509 - setprop_fast(js, res_obj, "promise", 7, p); 18505 + set_slot(js, res_obj, SLOT_DATA, p); 18510 18506 jsval_t res_fn = mkval(T_FUNC, vdata(res_obj)); 18511 18507 18512 18508 jsval_t rej_obj = mkobj(js, 0); 18513 18509 set_slot(js, rej_obj, SLOT_CFUNC, js_mkfun(builtin_reject_internal)); 18514 - setprop_fast(js, rej_obj, "promise", 7, p); 18510 + set_slot(js, rej_obj, SLOT_DATA, p); 18515 18511 jsval_t rej_fn = mkval(T_FUNC, vdata(rej_obj)); 18516 18512 18517 18513 jsval_t call_args[] = { res_fn, rej_fn }; ··· 18539 18535 18540 18536 static jsval_t builtin_resolve_internal(struct js *js, jsval_t *args, int nargs) { 18541 18537 jsval_t me = js->current_func; 18542 - jsval_t p = js_get(js, me, "promise"); 18538 + jsval_t p = get_slot(js, me, SLOT_DATA); 18543 18539 if (vtype(p) != T_PROMISE) return js_mkundef(); 18544 18540 resolve_promise(js, p, nargs > 0 ? args[0] : js_mkundef()); 18545 18541 return js_mkundef(); ··· 18547 18543 18548 18544 static jsval_t builtin_reject_internal(struct js *js, jsval_t *args, int nargs) { 18549 18545 jsval_t me = js->current_func; 18550 - jsval_t p = js_get(js, me, "promise"); 18546 + jsval_t p = get_slot(js, me, SLOT_DATA); 18551 18547 if (vtype(p) != T_PROMISE) return js_mkundef(); 18552 18548 reject_promise(js, p, nargs > 0 ? args[0] : js_mkundef()); 18553 18549 return js_mkundef(); 18554 18550 } 18555 18551 18556 18552 static jsval_t builtin_Promise(struct js *js, jsval_t *args, int nargs) { 18553 + if (vtype(js->new_target) == T_UNDEF) { 18554 + return js_mkerr_typed(js, JS_ERR_TYPE, "Promise constructor cannot be invoked without 'new'"); 18555 + } 18556 + 18557 + if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) { 18558 + return js_mkerr_typed(js, JS_ERR_TYPE, "Promise resolver undefined is not a function"); 18559 + } 18560 + 18557 18561 jsval_t p = mkpromise(js); 18558 18562 jsval_t res_obj = mkobj(js, 0); 18563 + 18559 18564 set_slot(js, res_obj, SLOT_CFUNC, js_mkfun(builtin_resolve_internal)); 18560 - setprop(js, res_obj, js_mkstr(js, "promise", 7), p); 18565 + set_slot(js, res_obj, SLOT_DATA, p); 18566 + 18561 18567 jsval_t res_fn = mkval(T_FUNC, vdata(res_obj)); 18562 18568 jsval_t rej_obj = mkobj(js, 0); 18569 + 18563 18570 set_slot(js, rej_obj, SLOT_CFUNC, js_mkfun(builtin_reject_internal)); 18564 - setprop(js, rej_obj, js_mkstr(js, "promise", 7), p); 18571 + set_slot(js, rej_obj, SLOT_DATA, p); 18572 + 18565 18573 jsval_t rej_fn = mkval(T_FUNC, vdata(rej_obj)); 18566 - if (nargs > 0) { 18567 - jsval_t exec_args[] = { res_fn, rej_fn }; 18568 - js_call(js, args[0], exec_args, 2); 18569 - } 18574 + jsval_t exec_args[] = { res_fn, rej_fn }; 18575 + js_call(js, args[0], exec_args, 2); 18576 + 18570 18577 return p; 18571 18578 } 18572 18579 ··· 18679 18686 setprop(js, tracker, js_mkstr(js, "remaining", 9), tov((double)remaining)); 18680 18687 18681 18688 if (remaining == 0) { 18682 - jsval_t result_promise = js_get(js, tracker, "promise"); 18689 + jsval_t result_promise = get_slot(js, tracker, SLOT_DATA); 18683 18690 resolve_promise(js, result_promise, mkval(T_ARR, vdata(results))); 18684 18691 } 18685 18692 ··· 18689 18696 static jsval_t builtin_Promise_all_reject_handler(struct js *js, jsval_t *args, int nargs) { 18690 18697 jsval_t me = js->current_func; 18691 18698 jsval_t tracker = js_get(js, me, "tracker"); 18692 - jsval_t result_promise = js_get(js, tracker, "promise"); 18699 + jsval_t result_promise = get_slot(js, tracker, SLOT_DATA); 18693 18700 18694 18701 jsval_t reason = nargs > 0 ? args[0] : js_mkundef(); 18695 18702 reject_promise(js, result_promise, reason); ··· 18716 18723 } 18717 18724 18718 18725 jsval_t result_promise = mkpromise(js); 18719 - 18720 18726 jsval_t tracker = mkobj(js, 0); 18727 + 18721 18728 setprop(js, tracker, js_mkstr(js, "remaining", 9), tov((double)len)); 18722 18729 setprop(js, tracker, js_mkstr(js, "results", 7), mkarr(js)); 18723 - setprop(js, tracker, js_mkstr(js, "promise", 7), result_promise); 18730 + set_slot(js, tracker, SLOT_DATA, result_promise); 18724 18731 18725 18732 jsval_t results = resolveprop(js, js_get(js, tracker, "results")); 18726 18733 setprop(js, results, js_mkstr(js, "length", 6), tov((double)len)); ··· 18772 18779 18773 18780 jsval_t resolve_obj = mkobj(js, 0); 18774 18781 set_slot(js, resolve_obj, SLOT_CFUNC, js_mkfun(builtin_resolve_internal)); 18775 - setprop(js, resolve_obj, js_mkstr(js, "promise", 7), result_promise); 18782 + set_slot(js, resolve_obj, SLOT_DATA, result_promise); 18776 18783 jsval_t resolve_fn = mkval(T_FUNC, vdata(resolve_obj)); 18777 18784 18778 18785 jsval_t reject_obj = mkobj(js, 0); 18779 18786 set_slot(js, reject_obj, SLOT_CFUNC, js_mkfun(builtin_reject_internal)); 18780 - setprop(js, reject_obj, js_mkstr(js, "promise", 7), result_promise); 18787 + set_slot(js, reject_obj, SLOT_DATA, result_promise); 18781 18788 jsval_t reject_fn = mkval(T_FUNC, vdata(reject_obj)); 18782 18789 18783 18790 for (int i = 0; i < len; i++) { ··· 18823 18830 static bool promise_any_try_resolve(struct js *js, jsval_t tracker, jsval_t value) { 18824 18831 if (js_truthy(js, js_get(js, tracker, "resolved"))) return false; 18825 18832 js_set(js, tracker, "resolved", js_mktrue()); 18826 - resolve_promise(js, js_get(js, tracker, "promise"), value); 18833 + resolve_promise(js, get_slot(js, tracker, SLOT_DATA), value); 18827 18834 return true; 18828 18835 } 18829 18836 ··· 18836 18843 int remaining = (int)tod(js_get(js, tracker, "remaining")) - 1; 18837 18844 js_set(js, tracker, "remaining", tov((double)remaining)); 18838 18845 18839 - if (remaining == 0) { 18840 - reject_promise(js, js_get(js, tracker, "promise"), mk_aggregate_error(js, errors)); 18841 - } 18846 + if (remaining == 0) reject_promise(js, get_slot(js, tracker, SLOT_DATA), mk_aggregate_error(js, errors)); 18842 18847 } 18843 18848 18844 18849 static jsval_t builtin_Promise_any_resolve_handler(struct js *js, jsval_t *args, int nargs) { ··· 18874 18879 jsval_t tracker = mkobj(js, 0); 18875 18880 jsval_t errors = mkarr(js); 18876 18881 18882 + set_slot(js, tracker, SLOT_DATA, result_promise); 18883 + 18877 18884 setprop(js, tracker, js_mkstr(js, "remaining", 9), tov((double)len)); 18878 18885 setprop(js, tracker, js_mkstr(js, "errors", 6), errors); 18879 - setprop(js, tracker, js_mkstr(js, "promise", 7), result_promise); 18880 18886 setprop(js, tracker, js_mkstr(js, "resolved", 8), js_mkfalse()); 18881 18887 setprop(js, errors, js_mkstr(js, "length", 6), tov((double)len)); 18882 18888
+3 -2
src/modules/fetch.c
··· 177 177 jsval_t current_func = js_getcurrentfunc(js); 178 178 jsval_t url_val = js_get(js, current_func, "url"); 179 179 jsval_t options_val = js_get(js, current_func, "options"); 180 - jsval_t promise = js_get(js, current_func, "promise"); 180 + jsval_t promise = js_get_slot(js, current_func, SLOT_DATA); 181 181 182 182 char *url_str = js_getstr(js, url_val, NULL); 183 183 if (!url_str) { ··· 336 336 jsval_t wrapper_obj = js_mkobj(js); 337 337 338 338 js_set_slot(js, wrapper_obj, SLOT_CFUNC, js_mkfun(do_fetch_microtask)); 339 + js_set_slot(js, wrapper_obj, SLOT_DATA, promise); 340 + 339 341 js_set(js, wrapper_obj, "url", url_val); 340 342 js_set(js, wrapper_obj, "options", options_val); 341 - js_set(js, wrapper_obj, "promise", promise); 342 343 343 344 queue_microtask(js, js_obj_to_func(wrapper_obj)); 344 345