From f227746c6ebe7f0c7ddb0e5152d52cd41f5a7cdd Mon Sep 17 00:00:00 2001 From: Charlie Gordon Date: Sun, 21 Apr 2024 08:46:17 +0200 Subject: [PATCH] Add util.inspect emulation in REPL (#387) - output values with controlable depth and detail - add `.hidden` and `.depth` directives - remove `eval_mode` - add `use_strict` and `.strict` meta command - add missing closures on global objects - save and load command history to/from `~/.qjs_history` - use USEPROFILE variable on Windows in addition to HOME - use the same style names as util.inspect --- gen/repl.c | Bin 99067 -> 137820 bytes repl.js | 692 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 568 insertions(+), 124 deletions(-) diff --git a/gen/repl.c b/gen/repl.c index 9e5a2a8b314e54d8f15dd0b8d1830732c1325467..5b01bc4d99176941e883984274a904647d4c5324 100644 GIT binary patch literal 137820 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

fOWTe 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 maxStringLength) + a = a.substring(0, maxStringLength) + "..."; + push_token(quote_str(a)); + break; + case "symbol": + push_token(String(a)); + break; + case "object": + case "function": if (a === null) { - std.puts(a); - } else if (stack.indexOf(a) >= 0) { - std.puts("[circular]"); - } else if (a instanceof Date) { - std.puts(`Date ${JSON.stringify(a.toGMTString())}`); - } else if (a instanceof RegExp) { - std.puts(a.toString()); - } else { - stack.push(a); - if (Array.isArray(a)) { - n = a.length; - std.puts("[ "); - for(i = 0; i < n; i++) { - if (i !== 0) - std.puts(", "); - if (i in a) { - print_rec(a[i]); - } else { - std.puts(""); - } - if (i > 20) { - std.puts("..."); - break; - } - } - std.puts(" ]"); - } else { - keys = Object.keys(a); - n = keys.length; - std.puts("{ "); - for(i = 0; i < n; i++) { - if (i !== 0) - std.puts(", "); - key = keys[i]; - std.puts(key, ": "); - print_rec(a[key]); - } - std.puts(" }"); - } - stack.pop(a); + push_token(a); + break; } - } else if (type === "string") { - s = JSON.stringify(a); - if (s.length > 79) - s = s.substring(0, 75) + "...\""; - std.puts(s); - } else if (type === "number") { - std.puts(number_to_string(a, hex_mode ? 16 : 10)); - } else if (type === "bigint") { - std.puts(bigint_to_string(a, hex_mode ? 16 : 10)); - } else if (type === "symbol") { - std.puts(String(a)); - } else if (type === "function") { - std.puts("function " + a.name + "()"); - } else { - std.puts(a); + if ((n = refs.indexOf(a)) >= 0) { + push_token(`[Circular *${n}]`); + break; + } + if ((n = stack.indexOf(a)) >= 0) { + push_token(`[Circular *${refs.length}]`); + refs.push(stack[n]); + break; + } + var obj_index = tokens.length; + var tag = class_tag(a); + stack.push(a); + // XXX: should have Proxy instances + if (a instanceof Date) { + push_token(`Date ${JSON.stringify(a.toGMTString())}`); + } else if (a instanceof RegExp) { + push_token(a.toString()); + } else if (a instanceof Boolean || a instanceof Number || a instanceof BigInt) { + push_token(`[${tag}: ${a}]`); + } else if (a instanceof String) { + push_token(`[${tag}: ${quote_str(a)}]`); + len = a.length; + noindex = 1; + } else if (Array.isArray(a)) { + push_token("["); + isarray = 1; + } else if (tag.includes('Array') && a instanceof Uint8Array.__proto__) { + push_token(`${tag}(${a.length}) [`); + isarray = 1; + } else if (type === 'function') { + if (a.name) + push_token(`[Function: ${a.name}]`); + else + push_token(`[Function (anonymous)]`); + } else { + var cons = (a.constructor && a.constructor.name) || 'Object'; + if (tag !== 'Object') { + push_token(`${cons} [${tag}] {`); + } else if (a.__proto__ === null) { + push_token(`[${cons}: null prototype] {`); + } else if (cons !== 'Object') { + push_token(`${cons} {`); + } else { + push_token("{"); + } + brace = "}"; + } + keys = null; + n = 0; + n0 = 0; + k = 0; + if (isarray) { + brace = "]"; + var len = a.length; + if (level > max_depth && len) { + push_token("..."); + push_token(brace); + return; + } + for (i = 0; i < len; i++) { + k++; + if (i in a) { + print_rec(a[i], level + 1); + } else { + var start = i; + while (i + 1 < len && !((i + 1) in a)) + i++; + if (i > start) + push_token(`<${i - start + 1} empty items>`); + else + push_token(""); + } + if (k >= maxArrayLength && len - k > 5) { + push_token(`... ${len - k} more items`); + break; + } + } + noindex = 1; + /* avoid using Object.keys for large arrays */ + if (i !== len && len > 1000) + nokeys = 1; + } + if (!nokeys) { + keys = show_hidden ? Object.getOwnPropertyNames(a) : Object.keys(a); + n = keys.length; + } + if (noindex) { + /* skip all index properties */ + for (; n0 < n; n0++) { + i = +keys[n0]; + if (i !== (i >>> 0) || i >= len) + break; + } + } + if (n0 < n) { + if (!brace) { + append_token(" {"); + brace = "}"; + } + if (level > max_depth && n0 < n) { + push_token("..."); + push_token(brace); + return; + } + for(i = n0; i < n; i++) { + var key = keys[i]; + var desc = Object.getOwnPropertyDescriptor(a, key); + if (!desc) + continue; + if (!desc.enumerable) + push_token(`[${String(key)}]`); + else + if (+key === (key >>> 0) || key.match(/^[a-zA-Z_$][0-9a-zA-Z_$]*/)) + push_token(key); + else + push_token(quote_str(key)); + push_token(":"); + if ('value' in desc) { + print_rec(desc.value, level + 1); + } else { + var fields = []; + if (desc.get) + fields.push("Getter"); + if (desc.set) + fields.push("Setter"); + push_token(`[${fields.join('/')}]`); + } + k++; + if (k > maxObjectLength && n - k > 5) { + push_token(`... ${n - k} more properties`); + break; + } + } + } + if (brace) + push_token(brace); + stack.pop(a); + if ((i = refs.indexOf(a)) > 0) + tokens[obj_index] = ` ${tokens[obj_index]}`; + break; + default: + push_token(String(a)); + break; + } + }; + function output_str(s, style) { + if (use_colors) { + if (last_style !== style) { + output.push(colors.none); + last_style = style; + } + if (style) { + var color = colors[styles[style]]; + if (color) + output.push(color); + } + } + output.push(s); + } + function output_propname(s) { + if (s[0] >= '0' && s[0] <= '9') + output_str(s, 'number'); + else + output_str(s, 'propname'); + output_str(": "); + } + function output_pretty(s) { + if (!use_colors) { + output_str(s); + return; + } + while (s.length > 0) { + var style = 'none'; + var chunk = s; + var len = 0; + var m = null; + switch (s[0]) { + case '"': + style = 'string'; + m = s.match(/^"([^\\"]|\\.)*"/); + break; + case '\'': + style = 'string'; + m = s.match(/^'([^\\']|\\.)*'/); + break; + case '/': + style = 'regexp'; + break; + case '<': + m = s.match(/^\<[^\>]+\>/); + if (m) + style = 'annotation'; + break; + case '[': + m = s.match(/^\[[^\]]+\]/); + if (m) { + style = 'annotation'; + break; + } + /* fall thru */ + case ']': + case '}': + case ',': + case ' ': + style = 'other'; + len = 1; + break; + case '.': + style = 'annotation'; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + style = 'number'; + m = s.match(/^[0-9a-z_]+[.]?[0-9a-z_]*[eEpP]?[+-]?[0-9]*/); + break; + case '-': + len = 1; + break; + default: + if (is_block(s)) + len = s.length - 1; + if (s.startsWith('Date')) + style = 'date'; + else if (s.startsWith('Symbol')) + style = 'symbol'; + else if (s === 'Infinity' || s === 'NaN') + style = 'keyword'; + else if (s === 'true' || s === 'false') + style = 'boolean'; + else if (s === 'null') + style = 'null'; + else if (s === 'undefined') + style = 'undefined'; + break; + } + if (m) + len = m[0].length; + if (len > 0) + chunk = s.slice(0, len); + output_str(chunk, style); + s = s.slice(chunk.length); } } - print_rec(a); + function is_block(s) { + var c = s[s.length - 1]; + return c === '[' || c === '{'; + } + function block_width(i) { + var w = tokens[i].length; + if (tokens[i + 1] === ":") { + i += 2; + w += 2 + tokens[i].length; + } + var width = w; + if (is_block(tokens[i])) { + var seplen = 1; + while (++i < tokens.length) { + width += seplen; + var s = tokens[i]; + if (s === ']' || s === '}') + break; + [ i, w ] = block_width(i); + width += w; + seplen = 2; + } + } + return [ i, width ]; + } + function output_single(i, last) { + var sep = ""; + while (i <= last) { + var s = tokens[i++]; + if (s === ']' || s === '}') { + if (sep.length > 1) + output_str(" "); + } else { + output_str(sep); + if (tokens[i] === ":") { + output_propname(s); + i++; + s = tokens[i++]; + } + } + output_pretty(s); + sep = is_block(s) ? " " : ", "; + } + } + function output_spaces(s, count) { + if (count > 0) + s += " ".repeat(count); + output_str(s); + } + function output_indent(indent, from) { + var avail_width = breakLength - indent - 2; + var [ last, width ] = block_width(from); + if (width <= avail_width) { + output_single(from, last); + return [ last, width ]; + } + if (tokens[from + 1] === ":") { + output_propname(tokens[from]); + from += 2; + } + output_pretty(tokens[from]); + if (!is_block(tokens[from])) { + return [ from, width ]; + } + indent += 2; + avail_width -= 2; + var sep = ""; + var first = from + 1; + var i, w; + if (tokens[from].endsWith('[')) { + /* array: try multiple columns for indexed values */ + var k = 0, col, cols; + var tab = []; + for (i = first; i < last; i++) { + if (tokens[i][0] === '.' || tokens[i + 1] === ':') + break; + [ i, w ] = block_width(i); + tab[k++] = w; + } + var colwidth; + for (cols = Math.min(avail_width / 3, tab.length, 16); cols > 1; cols--) { + colwidth = []; + col = 0; + for (k = 0; k < tab.length; k++) { + colwidth[col] = Math.max(colwidth[col] || 0, tab[k] + 2); + col = (col + 1) % cols; + } + w = 0; + for (col = 0; col < cols; col++) { + w += colwidth[col]; + } + if (w <= avail_width) + break; + } + if (cols > 1) { + w = 0; + col = cols - 1; + for (i = first; i < last; i++) { + if (tokens[i][0] === '.' || tokens[i + 1] === ':') + break; + w += sep.length; + output_str(sep); + sep = ","; + if (col === cols - 1) { + output_spaces("\n", indent); + col = 0; + } else { + output_spaces("", colwidth[col++] - w); + } + [i, w] = output_indent(indent, i); + } + first = i; + } + } + for (i = first; i < last; i++) { + output_str(sep); + sep = ","; + output_spaces("\n", indent); + [i, w] = output_indent(indent, i); + } + output_spaces("\n", indent -= 2); + output_pretty(tokens[last]); + return [last, breakLength]; + } + print_rec(val, 0); + output_indent(0, 0); + output_str(""); + return output.join(""); + }; + + function print(val) { + std.puts(util.inspect(val, { depth: show_depth, colors: show_colors, showHidden: show_hidden })); + std.puts("\n"); } /* return true if the string was a directive */ function handle_directive(a) { - var pos; if (a === "?") { help(); return true; @@ -1056,16 +1457,19 @@ import * as os from "os"; function help() { var sel = (n) => n ? "*": " "; - std.puts(".help print this help\n" + - ".x " + sel(hex_mode) + "hexadecimal number display\n" + - ".dec " + sel(!hex_mode) + "decimal number display\n" + - ".time " + sel(show_time) + "toggle timing display\n" + - ".color " + sel(show_colors) + "toggle colored output\n" + - ".dark " + sel(styles == themes.dark) + "select dark color theme\n" + - ".light " + sel(styles == themes.light) + "select light color theme\n" + - ".clear clear the terminal\n" + - ".load load source code from a file\n" + - ".quit exit\n"); + std.puts(".help print this help\n" + + ".x " + sel(hex_mode) + "hexadecimal number display\n" + + ".dec " + sel(!hex_mode) + "decimal number display\n" + + ".time " + sel(show_time) + "toggle timing display\n" + + ".strict " + sel(use_strict) + "toggle strict mode evaluation\n" + + `.depth set object depth (current: ${show_depth})\n` + + ".hidden " + sel(show_hidden) + "toggle hidden properties display\n" + + ".color " + sel(show_colors) + "toggle colored output\n" + + ".dark " + sel(styles == themes.dark) + "select dark color theme\n" + + ".light " + sel(styles == themes.light) + "select light color theme\n" + + ".clear clear the terminal\n" + + ".load load source code from a file\n" + + ".quit exit\n"); } function load(s) { @@ -1078,6 +1482,11 @@ import * as os from "os"; } } + function exit(e) { + save_history(); + std.exit(e); + } + function to_bool(s, def) { return s ? "1 true yes Yes".includes(s) : def; } @@ -1088,31 +1497,31 @@ import * as os from "os"; "x": (s) => { hex_mode = to_bool(s, true); }, "dec": (s) => { hex_mode = !to_bool(s, true); }, "time": (s) => { show_time = to_bool(s, !show_time); }, + "strict": (s) => { use_strict = to_bool(s, !use_strict); }, + "depth": (s) => { show_depth = +s || 2; }, + "hidden": (s) => { show_hidden = to_bool(s, !show_hidden); }, "color": (s) => { show_colors = to_bool(s, !show_colors); }, "dark": () => { styles = themes.dark; }, "light": () => { styles = themes.light; }, "clear": () => { std.puts("\x1b[H\x1b[J") }, - "quit": () => { std.exit(0); }, + "quit": () => { exit(0); }, }, null); function eval_and_print(expr) { var result; try { - if (eval_mode === "math") - expr = '"use math"; void 0;' + expr; - var now = (new Date).getTime(); + if (use_strict) + expr = '"use strict"; void 0;' + expr; + var now = Date.now(); /* eval as a script */ result = std.evalScript(expr, { backtrace_barrier: true }); - eval_time = (new Date).getTime() - now; - std.puts(colors[styles.result]); + eval_time = Date.now() - now; print(result); - std.puts("\n"); - std.puts(colors.none); /* set the last result */ g._ = result; } catch (error) { - std.puts(colors[styles.error_msg]); + std.puts(colors[styles.error]); if (error instanceof Error) { console.log(error); if (error.stack) { @@ -1222,7 +1631,7 @@ import * as os from "os"; } function parse_regex() { - style = 'regex'; + style = 'regexp'; push_state('/'); while (i < n) { c = str[i++]; @@ -1260,6 +1669,8 @@ import * as os from "os"; function parse_number() { style = 'number'; + // TODO(chqrlie) parse partial number syntax + // TODO(chqrlie) special case bignum while (i < n && (is_word(str[i]) || (str[i] == '.' && (i == n - 1 || str[i + 1] != '.')))) { i++; } @@ -1285,10 +1696,19 @@ import * as os from "os"; while (i < n && is_word(str[i])) i++; - var w = '|' + str.substring(start, i) + '|'; + var s = str.substring(start, i); + var w = '|' + s + '|'; if (js_keywords.indexOf(w) >= 0) { style = 'keyword'; + if (s === 'true' || s === 'false') + style = 'boolean'; + else if (s === 'true' || s === 'false') + style = 'boolean'; + else if (s === 'null') + style = 'null'; + else if (s === 'undefined') + style = 'undefined'; if (js_no_regex.indexOf(w) >= 0) can_regex = 0; return; @@ -1382,7 +1802,7 @@ import * as os from "os"; can_regex = 0; break; } - if (is_word(c) || c == '$') { + if (is_word(c)) { parse_identifier(); break; } @@ -1396,15 +1816,39 @@ import * as os from "os"; return [ state, level, r ]; } - var m, s = std.getenv("COLORFGBG"); - if (s && (m = s.match(/(\d+);(\d+)/))) { - if (+m[2] !== 0) { // light background - styles = themes.light; + function config_file(s) { + return (std.getenv("HOME") || std.getenv("USERPROFILE") || ".") + "/" + s; + } + function save_history() { + var s = history.slice(-1000).join('\n').trim(); + if (s) { + try { + var f = std.open(config_file(".qjs_history"), "w"); + f.puts(s + '\n'); + f.close(); + } catch (e) { + } + } + } + function load_history() { + var a = std.loadFile(config_file(".qjs_history")); + if (a) { + history = a.trim().split('\n'); + history_index = history.length; + } + } + function load_config() { + var m, s = std.getenv("COLORFGBG"); + if (s && (m = s.match(/(\d+);(\d+)/))) { + if (+m[2] !== 0) { // light background + styles = themes.light; + } } } + load_config(); + load_history(); termInit(); - cmd_start(); })(globalThis);