]> git.kaiwu.me - njs.git/commitdiff
Interactive shell: introduced global print() alias to console.log().
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 26 Nov 2019 12:11:40 +0000 (15:11 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 26 Nov 2019 12:11:40 +0000 (15:11 +0300)
src/njs_extern.c
src/njs_shell.c
test/njs_expect_test.exp

index 793541b8e49e4f631ba5eb5b6b0b36d125365841..d8b79d2da9f15f0e417b8410626ef771e714e3c6 100644 (file)
@@ -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;
 }
index da1f3c16b20cf591e65026538a34ee197358eca2..f3b8067af48715e779ffee42a23edc7de5d71473 100644 (file)
@@ -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;
     }
index fa365a4c7d2e8562592a5b7ce73655c7390b984a..7f6397cb8c0c9f2f5d2661e4dc06372ec42aae5a 100644 (file)
@@ -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