]> git.kaiwu.me - njs.git/commitdiff
Shell: CLIs is rewritten using public API.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 10 May 2023 01:18:33 +0000 (18:18 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 10 May 2023 01:18:33 +0000 (18:18 -0700)
auto/make
external/njs_shell.c [moved from src/njs_shell.c with 92% similarity]
src/njs.h
src/njs_builtin.c
src/njs_vm.c
src/njs_vm.h

index 48eb6f02a6ec3728bfaeea5f2af6355a85625b57..0d363b6e63a37ef08bc71015240a43726965f4b3 100644 (file)
--- a/auto/make
+++ b/auto/make
@@ -104,10 +104,10 @@ cat << END >> $NJS_MAKEFILE
 
 $NJS_BUILD_DIR/njs: \\
        $NJS_BUILD_DIR/libnjs.a \\
-       src/njs_shell.c
+       external/njs_shell.c
        \$(NJS_LINK) -o $NJS_BUILD_DIR/njs \$(NJS_CFLAGS) \\
                $NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) -Injs \\
-               src/njs_shell.c \\
+               external/njs_shell.c \\
                $NJS_BUILD_DIR/libnjs.a \\
                $NJS_LD_OPT -lm $NJS_LIBS $NJS_LIB_AUX_LIBS $NJS_READLINE_LIB
 
@@ -118,12 +118,12 @@ END
 cat << END >> $NJS_MAKEFILE
 
 $NJS_BUILD_DIR/njs_process_script_fuzzer.o: \\
-       src/njs_shell.c
+       external/njs_shell.c
        \$(NJS_CC) -c \$(CFLAGS) $NJS_LIB_AUX_CFLAGS \\
                \$(NJS_LIB_INCS) -Injs \\
                -DNJS_FUZZER_TARGET \\
                -o $NJS_BUILD_DIR/njs_process_script_fuzzer.o \\
-               src/njs_shell.c
+               external/njs_shell.c
 
 $NJS_BUILD_DIR/njs_process_script_fuzzer: \\
        $NJS_BUILD_DIR/libnjs.a \\
similarity index 92%
rename from src/njs_shell.c
rename to external/njs_shell.c
index 754b82770965c4e209afa85bf8d9d23a813a8828..0b864a30d58b573d413864ef5d12d2520bca00bd 100644 (file)
@@ -5,7 +5,14 @@
  */
 
 
-#include <njs_main.h>
+#include <njs.h>
+#include <njs_unix.h>
+#include <njs_time.h>
+#include <njs_arr.h>
+#include <njs_queue.h>
+#include <njs_rbtree.h>
+#include <njs_lvlhsh.h>
+#include <njs_djb_hash.h>
 
 #if (!defined NJS_FUZZER_TARGET && defined NJS_HAVE_READLINE)
 
@@ -76,7 +83,7 @@ typedef struct {
 
 
 typedef struct {
-    njs_value_t             name;
+    njs_opaque_value_t      name;
     uint64_t                time;
 } njs_timelabel_t;
 
@@ -328,7 +335,7 @@ main(int argc, char **argv)
         if (vm != NULL) {
             command.start = (u_char *) opts.command;
             command.length = njs_strlen(opts.command);
-            ret = njs_process_script(vm, vm->external, &command);
+            ret = njs_process_script(vm, njs_vm_external_ptr(vm), &command);
             njs_vm_destroy(vm);
         }
 
@@ -409,7 +416,7 @@ njs_options_parse(njs_opts_t *opts, int argc, char **argv)
         switch (*p) {
         case '?':
         case 'h':
-            (void) write(STDOUT_FILENO, help, njs_length(help));
+            njs_printf("%*s", njs_length(help), help);
             return ret;
 
         case 'a':
@@ -772,15 +779,16 @@ njs_console_init(njs_vm_t *vm, njs_console_t *console)
 static njs_int_t
 njs_externals_init(njs_vm_t *vm)
 {
-    njs_int_t      ret;
-    njs_value_t    *value, method;
-    njs_console_t  *console;
+    njs_int_t           ret;
+    njs_value_t         *value;
+    njs_console_t       *console;
+    njs_opaque_value_t  method;
 
     static const njs_str_t  console_name = njs_str("console");
     static const njs_str_t  print_name = njs_str("print");
     static const njs_str_t  console_log = njs_str("console.log");
 
-    console = vm->options.external;
+    console = njs_vm_options(vm)->external;
 
     njs_console_proto_id = njs_vm_external_prototype(vm, njs_ext_console,
                                          njs_nitems(njs_ext_console));
@@ -789,7 +797,7 @@ njs_externals_init(njs_vm_t *vm)
         return NJS_ERROR;
     }
 
-    value = njs_mp_zalloc(vm->mem_pool, sizeof(njs_opaque_value_t));
+    value = njs_mp_zalloc(njs_vm_memory_pool(vm), sizeof(njs_opaque_value_t));
     if (njs_slow_path(value == NULL)) {
         return NJS_ERROR;
     }
@@ -804,12 +812,12 @@ njs_externals_init(njs_vm_t *vm)
         return NJS_ERROR;
     }
 
-    ret = njs_vm_value(vm, &console_log, &method);
+    ret = njs_vm_value(vm, &console_log, njs_value_arg(&method));
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
-    ret = njs_vm_bind(vm, &print_name, &method, 0);
+    ret = njs_vm_bind(vm, &print_name, njs_value_arg(&method), 0);
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
@@ -888,7 +896,7 @@ njs_console_output(njs_vm_t *vm, njs_value_t *value, njs_int_t ret)
             return;
         }
 
