From 6c0698b551560f6bfe130607a2b031c4c8fe5424 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Wed, 20 Sep 2023 21:48:41 -0700 Subject: [PATCH] Shell: introduced error, info and warn methods for console object. --- external/njs_shell.c | 74 ++++++++++++++++++++++++++++++++++---------- test/shell_test.exp | 22 ++++++++----- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/external/njs_shell.c b/external/njs_shell.c index 97c92d8f..9fc86d6b 100644 --- a/external/njs_shell.c +++ b/external/njs_shell.c @@ -122,7 +122,7 @@ static char *njs_completion_generator(const char *text, int state); #endif static njs_int_t njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, - njs_uint_t nargs, njs_index_t indent, njs_value_t *retval); + njs_uint_t nargs, njs_index_t magic, njs_value_t *retval); static njs_int_t njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); static njs_int_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, @@ -156,7 +156,33 @@ static njs_external_t njs_ext_console[] = { .enumerable = 1, .u.method = { .native = njs_ext_console_log, - .magic8 = 1, +#define NJS_LOG_DUMP 16 +#define NJS_LOG_MASK 15 + .magic8 = NJS_LOG_LEVEL_INFO | NJS_LOG_DUMP, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("error"), + .writable = 1, + .configurable = 1, + .enumerable = 1, + .u.method = { + .native = njs_ext_console_log, + .magic8 = NJS_LOG_LEVEL_ERROR, + } + }, + + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("info"), + .writable = 1, + .configurable = 1, + .enumerable = 1, + .u.method = { + .native = njs_ext_console_log, + .magic8 = NJS_LOG_LEVEL_INFO, } }, @@ -168,6 +194,7 @@ static njs_external_t njs_ext_console[] = { .enumerable = 1, .u.method = { .native = njs_ext_console_log, + .magic8 = NJS_LOG_LEVEL_INFO, } }, @@ -201,6 +228,18 @@ static njs_external_t njs_ext_console[] = { } }, + { + .flags = NJS_EXTERN_METHOD, + .name.string = njs_str("warn"), + .writable = 1, + .configurable = 1, + .enumerable = 1, + .u.method = { + .native = njs_ext_console_log, + .magic8 = NJS_LOG_LEVEL_WARN, + } + }, + }; @@ -1337,30 +1376,28 @@ next: static njs_int_t njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, - njs_index_t indent, njs_value_t *retval) + njs_index_t magic, njs_value_t *retval) { - njs_str_t msg; - njs_uint_t n; + njs_str_t msg; + njs_uint_t n; + njs_log_level_t level; n = 1; + level = (njs_log_level_t) magic & NJS_LOG_MASK; while (n < nargs) { - if (njs_vm_value_dump(vm, &msg, njs_argument(args, n), 1, indent) + if (njs_vm_value_dump(vm, &msg, njs_argument(args, n), 1, + !!(magic & NJS_LOG_DUMP)) == NJS_ERROR) { return NJS_ERROR; } - njs_vm_log(vm, "%s", (n != 1) ? " " : ""); - njs_vm_log(vm, "%*s", msg.length, msg.start); + njs_vm_logger(vm, level, "%*s\n", msg.length, msg.start); n++; } - if (nargs > 1) { - njs_vm_log(vm, "\n"); - } - njs_value_undefined_set(retval); return NJS_OK; @@ -1604,11 +1641,16 @@ static void njs_console_log(njs_vm_t *vm, njs_external_ptr_t external, njs_log_level_t level, const u_char *start, size_t length) { - if (level == NJS_LOG_LEVEL_ERROR) { - njs_stderror("%*s", length, start); - - } else { + switch (level) { + case NJS_LOG_LEVEL_INFO: njs_printf("%*s", length, start); + break; + case NJS_LOG_LEVEL_WARN: + njs_printf("W: %*s", length, start); + break; + case NJS_LOG_LEVEL_ERROR: + njs_printf("E: %*s", length, start); + break; } } diff --git a/test/shell_test.exp b/test/shell_test.exp index 4afc10b8..e889eea4 100644 --- a/test/shell_test.exp +++ b/test/shell_test.exp @@ -252,9 +252,9 @@ njs_test { {"console.log(1)\r\n" "console.log(1)\r\n1\r\nundefined\r\n>> "} {"console.log(1, 'a')\r\n" - "console.log(1, 'a')\r\n1 a\r\nundefined\r\n>> "} + "console.log(1, 'a')\r\n1\r\na\r\nundefined\r\n>> "} {"print(1, 'a')\r\n" - "print(1, 'a')\r\n1 a\r\nundefined\r\n>> "} + "print(1, 'a')\r\n1\r\na\r\nundefined\r\n>> "} {"console.log('\\tабв\\nгд')\r\n" "console.log('\\\\tабв\\\\nгд')\r\n\tабв\r\nгд\r\nundefined\r\n>> "} {"console.dump()\r\n" @@ -262,7 +262,13 @@ njs_test { {"console.dump(1)\r\n" "console.dump(1)\r\n1\r\nundefined\r\n>> "} {"console.dump(1, 'a')\r\n" - "console.dump(1, 'a')\r\n1 a\r\nundefined\r\n>> "} + "console.dump(1, 'a')\r\n1\r\na\r\nundefined\r\n>> "} + {"console.error(42)\r\n" + "console.error(42)\r\nE: 42\r\nundefined\r\n>> "} + {"console.info(23)\r\n" + "console.info(23)\r\n23\r\nundefined\r\n>> "} + {"console.warn(37)\r\n" + "console.warn(37)\r\nW: 37\r\nundefined\r\n>> "} } # console.time* functions @@ -307,9 +313,9 @@ njs_test { njs_test { {"var print = console.log.bind(console); print(1, 'a', [1, 2])\r\n" - "1 a \\\[1,2]\r\nundefined\r\n>> "} + "1\r\na\r\n\\\[1,2]\r\nundefined\r\n>> "} {"var print = console.dump.bind(console); print(1, 'a', [1, 2])\r\n" - "1 a \\\[\r\n 1,\r\n 2\r\n]\r\nundefined\r\n>> "} + "1\r\na\r\n\\\[\r\n 1,\r\n 2\r\n]\r\nundefined\r\n>> "} {"var print = console.log.bind(console); print(console.a.a)\r\n" "TypeError: cannot get property \"a\" of undefined"} {"print(console.a.a)\r\n" @@ -318,8 +324,8 @@ njs_test { # Backtraces for external objects njs_test { - {"console.log(console.a.a)\r\n" - "console.log(console.a.a)\r\nThrown:\r\nTypeError:*at console.log (native)"} + {"console.info(console.a.a)\r\n" + "console.info(console.a.a)\r\nThrown:\r\nTypeError:*at console.info (native)"} } # dumper @@ -400,7 +406,7 @@ njs_test { njs_test { {"var t = setImmediate(console.log, 'a', 'aa')\r\n" - "undefined\r\na aa"} + "undefined\r\na\r\naa"} } njs_test { -- 2.47.3