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 inspector, migrate to prototype

+330 -72
+245
src/modules/io.c
··· 5 5 #include <string.h> 6 6 #include <stdbool.h> 7 7 #include <ctype.h> 8 + #include <inttypes.h> 8 9 #include <uv.h> 9 10 11 + #include "common.h" 12 + #include "internal.h" 10 13 #include "runtime.h" 11 14 #include "modules/io.h" 12 15 #include "modules/symbol.h" ··· 30 33 #define JSON_REF "\x1b[90m" 31 34 #define JSON_WHITE "\x1b[97m" 32 35 36 + typedef struct { 37 + jsoff_t *visited; 38 + int count; 39 + int capacity; 40 + } inspect_visited_t; 41 + 33 42 static void io_putc(int c, FILE *stream) { fputc(c, stream); } 34 43 static void io_puts(const char *s, FILE *stream) { fputs(s, stream); } 44 + static void inspect_object_full(struct js *js, jsval_t obj, FILE *stream, int depth, inspect_visited_t *visited); 35 45 36 46 static void io_print(const char *str, FILE *stream) { 37 47 if (!io_no_color) { ··· 410 420 return js_mkundef(); 411 421 } 412 422 423 + static const char *get_slot_name(internal_slot_t slot) { 424 + static const char *slot_names[] = { 425 + [SLOT_NONE] = "NONE", 426 + [SLOT_PID] = "PID", 427 + [SLOT_ASYNC] = "ASYNC", 428 + [SLOT_WITH] = "WITH", 429 + [SLOT_SCOPE] = "SCOPE", 430 + [SLOT_THIS] = "THIS", 431 + [SLOT_BOUND_THIS] = "BOUND_THIS", 432 + [SLOT_BOUND_ARGS] = "BOUND_ARGS", 433 + [SLOT_FIELD_COUNT] = "FIELD_COUNT", 434 + [SLOT_SOURCE] = "SOURCE", 435 + [SLOT_FIELDS] = "FIELDS", 436 + [SLOT_STRICT] = "STRICT", 437 + [SLOT_CODE] = "CODE", 438 + [SLOT_CODE_LEN] = "CODE_LEN", 439 + [SLOT_CFUNC] = "CFUNC", 440 + [SLOT_CORO] = "CORO", 441 + [SLOT_ARROW] = "ARROW", 442 + [SLOT_PROTO] = "PROTO", 443 + [SLOT_FUNC_PROTO] = "FUNC_PROTO", 444 + [SLOT_ASYNC_PROTO] = "ASYNC_PROTO", 445 + [SLOT_FROZEN] = "FROZEN", 446 + [SLOT_SEALED] = "SEALED", 447 + [SLOT_EXTENSIBLE] = "EXTENSIBLE", 448 + [SLOT_BUFFER] = "BUFFER", 449 + [SLOT_TARGET_FUNC] = "TARGET_FUNC", 450 + [SLOT_NAME] = "NAME", 451 + [SLOT_MAP] = "MAP", 452 + [SLOT_SET] = "SET", 453 + [SLOT_PRIMITIVE] = "PRIMITIVE", 454 + [SLOT_PROXY_REF] = "PROXY_REF", 455 + [SLOT_BUILTIN] = "BUILTIN", 456 + [SLOT_DATA] = "DATA", 457 + [SLOT_CTOR] = "CTOR", 458 + [SLOT_SUPER] = "SUPER", 459 + [SLOT_DEFAULT_CTOR] = "DEFAULT_CTOR", 460 + [SLOT_DEFAULT] = "DEFAULT", 461 + [SLOT_ERR_TYPE] = "ERR_TYPE", 462 + [SLOT_OBSERVABLE_SUBSCRIBER] = "OBSERVABLE_SUBSCRIBER", 463 + [SLOT_SUBSCRIPTION_OBSERVER] = "SUBSCRIPTION_OBSERVER", 464 + [SLOT_SUBSCRIPTION_CLEANUP] = "SUBSCRIPTION_CLEANUP", 465 + [SLOT_HOISTED_VARS] = "HOISTED_VARS", 466 + [SLOT_HOISTED_VARS_LEN] = "HOISTED_VARS_LEN", 467 + [SLOT_STRICT_EVAL_SCOPE] = "STRICT_EVAL_SCOPE", 468 + [SLOT_MODULE_SCOPE] = "MODULE_SCOPE", 469 + [SLOT_STRICT_ARGS] = "STRICT_ARGS", 470 + [SLOT_NO_FUNC_DECLS] = "NO_FUNC_DECLS", 471 + }; 472 + 473 + if (slot < sizeof(slot_names) / sizeof(slot_names[0]) && slot_names[slot]) { 474 + return slot_names[slot]; 475 + } 476 + return "UNKNOWN"; 477 + } 478 + 479 + static const char *get_type_name(int type) { 480 + static const char *type_names[] = { 481 + [T_OBJ] = "object", 482 + [T_PROP] = "property", 483 + [T_STR] = "string", 484 + [T_UNDEF] = "undefined", 485 + [T_NULL] = "null", 486 + [T_NUM] = "number", 487 + [T_BOOL] = "boolean", 488 + [T_FUNC] = "function", 489 + [T_CODEREF] = "coderef", 490 + [T_CFUNC] = "function", 491 + [T_ERR] = "error", 492 + [T_ARR] = "array", 493 + [T_PROMISE] = "Promise", 494 + [T_TYPEDARRAY] = "TypedArray", 495 + [T_BIGINT] = "bigint", 496 + [T_PROPREF] = "propref", 497 + [T_SYMBOL] = "symbol", 498 + [T_GENERATOR] = "Generator", 499 + [T_FFI] = "ffi" 500 + }; 501 + 502 + size_t num_types = sizeof(type_names) / sizeof(type_names[0]); 503 + if (type < 0 || (size_t)type >= num_types) return "unknown"; 504 + 505 + return type_names[type] ? type_names[type] : "unknown"; 506 + } 507 + 508 + static bool inspect_was_visited(inspect_visited_t *v, jsoff_t off) { 509 + for (int i = 0; i < v->count; i++) if (v->visited[i] == off) return true; 510 + return false; 511 + } 512 + 513 + static void inspect_print_indent(FILE *stream, int depth) { 514 + for (int i = 0; i < depth; i++) fprintf(stream, " "); 515 + } 516 + 517 + static void inspect_mark_visited(inspect_visited_t *v, jsoff_t off) { 518 + if (v->count >= v->capacity) { 519 + v->capacity = v->capacity ? v->capacity * 2 : 32; 520 + v->visited = realloc(v->visited, v->capacity * sizeof(jsoff_t)); 521 + } 522 + v->visited[v->count++] = off; 523 + } 524 + 525 + static void inspect_value(struct js *js, jsval_t val, FILE *stream, int depth, inspect_visited_t *visited) { 526 + int t = js_type(val); 527 + 528 + if (t == T_UNDEF) { fprintf(stream, "undefined"); return; } 529 + if (t == T_NULL) { fprintf(stream, "null"); return; } 530 + if (t == T_BOOL) { fprintf(stream, js_getbool(val) ? "true" : "false"); return; } 531 + if (t == T_NUM) { fprintf(stream, "%g", js_getnum(val)); return; } 532 + if (t == T_ERR) { fprintf(stream, "[Error]"); return; } 533 + 534 + if (t == T_STR) { 535 + size_t len; 536 + char *str = js_getstr(js, val, &len); 537 + fprintf(stream, "\"%.*s\"", (int)len, str ? str : ""); 538 + return; 539 + } 540 + 541 + if (t == T_SYMBOL) { 542 + const char *desc = js_sym_desc(js, val); 543 + fprintf(stream, "Symbol(%s)", desc ? desc : ""); 544 + return; 545 + } 546 + 547 + if (t == T_OBJ || t == T_FUNC || t == T_PROMISE || t == T_ARR) { 548 + if (depth > 10) fprintf(stream, "<%s @%" PRIu64 " ...>", get_type_name(t), (uint64_t)vdata(val)); 549 + else inspect_object_full(js, val, stream, depth, visited); 550 + return; 551 + } 552 + 553 + fprintf(stream, "<%s rawtype=%d data=%" PRIu64 ">", get_type_name(t), vtype(val), (uint64_t)vdata(val)); 554 + } 555 + 556 + static void inspect_object_full(struct js *js, jsval_t obj, FILE *stream, int depth, inspect_visited_t *visited) { 557 + int type = js_type(obj); 558 + jsoff_t obj_off = (jsoff_t)vdata(obj); 559 + 560 + if (inspect_was_visited(visited, obj_off)) { 561 + fprintf(stream, "[Circular *%u]", obj_off); 562 + return; 563 + } 564 + 565 + inspect_mark_visited(visited, obj_off); 566 + fprintf(stream, "<%s @%u> {\n", type == JS_FUNC ? "Function" : (type == JS_PROMISE ? "Promise" : "Object"), obj_off); 567 + 568 + int inner_depth = depth + 1; 569 + 570 + inspect_print_indent(stream, inner_depth); 571 + fprintf(stream, "[[Slots]]: {\n"); 572 + 573 + for (int slot = SLOT_NONE + 1; slot < SLOT_MAX; slot++) { 574 + jsval_t slot_val = js_get_slot(js, obj, (internal_slot_t)slot); 575 + int t = js_type(slot_val); 576 + if (t == T_UNDEF) continue; 577 + 578 + inspect_print_indent(stream, inner_depth + 1); 579 + fprintf(stream, "[[%s]]: ", get_slot_name((internal_slot_t)slot)); 580 + 581 + switch (slot) { 582 + case SLOT_CODE: 583 + case SLOT_CFUNC: 584 + case SLOT_HOISTED_VARS: 585 + fprintf(stream, "<native ptr 0x%" PRIx64 ">", (uint64_t)vdata(slot_val)); 586 + break; 587 + case SLOT_CODE_LEN: 588 + case SLOT_HOISTED_VARS_LEN: 589 + fprintf(stream, "%.0f", js_getnum(slot_val)); 590 + break; 591 + default: 592 + if ((t == T_OBJ || t == T_FUNC || t == T_PROMISE) && inspect_was_visited(visited, (jsoff_t)vdata(slot_val))) 593 + fprintf(stream, "[Circular *%u]", (jsoff_t)vdata(slot_val)); 594 + else if (t == T_OBJ || t == T_FUNC || t == T_PROMISE) 595 + fprintf(stream, "<%s @%u>", get_type_name(t), (jsoff_t)vdata(slot_val)); 596 + else 597 + inspect_value(js, slot_val, stream, inner_depth + 1, visited); 598 + break; 599 + } 600 + 601 + fprintf(stream, "\n"); 602 + } 603 + 604 + inspect_print_indent(stream, inner_depth); 605 + fprintf(stream, "}\n"); 606 + 607 + inspect_print_indent(stream, inner_depth); 608 + fprintf(stream, "[[Properties]]: {\n"); 609 + 610 + ant_iter_t iter = js_prop_iter_begin(js, obj); 611 + const char *key; 612 + size_t key_len; 613 + jsval_t value; 614 + 615 + while (js_prop_iter_next(&iter, &key, &key_len, &value)) { 616 + inspect_print_indent(stream, inner_depth + 1); 617 + fprintf(stream, "\"%.*s\": ", (int)key_len, key); 618 + inspect_value(js, value, stream, inner_depth + 1, visited); 619 + fprintf(stream, "\n"); 620 + } 621 + 622 + js_prop_iter_end(&iter); 623 + inspect_print_indent(stream, inner_depth); 624 + fprintf(stream, "}\n"); 625 + 626 + jsval_t proto = js_get_proto(js, obj); 627 + inspect_print_indent(stream, inner_depth); 628 + fprintf(stream, "[[Prototype]]: "); 629 + if (js_type(proto) == JS_NULL) { 630 + fprintf(stream, "null\n"); 631 + } else { 632 + fprintf(stream, "\n"); 633 + inspect_print_indent(stream, inner_depth); 634 + inspect_value(js, proto, stream, inner_depth, visited); 635 + fprintf(stream, "\n"); 636 + } 637 + 638 + inspect_print_indent(stream, depth); 639 + fprintf(stream, "}"); 640 + } 641 + 642 + static jsval_t js_console_inspect(struct js *js, jsval_t *args, int nargs) { 643 + FILE *stream = stdout; 644 + inspect_visited_t visited = {0}; 645 + 646 + for (int i = 0; i < nargs; i++) { 647 + if (i > 0) fprintf(stream, " "); 648 + inspect_value(js, args[i], stream, 0, &visited); 649 + } 650 + 651 + fprintf(stream, "\n"); 652 + if (visited.visited) free(visited.visited); 653 + 654 + return js_mkundef(); 655 + } 656 + 413 657 void init_console_module() { 414 658 struct js *js = rt->js; 415 659 jsval_t console_obj = js_mkobj(js); ··· 424 668 js_set(js, console_obj, "time", js_mkfun(js_console_time)); 425 669 js_set(js, console_obj, "timeEnd", js_mkfun(js_console_timeEnd)); 426 670 js_set(js, console_obj, "clear", js_mkfun(js_console_clear)); 671 + js_set(js, console_obj, "inspect", js_mkfun(js_console_inspect)); 427 672 428 673 js_set(js, console_obj, get_toStringTag_sym_key(), js_mkstr(js, "console", 7)); 429 674 js_set(js, js_glob(js), "console", console_obj);
+85 -72
src/modules/process.c
··· 1182 1182 1183 1183 void init_process_module() { 1184 1184 ant_t *js = rt->js; 1185 + jsval_t global = js_glob(js); 1185 1186 1186 1187 process_start_time = uv_hrtime(); 1188 + jsval_t process_proto = js_mkobj(js); 1189 + 1190 + js_set(js, process_proto, "exit", js_mkfun(process_exit)); 1191 + js_set(js, process_proto, "on", js_mkfun(process_on)); 1192 + js_set(js, process_proto, "addListener", js_mkfun(process_on)); 1193 + js_set(js, process_proto, "once", js_mkfun(process_once)); 1194 + js_set(js, process_proto, "off", js_mkfun(process_off)); 1195 + js_set(js, process_proto, "removeListener", js_mkfun(process_off)); 1196 + js_set(js, process_proto, "removeAllListeners", js_mkfun(process_remove_all_listeners)); 1197 + js_set(js, process_proto, "emit", js_mkfun(process_emit)); 1198 + js_set(js, process_proto, "listenerCount", js_mkfun(process_listener_count)); 1199 + js_set(js, process_proto, "setMaxListeners", js_mkfun(process_set_max_listeners)); 1200 + js_set(js, process_proto, "getMaxListeners", js_mkfun(process_get_max_listeners)); 1201 + js_set(js, process_proto, "cwd", js_mkfun(process_cwd)); 1202 + js_set(js, process_proto, "chdir", js_mkfun(process_chdir)); 1203 + js_set(js, process_proto, "uptime", js_mkfun(process_uptime)); 1204 + js_set(js, process_proto, "cpuUsage", js_mkfun(process_cpu_usage)); 1205 + js_set(js, process_proto, "kill", js_mkfun(process_kill)); 1206 + js_set(js, process_proto, "abort", js_mkfun(process_abort)); 1207 + js_set(js, process_proto, "umask", js_mkfun(process_umask)); 1208 + 1209 + jsval_t mem_usage_fn = js_heavy_mkfun(js, process_memory_usage, js_mkundef()); 1210 + js_set(js, mem_usage_fn, "rss", js_mkfun(process_memory_usage_rss)); 1211 + js_set(js, process_proto, "memoryUsage", mem_usage_fn); 1212 + 1213 + jsval_t hrtime_fn = js_heavy_mkfun(js, process_hrtime, js_mkundef()); 1214 + js_set(js, hrtime_fn, "bigint", js_mkfun(process_hrtime_bigint)); 1215 + js_set(js, process_proto, "hrtime", hrtime_fn); 1216 + 1217 + #ifndef _WIN32 1218 + js_set(js, process_proto, "getuid", js_mkfun(process_getuid)); 1219 + js_set(js, process_proto, "geteuid", js_mkfun(process_geteuid)); 1220 + js_set(js, process_proto, "getgid", js_mkfun(process_getgid)); 1221 + js_set(js, process_proto, "getegid", js_mkfun(process_getegid)); 1222 + js_set(js, process_proto, "getgroups", js_mkfun(process_getgroups)); 1223 + js_set(js, process_proto, "setuid", js_mkfun(process_setuid)); 1224 + js_set(js, process_proto, "setgid", js_mkfun(process_setgid)); 1225 + js_set(js, process_proto, "seteuid", js_mkfun(process_seteuid)); 1226 + js_set(js, process_proto, "setegid", js_mkfun(process_setegid)); 1227 + js_set(js, process_proto, "setgroups", js_mkfun(process_setgroups)); 1228 + js_set(js, process_proto, "initgroups", js_mkfun(process_initgroups)); 1229 + #endif 1230 + 1231 + js_set(js, process_proto, get_toStringTag_sym_key(), js_mkstr(js, "process", 7)); 1187 1232 1188 1233 jsval_t process_obj = js_mkobj(js); 1234 + js_set_proto(js, process_obj, process_proto); 1235 + 1189 1236 jsval_t env_obj = js_mkobj(js); 1190 - jsval_t argv_arr = js_mkarr(js); 1191 - 1237 + load_dotenv_file(js, env_obj); 1238 + js_set_getter(js, env_obj, env_getter); 1239 + js_set(js, env_obj, "toObject", js_mkfun(env_to_object)); 1192 1240 js_set(js, process_obj, "env", env_obj); 1193 - js_set(js, process_obj, "exit", js_mkfun(process_exit)); 1194 1241 1195 - js_set(js, process_obj, "on", js_mkfun(process_on)); 1196 - js_set(js, process_obj, "addListener", js_mkfun(process_on)); 1197 - js_set(js, process_obj, "once", js_mkfun(process_once)); 1198 - js_set(js, process_obj, "off", js_mkfun(process_off)); 1199 - js_set(js, process_obj, "removeListener", js_mkfun(process_off)); 1200 - js_set(js, process_obj, "removeAllListeners", js_mkfun(process_remove_all_listeners)); 1201 - js_set(js, process_obj, "emit", js_mkfun(process_emit)); 1202 - js_set(js, process_obj, "listenerCount", js_mkfun(process_listener_count)); 1203 - js_set(js, process_obj, "setMaxListeners", js_mkfun(process_set_max_listeners)); 1204 - js_set(js, process_obj, "getMaxListeners", js_mkfun(process_get_max_listeners)); 1242 + jsval_t argv_arr = js_mkarr(js); 1243 + for (int i = 0; i < rt->argc; i++) { 1244 + js_arr_push(js, argv_arr, js_mkstr(js, rt->argv[i], strlen(rt->argv[i]))); 1245 + } 1246 + 1247 + js_set(js, process_obj, "argv", argv_arr); 1248 + js_set(js, process_obj, "execArgv", js_mkarr(js)); 1249 + js_set(js, process_obj, "argv0", rt->argc > 0 ? js_mkstr(js, rt->argv[0], strlen(rt->argv[0])) : js_mkstr(js, "ant", 3)); 1250 + js_set(js, process_obj, "execPath", rt->argc > 0 ? js_mkstr(js, rt->argv[0], strlen(rt->argv[0])) : js_mkundef()); 1205 1251 1206 1252 js_set(js, process_obj, "pid", js_mknum((double)getpid())); 1207 1253 js_set(js, process_obj, "ppid", js_mknum((double)getppid())); ··· 1247 1293 js_set(js, process_obj, "arch", js_mkstr(js, "unknown", 7)); 1248 1294 #endif 1249 1295 1250 - load_dotenv_file(js, env_obj); 1251 - js_set_getter(js, env_obj, env_getter); 1252 - js_set(js, env_obj, "toObject", js_mkfun(env_to_object)); 1253 - 1254 - for (int i = 0; i < rt->argc; i++) { 1255 - js_arr_push(js, argv_arr, js_mkstr(js, rt->argv[i], strlen(rt->argv[i]))); 1256 - } 1257 - 1258 - js_set(js, process_obj, "argv", argv_arr); 1259 - js_set(js, process_obj, "execArgv", js_mkarr(js)); 1260 - js_set(js, process_obj, "cwd", js_mkfun(process_cwd)); 1261 - js_set(js, process_obj, "chdir", js_mkfun(process_chdir)); 1262 - 1263 - js_set(js, process_obj, "argv0", rt->argc > 0 ? js_mkstr(js, rt->argv[0], strlen(rt->argv[0])) : js_mkstr(js, "ant", 3)); 1264 - js_set(js, process_obj, "execPath", rt->argc > 0 ? js_mkstr(js, rt->argv[0], strlen(rt->argv[0])) : js_mkundef()); 1265 - 1266 - js_set(js, process_obj, "uptime", js_mkfun(process_uptime)); 1267 - jsval_t mem_usage_fn = js_heavy_mkfun(js, process_memory_usage, js_mkundef()); 1268 - js_set(js, mem_usage_fn, "rss", js_mkfun(process_memory_usage_rss)); 1269 - js_set(js, process_obj, "memoryUsage", mem_usage_fn); 1270 - js_set(js, process_obj, "cpuUsage", js_mkfun(process_cpu_usage)); 1271 - 1272 - jsval_t hrtime_fn = js_heavy_mkfun(js, process_hrtime, js_mkundef()); 1273 - js_set(js, hrtime_fn, "bigint", js_mkfun(process_hrtime_bigint)); 1274 - js_set(js, process_obj, "hrtime", hrtime_fn); 1275 - 1276 - js_set(js, process_obj, "kill", js_mkfun(process_kill)); 1277 - js_set(js, process_obj, "abort", js_mkfun(process_abort)); 1278 - js_set(js, process_obj, "umask", js_mkfun(process_umask)); 1279 - 1280 - #ifndef _WIN32 1281 - js_set(js, process_obj, "getuid", js_mkfun(process_getuid)); 1282 - js_set(js, process_obj, "geteuid", js_mkfun(process_geteuid)); 1283 - js_set(js, process_obj, "getgid", js_mkfun(process_getgid)); 1284 - js_set(js, process_obj, "getegid", js_mkfun(process_getegid)); 1285 - js_set(js, process_obj, "getgroups", js_mkfun(process_getgroups)); 1286 - js_set(js, process_obj, "setuid", js_mkfun(process_setuid)); 1287 - js_set(js, process_obj, "setgid", js_mkfun(process_setgid)); 1288 - js_set(js, process_obj, "seteuid", js_mkfun(process_seteuid)); 1289 - js_set(js, process_obj, "setegid", js_mkfun(process_setegid)); 1290 - js_set(js, process_obj, "setgroups", js_mkfun(process_setgroups)); 1291 - js_set(js, process_obj, "initgroups", js_mkfun(process_initgroups)); 1292 - #endif 1296 + jsval_t stdin_proto = js_mkobj(js); 1297 + js_set(js, stdin_proto, "setRawMode", js_mkfun(js_stdin_set_raw_mode)); 1298 + js_set(js, stdin_proto, "resume", js_mkfun(js_stdin_resume)); 1299 + js_set(js, stdin_proto, "pause", js_mkfun(js_stdin_pause)); 1300 + js_set(js, stdin_proto, "on", js_mkfun(js_stdin_on)); 1301 + js_set(js, stdin_proto, "removeAllListeners", js_mkfun(js_stdin_remove_all_listeners)); 1302 + js_set(js, stdin_proto, get_toStringTag_sym_key(), js_mkstr(js, "ReadStream", 10)); 1293 1303 1294 1304 jsval_t stdin_obj = js_mkobj(js); 1305 + js_set_proto(js, stdin_obj, stdin_proto); 1295 1306 js_set(js, stdin_obj, "isTTY", stdin_is_tty() ? js_mktrue() : js_mkfalse()); 1296 - js_set(js, stdin_obj, "setRawMode", js_mkfun(js_stdin_set_raw_mode)); 1297 - js_set(js, stdin_obj, "resume", js_mkfun(js_stdin_resume)); 1298 - js_set(js, stdin_obj, "pause", js_mkfun(js_stdin_pause)); 1299 - js_set(js, stdin_obj, "on", js_mkfun(js_stdin_on)); 1300 - js_set(js, stdin_obj, "removeAllListeners", js_mkfun(js_stdin_remove_all_listeners)); 1301 1307 js_set(js, process_obj, "stdin", stdin_obj); 1302 1308 1309 + jsval_t stdout_proto = js_mkobj(js); 1310 + js_set(js, stdout_proto, "write", js_mkfun(js_stdout_write)); 1311 + js_set(js, stdout_proto, "on", js_mkfun(js_stdout_on)); 1312 + js_set(js, stdout_proto, "once", js_mkfun(js_stdout_once)); 1313 + js_set(js, stdout_proto, "removeAllListeners", js_mkfun(js_stdout_remove_all_listeners)); 1314 + js_set(js, stdout_proto, "getWindowSize", js_mkfun(js_stdout_get_window_size)); 1315 + js_set(js, stdout_proto, get_toStringTag_sym_key(), js_mkstr(js, "WriteStream", 11)); 1316 + 1303 1317 jsval_t stdout_obj = js_mkobj(js); 1318 + js_set_proto(js, stdout_obj, stdout_proto); 1304 1319 js_set(js, stdout_obj, "isTTY", stdout_is_tty() ? js_mktrue() : js_mkfalse()); 1305 - js_set(js, stdout_obj, "write", js_mkfun(js_stdout_write)); 1306 - js_set(js, stdout_obj, "on", js_mkfun(js_stdout_on)); 1307 - js_set(js, stdout_obj, "once", js_mkfun(js_stdout_once)); 1308 - js_set(js, stdout_obj, "removeAllListeners", js_mkfun(js_stdout_remove_all_listeners)); 1309 - js_set(js, stdout_obj, "getWindowSize", js_mkfun(js_stdout_get_window_size)); 1310 1320 js_set_getter_desc(js, stdout_obj, "rows", 4, js_mkfun(js_stdout_rows_getter), JS_DESC_E | JS_DESC_C); 1311 1321 js_set_getter_desc(js, stdout_obj, "columns", 7, js_mkfun(js_stdout_columns_getter), JS_DESC_E | JS_DESC_C); 1312 1322 js_set(js, process_obj, "stdout", stdout_obj); 1313 1323 1324 + jsval_t stderr_proto = js_mkobj(js); 1325 + js_set(js, stderr_proto, "write", js_mkfun(js_stderr_write)); 1326 + js_set(js, stderr_proto, "on", js_mkfun(js_stderr_on)); 1327 + js_set(js, stderr_proto, "once", js_mkfun(js_stderr_once)); 1328 + js_set(js, stderr_proto, "removeAllListeners", js_mkfun(js_stderr_remove_all_listeners)); 1329 + js_set(js, stderr_proto, get_toStringTag_sym_key(), js_mkstr(js, "WriteStream", 11)); 1330 + 1314 1331 jsval_t stderr_obj = js_mkobj(js); 1332 + js_set_proto(js, stderr_obj, stderr_proto); 1315 1333 js_set(js, stderr_obj, "isTTY", stderr_is_tty() ? js_mktrue() : js_mkfalse()); 1316 - js_set(js, stderr_obj, "write", js_mkfun(js_stderr_write)); 1317 - js_set(js, stderr_obj, "on", js_mkfun(js_stderr_on)); 1318 - js_set(js, stderr_obj, "once", js_mkfun(js_stderr_once)); 1319 - js_set(js, stderr_obj, "removeAllListeners", js_mkfun(js_stderr_remove_all_listeners)); 1320 1334 js_set(js, process_obj, "stderr", stderr_obj); 1321 1335 1322 - js_set(js, process_obj, get_toStringTag_sym_key(), js_mkstr(js, "process", 7)); 1323 - js_set(js, js_glob(js), "process", process_obj); 1336 + js_set(js, global, "process", process_obj); 1324 1337 } 1325 1338 1326 1339 #define GC_FWD_EVENTS(events) do { \