]> git.kaiwu.me - njs.git/commitdiff
Added support of native function calls in njs_vm_call().
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 26 Dec 2018 13:05:23 +0000 (16:05 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 26 Dec 2018 13:05:23 +0000 (16:05 +0300)
njs/njs.c
njs/njs_function.c
njs/njs_function.h

index 209f7c056487f7f39263260b462451b609f3b039..67801eb6660531bc5b5d1de8e53be473ecfe9f23 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -461,9 +461,10 @@ nxt_int_t
 njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
     nxt_uint_t nargs)
 {
-    u_char       *current;
-    njs_ret_t    ret;
-    njs_value_t  *this;
+    u_char              *current;
+    njs_ret_t           ret;
+    njs_value_t         *this;
+    njs_continuation_t  *cont;
 
     static const njs_vmcode_stop_t  stop[] = {
         { .code = { .operation = njs_vmcode_stop,
@@ -474,17 +475,36 @@ njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
 
     this = (njs_value_t *) &njs_value_void;
 
-    ret = njs_function_frame(vm, function, this, args, nargs, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return ret;
-    }
-
     current = vm->current;
-    vm->current = (u_char *) stop;
 
-    ret = njs_function_call(vm, NJS_INDEX_GLOBAL_RETVAL, 0);
-    if (nxt_slow_path(ret == NXT_ERROR)) {
-        return ret;
+    if (function->native) {
+        ret = njs_function_native_frame(vm, function, this, &args[0],
+                                        nargs, NJS_CONTINUATION_SIZE, 0);
+        if (ret != NJS_OK) {
+            return NJS_ERROR;
+        }
+
+        cont = njs_vm_continuation(vm);
+
+        cont->function = function->u.native;
+        cont->args_types = function->args_types;
+        cont->retval = NJS_INDEX_GLOBAL_RETVAL;
+
+        cont->return_address = (u_char *) stop;
+        vm->current = (u_char *) njs_continuation_nexus;
+
+    } else {
+        ret = njs_function_frame(vm, function, this, args, nargs, 0);
+        if (nxt_slow_path(ret != NXT_OK)) {
+            return ret;
+        }
+
+        vm->current = (u_char *) stop;
+
+        ret = njs_function_call(vm, NJS_INDEX_GLOBAL_RETVAL, 0);
+        if (nxt_slow_path(ret == NXT_ERROR)) {
+            return ret;
+        }
     }
 
     ret = njs_vmcode_interpreter(vm);
index 83d3db1daa20d03f9cbe561de7df14382c17c517..a3d860d8fe693ac98add4776e7bd222182497c54 100644 (file)
@@ -214,7 +214,7 @@ njs_function_arguments_thrower(njs_vm_t *vm, njs_value_t *value,
 
 njs_ret_t
 njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, njs_value_t *args, nxt_uint_t nargs,
+    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
     size_t reserve, nxt_bool_t ctor)
 {
     size_t              size;
index c1396a0f151d632493c9fd3a61461feedc3adf63..feb83bc9c36059f1eb91f54d6f00b4cb3a5982fa 100644 (file)
@@ -165,7 +165,7 @@ njs_ret_t njs_function_constructor(njs_vm_t *vm, njs_value_t *args,
 njs_ret_t njs_function_apply(njs_vm_t *vm, njs_function_t *function,
     njs_value_t *args, nxt_uint_t nargs, njs_index_t retval);
 njs_ret_t njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, njs_value_t *args, nxt_uint_t nargs,
+    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
     size_t reserve, nxt_bool_t ctor);
 njs_ret_t njs_function_frame(njs_vm_t *vm, njs_function_t *function,
     const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,