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.

handle trigger promise ID

+54 -30
+38 -11
src/ant.c
··· 251 251 jsval_t value; 252 252 UT_array *handlers; 253 253 uint32_t promise_id; 254 + uint32_t trigger_pid; 254 255 jsoff_t obj_offset; 255 256 int state; 256 257 UT_hash_handle hh; ··· 2425 2426 } 2426 2427 } 2427 2428 2429 + static char *tostr_alloc(struct js *js, jsval_t value) { 2430 + size_t cap = 64; 2431 + char *buf = ANT_GC_MALLOC(cap); 2432 + size_t n = tostr(js, value, buf, cap); 2433 + if (n >= cap) { 2434 + ANT_GC_FREE(buf); 2435 + buf = ANT_GC_MALLOC(n + 1); 2436 + tostr(js, value, buf, n + 1); 2437 + } 2438 + return buf; 2439 + } 2440 + 2428 2441 jsval_t js_tostring_val(struct js *js, jsval_t value) { 2429 2442 uint8_t t = vtype(value); 2430 2443 char *buf; size_t len, buflen; ··· 2838 2851 } 2839 2852 2840 2853 static jsval_t builtin_BigInt(struct js *js, jsval_t *args, int nargs) { 2854 + if (vtype(js->new_target) != T_UNDEF) return js_mkerr_typed(js, JS_ERR_TYPE, "BigInt is not a constructor"); 2841 2855 if (nargs < 1) return mkbigint(js, "0", 1, false); 2856 + 2842 2857 jsval_t arg = args[0]; 2843 2858 if (vtype(arg) == T_BIGINT) return arg; 2844 2859 if (vtype(arg) == T_NUM) { ··· 18383 18398 uint32_t pid = get_promise_id(js, value); 18384 18399 promise_data_entry_t *pd = get_promise_data(pid, false); 18385 18400 18401 + const char *content; 18402 + char *allocated = NULL; 18403 + 18386 18404 if (!pd || pd->state == 0) { 18387 - return (size_t)snprintf(buf, len, "Promise { <pending> }"); 18388 - } 18405 + content = "<pending>"; 18406 + } else if (pd->state == 2) { 18407 + char *val = tostr_alloc(js, pd->value); 18408 + allocated = ANT_GC_MALLOC(strlen(val) + 12); 18409 + sprintf(allocated, "<rejected> %s", val); 18410 + ANT_GC_FREE(val); 18411 + content = allocated; 18412 + } else { content = allocated = tostr_alloc(js, pd->value); } 18389 18413 18390 - char value_buf[256]; 18391 - size_t value_len = tostr(js, pd->value, value_buf, sizeof(value_buf)); 18392 - if (value_len >= sizeof(value_buf)) value_len = sizeof(value_buf) - 1; 18393 - value_buf[value_len] = '\0'; 18414 + size_t result = (pd && pd->trigger_pid) 18415 + ? (size_t)snprintf(buf, len, "Promise {\n %s,\n Symbol(async_id): %u,\n Symbol(trigger_async_id): %u\n}", content, pid, pd->trigger_pid) 18416 + : (size_t)snprintf(buf, len, "Promise {\n %s,\n Symbol(async_id): %u\n}", content, pid); 18394 18417 18395 - if (pd->state == 1) { 18396 - return (size_t)snprintf(buf, len, "Promise { %s }", value_buf); 18397 - } else { 18398 - return (size_t)snprintf(buf, len, "Promise { <rejected> %s }", value_buf); 18399 - } 18418 + if (allocated) ANT_GC_FREE(allocated); 18419 + return result; 18400 18420 } 18401 18421 18402 18422 static promise_data_entry_t *get_promise_data(uint32_t promise_id, bool create) { ··· 18407 18427 18408 18428 entry = (promise_data_entry_t *)malloc(sizeof(promise_data_entry_t)); 18409 18429 entry->promise_id = promise_id; 18430 + entry->trigger_pid = 0; 18410 18431 entry->obj_offset = 0; 18411 18432 entry->state = 0; 18412 18433 entry->value = js_mkundef(); ··· 18594 18615 static jsval_t builtin_promise_then(struct js *js, jsval_t *args, int nargs) { 18595 18616 jsval_t p = js->this_val; 18596 18617 if (vtype(p) != T_PROMISE) return js_mkerr(js, "not a promise"); 18618 + 18597 18619 jsval_t nextP = mkpromise(js); 18598 18620 jsval_t onFulfilled = nargs > 0 ? args[0] : js_mkundef(); 18599 18621 jsval_t onRejected = nargs > 1 ? args[1] : js_mkundef(); 18600 18622 18601 18623 uint32_t pid = get_promise_id(js, p); 18624 + uint32_t next_pid = get_promise_id(js, nextP); 18625 + 18626 + promise_data_entry_t *next_pd = get_promise_data(next_pid, false); 18627 + if (next_pd) next_pd->trigger_pid = pid; 18628 + 18602 18629 promise_data_entry_t *pd = get_promise_data(pid, false); 18603 18630 if (pd) { 18604 18631 promise_handler_t h = { onFulfilled, onRejected, nextP };
+1 -2
src/main.c
··· 56 56 js_set(js, js_glob(js), "__filename", js_mkstr(js, "[eval]", 6)); 57 57 58 58 jsval_t result = js_eval(js, script, len); 59 + js_run_event_loop(js); 59 60 60 61 if (js_type(result) == JS_ERR) { 61 62 fprintf(stderr, "%s\n", js_str(js, result)); ··· 69 70 if (str && strcmp(str, "undefined") != 0) { print_value_colored(str, stdout); printf("\n"); } 70 71 } 71 72 } 72 - 73 - js_run_event_loop(js); 74 73 } 75 74 76 75 static char *read_file(const char *filename, size_t *len) {
+15 -17
src/modules/io.c
··· 112 112 while (*p && *p != end_char) io_putc(*p++, stream); \ 113 113 if (*p == end_char) io_putc(*p++, stream); \ 114 114 io_puts(ANSI_RESET, stream); goto next; 115 + 116 + #define EMIT_TYPE(tag, len, color) \ 117 + if (memcmp(p, tag, len) == 0) { \ 118 + io_puts(color, stream); io_puts(tag, stream); io_puts(ANSI_RESET, stream); \ 119 + p += len; goto next; \ 120 + } 115 121 116 122 void print_value_colored(const char *str, FILE *stream) { 117 123 if (io_no_color) { io_print(str, stream); return; } ··· 167 173 case 'G': if (memcmp(p + 2, "etter/Setter]", 13) == 0 || memcmp(p + 2, "etter]", 6) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 168 174 case 'S': if (memcmp(p + 2, "etter]", 6) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 169 175 case 'O': if (memcmp(p + 2, "bject: null prototype]", 22) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 176 + case 'M': if (memcmp(p + 2, "odule]", 6) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 177 + case 'P': if (memcmp(p + 2, "romise]", 7) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 170 178 } 171 179 io_puts(JSON_BRACE, stream); io_putc(*p++, stream); io_puts(ANSI_RESET, stream); 172 180 array_depth++; is_key = false; goto next; ··· 202 210 203 211 lt: 204 212 if (memcmp(p, "<ref", 4) == 0) { EMIT_UNTIL('>', JSON_REF) } 205 - if (memcmp(p, "<pen", 4) == 0) { EMIT_UNTIL('>', JSON_REF) } 206 - if (memcmp(p, "<rej", 4) == 0) { EMIT_UNTIL('>', JSON_REF) } 213 + if (memcmp(p, "<pen", 4) == 0) { is_key = false; EMIT_UNTIL('>', ANSI_CYAN) } 214 + if (memcmp(p, "<rej", 4) == 0) { is_key = false; EMIT_UNTIL('>', ANSI_CYAN) } 207 215 io_puts(JSON_BRACE, stream); io_putc(*p++, stream); io_puts(ANSI_RESET, stream); 208 216 goto next; 209 217 ··· 212 220 goto next; 213 221 214 222 alpha: 215 - if (memcmp(p, "Object [", 8) == 0) { 216 - io_puts(JSON_TAG, stream); io_puts("Object [", stream); 217 - p += 8; 218 - while (*p && *p != ']') io_putc(*p++, stream); 219 - if (*p == ']') io_putc(*p++, stream); 220 - io_puts(ANSI_RESET, stream); 221 - goto next; 222 - } 223 + if (memcmp(p, "Object [", 8) == 0) { EMIT_UNTIL(']', JSON_TAG) } 224 + if (memcmp(p, "Symbol(", 7) == 0) { EMIT_UNTIL(')', JSON_STRING) } 223 225 224 - if (memcmp(p, "Promise { ", 10) == 0) { 225 - io_puts(JSON_FUNC, stream); io_puts("Promise", stream); 226 - io_puts(JSON_BRACE, stream); io_puts(" { ", stream); 227 - p += 10; 228 - 229 - goto next; 230 - } 226 + EMIT_TYPE("Map", 3, JSON_STRING) 227 + EMIT_TYPE("Set", 3, JSON_STRING) 228 + EMIT_TYPE("ArrayBuffer", 11, JSON_STRING) 231 229 232 230 KEYWORD("true", JSON_BOOL) 233 231 KEYWORD("false", JSON_BOOL)