-        if (vm->options.interactive) {
+        if (njs_vm_options(vm)->interactive) {
             njs_print(out.start, out.length);
             njs_print("\n", 1);
         }
@@ -940,9 +948,9 @@ njs_process_events(void *runtime)
 static njs_int_t
 njs_process_script(njs_vm_t *vm, void *runtime, const njs_str_t *script)
 {
-    u_char       *start, *end;
-    njs_int_t    ret;
-    njs_value_t  retval;
+    u_char              *start, *end;
+    njs_int_t           ret;
+    njs_opaque_value_t  retval;
 
     start = script->start;
     end = start + script->length;
@@ -951,7 +959,7 @@ njs_process_script(njs_vm_t *vm, void *runtime, const njs_str_t *script)
 
     if (ret == NJS_OK) {
         if (start == end) {
-            ret = njs_vm_start(vm, &retval);
+            ret = njs_vm_start(vm, njs_value_arg(&retval));
 
         } else {
             njs_vm_error(vm, "Extra characters at the end of the script");
@@ -959,9 +967,9 @@ njs_process_script(njs_vm_t *vm, void *runtime, const njs_str_t *script)
         }
     }
 
-    njs_process_output(vm, &retval, ret);
+    njs_process_output(vm, njs_value_arg(&retval), ret);
 
-    if (!vm->options.interactive && ret == NJS_ERROR) {
+    if (!njs_vm_options(vm)->interactive && ret == NJS_ERROR) {
         return NJS_ERROR;
     }
 
@@ -989,9 +997,9 @@ njs_process_script(njs_vm_t *vm, void *runtime, const njs_str_t *script)
         ret = njs_vm_run(vm);
 
         if (ret == NJS_ERROR) {
-            njs_process_output(vm, &retval, ret);
+            njs_process_output(vm, njs_value_arg(&retval), ret);
 
-            if (!vm->options.interactive) {
+            if (!njs_vm_options(vm)->interactive) {
                 return NJS_ERROR;
             }
         }
@@ -1285,15 +1293,12 @@ njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         njs_vm_log(vm, "\n");
     }
 
-    njs_set_undefined(retval);
+    njs_value_undefined_set(retval);
 
     return NJS_OK;
 }
 
 
-static const njs_value_t  njs_default_label = njs_string("default");
-
-
 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)
@@ -1305,31 +1310,35 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_timelabel_t     *label;
     njs_lvlhsh_query_t  lhq;
 
+    static const njs_str_t  default_label = njs_str("default");
+
     console = njs_vm_external(vm, njs_console_proto_id, njs_argument(args, 0));
     if (njs_slow_path(console == NULL)) {
-        njs_type_error(vm, "external value is expected");
+        njs_vm_error(vm, "external value is expected");
         return NJS_ERROR;
     }
 
-    value = njs_arg(args, nargs, 1);
+    name = default_label;
 
-    if (njs_slow_path(!njs_is_string(value))) {
-        if (njs_is_undefined(value)) {
-            value = njs_value_arg(&njs_default_label);
+    value = njs_arg(args, nargs, 1);
 
-        } else {
+    if (njs_slow_path(!njs_value_is_string(value))) {
+        if (!njs_value_is_undefined(value)) {
             ret = njs_value_to_string(vm, value, value);
             if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
+
+            njs_value_string_get(value, &name);
         }
-    }
 
-    njs_string_get(value, &name);
+    } else {
+        njs_value_string_get(value, &name);
+    }
 
-    label = njs_mp_alloc(vm->mem_pool, sizeof(njs_timelabel_t));
+    label = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_timelabel_t));
     if (njs_slow_path(label == NULL)) {
-        njs_memory_error(vm);
+        njs_vm_memory_error(vm);
         return NJS_ERROR;
     }
 
@@ -1337,20 +1346,20 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     lhq.key = name;
     lhq.key_hash = njs_djb_hash(name.start, name.length);
     lhq.value = label;
-    lhq.pool = vm->mem_pool;
+    lhq.pool = njs_vm_memory_pool(vm);
     lhq.proto = &njs_timelabel_hash_proto;
 
     ret = njs_lvlhsh_insert(&console->labels, &lhq);
 
     if (njs_fast_path(ret == NJS_OK)) {
-        /* GC: retain. */
-        label->name = *value;
+        (void) njs_vm_value_string_set(vm, njs_value_arg(&label->name),
+                                       name.start, name.length);
 
     } else {
-        njs_mp_free(vm->mem_pool, label);
+        njs_mp_free(njs_vm_memory_pool(vm), label);
 
         if (njs_slow_path(ret == NJS_ERROR)) {
-            njs_internal_error(vm, "lvlhsh insert failed");
+            njs_vm_error(vm, "lvlhsh insert failed");
 
             return NJS_ERROR;
         }
@@ -1362,7 +1371,7 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     label->time = njs_time();
 
-    njs_set_undefined(retval);
+    njs_value_undefined_set(retval);
 
     return NJS_OK;
 }
@@ -1380,33 +1389,37 @@ njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_timelabel_t     *label;
     njs_lvlhsh_query_t  lhq;
 
+    static const njs_str_t  default_label = njs_str("default");
+
     ns = njs_time();
 
     console = njs_vm_external(vm, njs_console_proto_id, njs_argument(args, 0));
     if (njs_slow_path(console == NULL)) {
-        njs_type_error(vm, "external value is expected");
+        njs_vm_error(vm, "external value is expected");
         return NJS_ERROR;
     }
 
-    value = njs_arg(args, nargs, 1);
+    name = default_label;
 
-    if (njs_slow_path(!njs_is_string(value))) {
-        if (njs_is_undefined(value)) {
-            value = njs_value_arg(&njs_default_label);
+    value = njs_arg(args, nargs, 1);
 
-        } else {
+    if (njs_slow_path(!njs_value_is_string(value))) {
+        if (!njs_value_is_undefined(value)) {
             ret = njs_value_to_string(vm, value, value);
             if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
+
+            njs_value_string_get(value, &name);
         }
-    }
 
-    njs_string_get(value, &name);
+    } else {
+        njs_value_string_get(value, &name);
+    }
 
     lhq.key = name;
     lhq.key_hash = njs_djb_hash(name.start, name.length);
-    lhq.pool = vm->mem_pool;
+    lhq.pool = njs_vm_memory_pool(vm);
     lhq.proto = &njs_timelabel_hash_proto;
 
     ret = njs_lvlhsh_delete(&console->labels, &lhq);
@@ -1423,11 +1436,11 @@ njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         njs_vm_log(vm, "%V: %uL.%06uLms\n", &name, ms, ns);
 
         /* GC: release. */
-        njs_mp_free(vm->mem_pool, label);
+        njs_mp_free(njs_vm_memory_pool(vm), label);
 
     } else {
         if (ret == NJS_ERROR) {
-            njs_internal_error(vm, "lvlhsh delete failed");
+            njs_vm_error(vm, "lvlhsh delete failed");
 
             return NJS_ERROR;
         }
@@ -1435,7 +1448,7 @@ njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         njs_vm_log(vm, "Timer \"%V\" doesn’t exist.\n", &name);
     }
 
-    njs_set_undefined(retval);
+    njs_value_undefined_set(retval);
 
     return NJS_OK;
 }
@@ -1459,7 +1472,7 @@ njs_console_set_timer(njs_external_ptr_t external, uint64_t delay,
         return NULL;
     }
 
-    ev = njs_mp_alloc(vm->mem_pool, sizeof(njs_ev_t));
+    ev = njs_mp_alloc(njs_vm_memory_pool(vm), sizeof(njs_ev_t));
     if (njs_slow_path(ev == NULL)) {
         return NULL;
     }
