[njs] Native methods called by iterators should run via continuation

Igor Sysoev igor at sysoev.ru
Mon Dec 5 15:17:44 UTC 2016


details:   http://hg.nginx.org/njs/rev/eba4f3a30bb4
branches:  
changeset: 272:eba4f3a30bb4
user:      Igor Sysoev <igor at sysoev.ru>
date:      Mon Dec 05 17:35:33 2016 +0300
description:
Native methods called by iterators should run via continuation
to normilize arguments.

diffstat:

 njs/njs_function.c       |  12 ++----------
 njs/njs_function.h       |   1 +
 njs/njs_vm.c             |   8 ++++++++
 njs/test/njs_unit_test.c |   3 +++
 4 files changed, 14 insertions(+), 10 deletions(-)

diffs (83 lines):

diff -r 7275165c3832 -r eba4f3a30bb4 njs/njs_function.c
--- a/njs/njs_function.c	Fri Dec 02 17:11:57 2016 +0300
+++ b/njs/njs_function.c	Mon Dec 05 17:35:33 2016 +0300
@@ -252,21 +252,12 @@ nxt_noinline 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)
 {
-    size_t              reserve;
     njs_ret_t           ret;
     njs_continuation_t  *cont;
 
     if (function->native) {
-
-        if (function->continuation_size == 0 && function->bound == NULL) {
-            return function->u.native(vm, args, nargs, retval);
-        }
-
-        reserve = nxt_align_size(sizeof(njs_continuation_t),
-                                 sizeof(njs_value_t)),
-
         ret = njs_function_native_frame(vm, function, &args[0], &args[1],
-                                        nargs - 1, reserve, 0);
+                                        nargs - 1, NJS_CONTINUATION_SIZE, 0);
         if (ret != NJS_OK) {
             return ret;
         }
@@ -274,6 +265,7 @@ njs_function_apply(njs_vm_t *vm, njs_fun
         cont = njs_continuation(vm->frame);
 
         cont->function = function->u.native;
+        cont->args_types = function->args_types;
         cont->retval = retval;
 
         cont->return_address = vm->current;
diff -r 7275165c3832 -r eba4f3a30bb4 njs/njs_function.h
--- a/njs/njs_function.h	Fri Dec 02 17:11:57 2016 +0300
+++ b/njs/njs_function.h	Mon Dec 05 17:35:33 2016 +0300
@@ -50,6 +50,7 @@ struct njs_function_lambda_s {
 
 typedef struct {
     njs_function_native_t          function;
+    uint8_t                        *args_types;
     u_char                         *return_address;
     njs_index_t                    retval;
 } njs_continuation_t;
diff -r 7275165c3832 -r eba4f3a30bb4 njs/njs_vm.c
--- a/njs/njs_vm.c	Fri Dec 02 17:11:57 2016 +0300
+++ b/njs/njs_vm.c	Mon Dec 05 17:35:33 2016 +0300
@@ -2358,6 +2358,7 @@ njs_vmcode_function_call(njs_vm_t *vm, n
         cont = njs_continuation(vm->frame);
 
         cont->function = function->u.native;
+        cont->args_types = function->args_types;
         cont->retval = (njs_index_t) retval;
 
         cont->return_address = vm->current + sizeof(njs_vmcode_function_call_t);
@@ -2609,6 +2610,13 @@ njs_vmcode_continuation(njs_vm_t *vm, nj
     cont = njs_continuation(frame);
     args = frame->arguments - frame->function->args_offset;
 
+    if (cont->args_types != NULL) {
+        ret = njs_normalize_args(vm, args, cont->args_types, frame->nargs);
+        if (ret != NJS_OK) {
+            return ret;
+        }
+    }
+
     ret = cont->function(vm, args, frame->nargs, cont->retval);
 
     switch (ret) {
diff -r 7275165c3832 -r eba4f3a30bb4 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c	Fri Dec 02 17:11:57 2016 +0300
+++ b/njs/test/njs_unit_test.c	Mon Dec 05 17:35:33 2016 +0300
@@ -5461,6 +5461,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var d = new Date(); d.__proto__ === Date.prototype"),
       nxt_string("true") },
 
+    { nxt_string("[0].map(new Date().getDate)"),
+      nxt_string("TypeError") },
+
     { nxt_string("new Date(eval)"),
       nxt_string("Invalid Date") },
 


More information about the nginx-devel mailing list