]> git.kaiwu.me - njs.git/commitdiff
njs_vm_run() is rectified.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 28 Dec 2018 09:42:29 +0000 (12:42 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 28 Dec 2018 09:42:29 +0000 (12:42 +0300)
Previously, both njs_vm_call() and njs_vm_run() can be used to run njs
code. njs_vm_call() was used to invoke a single function, while
njs_vm_run() was used to run global code as well to process the events.

At first invocation njs_vm_run() executed global code, all the next
invocations it processed pending events.

The solution is splitting njs_vm_run() into two functions. One for
events processing and another for running the global code.

nginx/ngx_http_js_module.c
nginx/ngx_stream_js_module.c
njs/njs.c
njs/njs.h
njs/njs_shell.c
njs/test/njs_interactive_test.c
njs/test/njs_unit_test.c

index 3121bad3e1a9c8f452a4e62d48670c1762f71a9b..3f86c7eee5a3bc6988206f885dc508a03434d192 100644 (file)
@@ -913,7 +913,7 @@ ngx_http_js_init_vm(ngx_http_request_t *r)
     cln->handler = ngx_http_js_cleanup_ctx;
     cln->data = ctx;
 
-    if (njs_vm_run(ctx->vm) == NJS_ERROR) {
+    if (njs_vm_start(ctx->vm) == NJS_ERROR) {
         njs_vm_retval_to_ext_string(ctx->vm, &exception);
 
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
index 7526bc18187d674bc7b1c803c3f74ccb3ee583ed..708674b475cef458458b37530848bce7e24aebe0 100644 (file)
@@ -727,7 +727,7 @@ ngx_stream_js_init_vm(ngx_stream_session_t *s)
     cln->handler = ngx_stream_js_cleanup_ctx;
     cln->data = ctx;
 
-    if (njs_vm_run(ctx->vm) == NJS_ERROR) {
+    if (njs_vm_start(ctx->vm) == NJS_ERROR) {
         njs_vm_retval_to_ext_string(ctx->vm, &exception);
 
         ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
index 67801eb6660531bc5b5d1de8e53be473ecfe9f23..c956262eb888ca0e8111e423455ab865fc01b2c6 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -595,27 +595,26 @@ njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
 nxt_int_t
 njs_vm_run(njs_vm_t *vm)
 {
-    nxt_int_t  ret;
-
     if (nxt_slow_path(vm->backtrace != NULL)) {
         nxt_array_reset(vm->backtrace);
     }
 
+    return njs_vm_handle_events(vm);
+}
+
+
+nxt_int_t
+njs_vm_start(njs_vm_t *vm)
+{
+    njs_ret_t  ret;
+
     ret = njs_vmcode_interpreter(vm);
 
     if (ret == NJS_STOP) {
-        ret = njs_vm_handle_events(vm);
+        ret = NJS_OK;
     }
 
-    switch (ret) {
-    case NJS_STOP:
-        return NJS_OK;
-
-    case NXT_AGAIN:
-    case NXT_ERROR:
-    default:
-        return ret;
-    }
+    return ret;
 }
 
 
@@ -653,7 +652,7 @@ njs_vm_handle_events(njs_vm_t *vm)
         }
     }
 
-    return njs_is_pending_events(vm) ? NJS_AGAIN : NJS_STOP;
+    return njs_is_pending_events(vm) ? NJS_AGAIN : NJS_OK;
 }
 
 
index e3de4ff83f4305ea0fe96b2ea127c8c4afc470f7..0368943d7f7813669904396b8401d88bb6040636 100644 (file)
--- a/njs/njs.h
+++ b/njs/njs.h
@@ -162,8 +162,6 @@ NXT_EXPORT void njs_vm_destroy(njs_vm_t *vm);
 
 NXT_EXPORT nxt_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end);
 NXT_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external);
-NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *args, nxt_uint_t nargs);
 
 NXT_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm,
     njs_function_t *function, nxt_uint_t once, njs_host_event_t host_ev,
@@ -173,8 +171,35 @@ NXT_EXPORT nxt_int_t njs_vm_pending(njs_vm_t *vm);
 NXT_EXPORT nxt_int_t njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
     const njs_value_t *args, nxt_uint_t nargs);
 
+/*
+ * Runs the specified function with provided arguments.
+ *  NJS_OK successful run.
+ *  NJS_ERROR some exception or internal error happens.
+ *
+ *  njs_vm_retval(vm) can be used to get the retval or exception value.
+ */
+NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
+    const njs_value_t *args, nxt_uint_t nargs);
+
+/*
+ * Runs posted events.
+ *  NJS_OK successfully processed all posted events, no more events.
+ *  NJS_AGAIN successfully processed all events, some posted events are
+ *    still pending.
+ *  NJS_ERROR some exception or internal error happens.
+ *    njs_vm_retval(vm) can be used to get the retval or exception value.
+ */
 NXT_EXPORT nxt_int_t njs_vm_run(njs_vm_t *vm);
 
+/*
+ * Runs the global code.
+ *   NJS_OK successful run.
+ *   NJS_ERROR some exception or internal error happens.
+ *
+ *   njs_vm_retval(vm) can be used to get the retval or exception value.
+ */
+NXT_EXPORT nxt_int_t njs_vm_start(njs_vm_t *vm);
+
 NXT_EXPORT const njs_extern_t *njs_vm_external_prototype(njs_vm_t *vm,
     njs_external_t *external);
 NXT_EXPORT nxt_int_t njs_vm_external_create(njs_vm_t *vm,
index 9564b69863934118c3f206edb80de7c0143c1056..8e1118dc0347507269ce6f365ec72aa64a416820 100644 (file)
@@ -490,7 +490,7 @@ njs_process_script(njs_vm_t *vm, njs_opts_t *opts, const nxt_str_t *script,
             printf("\n");
         }
 
-        ret = njs_vm_run(vm);
+        ret = njs_vm_start(vm);
     }
 
     if (njs_vm_retval_dump(vm, out, 1) != NXT_OK) {
index d4c2d13d6bc08627668bddade25f1ea973c16928..c5aa73d526161f509ad0da73be6c25db2d10f375 100644 (file)
@@ -285,7 +285,7 @@ njs_interactive_test(nxt_bool_t verbose)
 
             ret = njs_vm_compile(vm, &start, end);
             if (ret == NXT_OK) {
-                ret = njs_vm_run(vm);
+                ret = njs_vm_start(vm);
             }
         }
 
index c5340f6d17b80814c16fcc397a9e4c910dc919fa..fdc5aadb726bc2c6b9dbd6a8c0c23707b3700a7d 100644 (file)
@@ -11801,7 +11801,7 @@ njs_unit_test(njs_unit_test_t tests[], size_t num, nxt_bool_t disassemble,
                 goto done;
             }
 
-            ret = njs_vm_run(nvm);
+            ret = njs_vm_start(nvm);
 
             if (njs_vm_retval_to_ext_string(nvm, &s) != NXT_OK) {
                 printf("njs_vm_retval_to_ext_string() failed\n");