From: Dmitry Volyntsev Date: Tue, 26 Nov 2019 12:11:40 +0000 (+0300) Subject: Interactive shell: introduced global print() alias to console.log(). X-Git-Tag: 0.3.8~49 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=57cadf37ee2668635e1963d839b4318b568010b6;p=njs.git Interactive shell: introduced global print() alias to console.log(). --- diff --git a/src/njs_extern.c b/src/njs_extern.c index 793541b8..d8b79d2d 100644 --- a/src/njs_extern.c +++ b/src/njs_extern.c @@ -181,10 +181,15 @@ njs_vm_external_create(njs_vm_t *vm, njs_value_t *ext_val, memcpy(obj, &object, sizeof(void *)); - ext_val->type = NJS_EXTERNAL; - ext_val->data.truth = 1; - ext_val->external.proto = proto; - ext_val->external.index = vm->external_objects->items - 1; + if (proto->type != NJS_EXTERN_METHOD) { + ext_val->type = NJS_EXTERNAL; + ext_val->data.truth = 1; + ext_val->external.proto = proto; + ext_val->external.index = vm->external_objects->items - 1; + + } else { + njs_set_function(ext_val, proto->function); + } return NJS_OK; } diff --git a/src/njs_shell.c b/src/njs_shell.c index da1f3c16..f3b8067a 100644 --- a/src/njs_shell.c +++ b/src/njs_shell.c @@ -604,17 +604,16 @@ njs_console_init(njs_vm_t *vm, njs_console_t *console) static njs_int_t -njs_externals_init(njs_vm_t *vm, njs_console_t *console) +njs_externals_add(njs_vm_t *vm, njs_external_t *definition, + const njs_str_t *name, njs_external_ptr_t object) { - njs_uint_t ret; + njs_int_t ret; njs_value_t *value; const njs_extern_t *proto; - static const njs_str_t name = njs_str("console"); - - proto = njs_vm_external_prototype(vm, &njs_externals[0]); + proto = njs_vm_external_prototype(vm, definition); if (njs_slow_path(proto == NULL)) { - njs_stderror("failed to add console proto\n"); + njs_stderror("failed to add \"%V\" proto\n", name); return NJS_ERROR; } @@ -623,12 +622,29 @@ njs_externals_init(njs_vm_t *vm, njs_console_t *console) return NJS_ERROR; } - ret = njs_vm_external_create(vm, value, proto, console); + ret = njs_vm_external_create(vm, value, proto, object); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + return njs_vm_bind(vm, name, value, 1); +} + + +static njs_int_t +njs_externals_init(njs_vm_t *vm, njs_console_t *console) +{ + njs_int_t ret; + + static const njs_str_t console_name = njs_str("console"); + static const njs_str_t print_name = njs_str("print"); + + ret = njs_externals_add(vm, &njs_externals[0], &console_name, console); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } - ret = njs_vm_bind(vm, &name, value, 1); + ret = njs_externals_add(vm, &njs_ext_console[0], &print_name, console); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } diff --git a/test/njs_expect_test.exp b/test/njs_expect_test.exp index fa365a4c..7f6397cb 100644 --- a/test/njs_expect_test.exp +++ b/test/njs_expect_test.exp @@ -214,6 +214,8 @@ njs_test { "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>> "} + {"print(1, 'a')\r\n" + "print(1, 'a')\r\n1 a\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" @@ -270,13 +272,15 @@ njs_test { {"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>> "} {"var print = console.log.bind(console); print(console.a.a)\r\n" - "TypeError: cannot get property \"a\" of undefined*at console.log"} + "TypeError: cannot get property \"a\" of undefined*at print"} + {"print(console.a.a)\r\n" + "TypeError: cannot get property \"a\" of undefined*at print"} } # Backtraces for external objects njs_test { {"console.log(console.a.a)\r\n" - "console.log(console.a.a)\r\nTypeError:*at console.log (native)"} + "console.log(console.a.a)\r\nTypeError:*at print (native)"} } # dumper