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.

unify lock handler creation using data slots

+26 -15
+26 -15
src/modules/navigator.c
··· 118 118 119 119 static void process_pending_requests(struct js *js); 120 120 121 + static jsval_t make_lock_handler(struct js *js, jsval_t cfunc, jsval_t lock_name, jsval_t outer_promise) { 122 + jsval_t fn_obj = js_mkobj(js); 123 + js_set_slot(js, fn_obj, SLOT_CFUNC, cfunc); 124 + 125 + jsval_t data_obj = js_mkobj(js); 126 + js_set(js, data_obj, "lockName", lock_name); 127 + js_set(js, data_obj, "outerPromise", outer_promise); 128 + js_set_slot(js, fn_obj, SLOT_DATA, data_obj); 129 + 130 + return js_obj_to_func(fn_obj); 131 + } 132 + 121 133 static jsval_t lock_then_handler(struct js *js, jsval_t *args, int nargs) { 122 134 jsval_t current_func = js_getcurrentfunc(js); 123 - jsval_t lock_name_val = js_get(js, current_func, "_lockName"); 124 - jsval_t outer_promise = js_get(js, current_func, "_outerPromise"); 135 + jsval_t data_obj = js_get_slot(js, current_func, SLOT_DATA); 136 + 137 + jsval_t lock_name_val = js_get(js, data_obj, "lockName"); 138 + jsval_t outer_promise = js_get(js, data_obj, "outerPromise"); 125 139 jsval_t result_val = (nargs > 0) ? args[0] : js_mkundef(); 126 140 127 141 size_t name_len; 128 142 char *name = js_getstr(js, lock_name_val, &name_len); 129 143 130 144 if (name) release_lock(name); 131 - 132 145 js_resolve_promise(js, outer_promise, result_val); 133 146 process_pending_requests(js); 134 147 ··· 137 150 138 151 static jsval_t lock_catch_handler(struct js *js, jsval_t *args, int nargs) { 139 152 jsval_t current_func = js_getcurrentfunc(js); 140 - jsval_t lock_name_val = js_get(js, current_func, "_lockName"); 141 - jsval_t outer_promise = js_get(js, current_func, "_outerPromise"); 153 + jsval_t data_obj = js_get_slot(js, current_func, SLOT_DATA); 154 + 155 + jsval_t lock_name_val = js_get(js, data_obj, "lockName"); 156 + jsval_t outer_promise = js_get(js, data_obj, "outerPromise"); 142 157 jsval_t error_val = (nargs > 0) ? args[0] : js_mkundef(); 143 158 144 159 size_t name_len; ··· 174 189 if (fn_type == T_FUNC || fn_type == T_CFUNC) { 175 190 jsval_t name_str = js_mkstr(js, name, strlen(name)); 176 191 177 - jsval_t on_resolve = js_mkfun(lock_then_handler); 178 - js_set(js, on_resolve, "_lockName", name_str); 179 - js_set(js, on_resolve, "_outerPromise", outer_promise); 180 - 181 - jsval_t on_reject = js_mkfun(lock_catch_handler); 182 - js_set(js, on_reject, "_lockName", name_str); 183 - js_set(js, on_reject, "_outerPromise", outer_promise); 192 + jsval_t on_resolve = make_lock_handler(js, js_mkfun(lock_then_handler), name_str, outer_promise); 193 + jsval_t on_reject = make_lock_handler(js, js_mkfun(lock_catch_handler), name_str, outer_promise); 184 194 185 195 jsval_t then_args[2] = { on_resolve, on_reject }; 186 196 js_call_with_this(js, then_fn, result, then_args, 2); ··· 275 285 jsval_t then_fn = js_get(js, result, "then"); 276 286 int fn_type = vtype(then_fn); 277 287 if (fn_type == T_FUNC || fn_type == T_CFUNC) { 278 - jsval_t on_resolve = js_mkfun(lock_then_handler); 279 - js_set(js, on_resolve, "_lockName", js_mkstr(js, "", 0)); 280 - js_set(js, on_resolve, "_outerPromise", promise); 288 + jsval_t on_resolve = make_lock_handler( 289 + js, js_mkfun(lock_then_handler), 290 + js_mkstr(js, "", 0), promise 291 + ); 281 292 js_call_with_this(js, then_fn, result, &on_resolve, 1); 282 293 return promise; 283 294 }