@@ -1473,7 +1486,7 @@ njs_console_set_timer(njs_external_ptr_t external, uint64_t delay,
     lhq.replace = 0;
     lhq.value = ev;
     lhq.proto = &lvlhsh_proto;
-    lhq.pool = vm->mem_pool;
+    lhq.pool = njs_vm_memory_pool(vm);
 
     ret = njs_lvlhsh_insert(&console->events, &lhq);
     if (njs_slow_path(ret != NJS_OK)) {
@@ -1504,7 +1517,7 @@ njs_console_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
     lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
     lhq.proto = &lvlhsh_proto;
-    lhq.pool = vm->mem_pool;
+    lhq.pool = njs_vm_memory_pool(vm);
 
     if (ev->link.prev != NULL) {
         njs_queue_remove(&ev->link);
@@ -1515,7 +1528,7 @@ njs_console_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
         njs_vm_err(vm, "njs_lvlhsh_delete() failed\n");
     }
 
-    njs_mp_free(vm->mem_pool, ev);
+    njs_mp_free(njs_vm_memory_pool(vm), ev);
 }
 
 
@@ -1535,11 +1548,11 @@ njs_console_log(njs_vm_t *vm, njs_external_ptr_t external,
 static njs_int_t
 njs_timelabel_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
-    njs_timelabel_t  *label;
     njs_str_t        str;
+    njs_timelabel_t  *label;
 
     label = data;
-    njs_string_get(&label->name, &str);
+    njs_value_string_get(njs_value_arg(&label->name), &str);
 
     if (njs_strstr_eq(&lhq->key, &str)) {
         return NJS_OK;
index 7a091e66c0c7d76e7c9533d5223f420130b2a932..d33d265cc2f37c104ee2a67d016390c2abee5345 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -351,9 +351,9 @@ NJS_EXPORT njs_int_t njs_vm_posted(njs_vm_t *vm);
 
 #define njs_vm_pending(vm)  (njs_vm_waiting(vm) || njs_vm_posted(vm))
 
-#define njs_vm_unhandled_rejection(vm)                                         \
-    ((vm)->options.unhandled_rejection == NJS_VM_OPT_UNHANDLED_REJECTION_THROW \
-    && (vm)->promise_reason != NULL && (vm)->promise_reason->length != 0)
+NJS_EXPORT njs_int_t njs_vm_unhandled_rejection(njs_vm_t *vm);
+
+NJS_EXPORT void *njs_vm_completions(njs_vm_t *vm, njs_str_t *expression);
 
 /*
  * Runs the specified function with provided arguments.
index a2ef977f1682c920ef480e30a329b74f0f0c42f2..854f9c8fc599d91cf6f392928c72707e6d3c3505 100644 (file)
@@ -544,7 +544,7 @@ njs_builtin_completions(njs_vm_t *vm)
 }
 
 
-njs_arr_t *
+void *
 njs_vm_completions(njs_vm_t *vm, njs_str_t *expression)
 {
     u_char  *p, *end;
index cf1b271bdebe3479eb26e1a5913e4c5c9d0870b6..dfbe2f137590c2419ed93691a223d2727151cadc 100644 (file)
@@ -509,6 +509,16 @@ njs_vm_posted(njs_vm_t *vm)
 }
 
 
+njs_int_t
+njs_vm_unhandled_rejection(njs_vm_t *vm)
+{
+    return vm->options.unhandled_rejection
+             == NJS_VM_OPT_UNHANDLED_REJECTION_THROW
+           && vm->promise_reason != NULL
+           && vm->promise_reason->length != 0;
+}
+
+
 njs_int_t
 njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
     const njs_value_t *args, njs_uint_t nargs)
index 84fb68465cfa42d9afc8cf77c793f025d35ff875..314f0eacdf56b8a207d5b2980b9272d8dfc60773 100644 (file)
@@ -247,8 +247,6 @@ njs_int_t njs_builtin_match_native_function(njs_vm_t *vm,
 void njs_disassemble(u_char *start, u_char *end, njs_int_t count,
     njs_arr_t *lines);
 
-njs_arr_t *njs_vm_completions(njs_vm_t *vm, njs_str_t *expression);
-
 void *njs_lvlhsh_alloc(void *data, size_t size);
 void njs_lvlhsh_free(void *data, void *p, size_t size);