Welcome! Log In Create A New Profile

Advanced

[njs] Added support of native function calls in njs_vm_call().

Dmitry Volyntsev
December 26, 2018 08:08AM
details: https://hg.nginx.org/njs/rev/36989f329e16
branches:
changeset: 697:36989f329e16
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Wed Dec 26 16:05:23 2018 +0300
description:
Added support of native function calls in njs_vm_call().

diffstat:

njs/njs.c | 44 ++++++++++++++++++++++++++++++++------------
njs/njs_function.c | 2 +-
njs/njs_function.h | 2 +-
3 files changed, 34 insertions(+), 14 deletions(-)

diffs (87 lines):

diff -r e1e54922e085 -r 36989f329e16 njs/njs.c
--- a/njs/njs.c Wed Dec 26 13:23:16 2018 +0300
+++ b/njs/njs.c Wed Dec 26 16:05:23 2018 +0300
@@ -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

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;
+
+ 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;

- current = vm->current;
- vm->current = (u_char *) stop;
+ cont->return_address = (u_char *) stop;
+ vm->current = (u_char *) njs_continuation_nexus;

- ret = njs_function_call(vm, NJS_INDEX_GLOBAL_RETVAL, 0);
- if (nxt_slow_path(ret == NXT_ERROR)) {
- return ret;
+ } 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);
diff -r e1e54922e085 -r 36989f329e16 njs/njs_function.c
--- a/njs/njs_function.c Wed Dec 26 13:23:16 2018 +0300
+++ b/njs/njs_function.c Wed Dec 26 16:05:23 2018 +0300
@@ -214,7 +214,7 @@ njs_function_arguments_thrower(njs_vm_t

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;
diff -r e1e54922e085 -r 36989f329e16 njs/njs_function.h
--- a/njs/njs_function.h Wed Dec 26 13:23:16 2018 +0300
+++ b/njs/njs_function.h Wed Dec 26 16:05:23 2018 +0300
@@ -165,7 +165,7 @@ njs_ret_t njs_function_constructor(njs_v
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,
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Added support of native function calls in njs_vm_call().

Dmitry Volyntsev 314 December 26, 2018 08:08AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 254
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready