]> git.kaiwu.me - njs.git/commitdiff
njs_function_apply() interface is changed.
authorIgor Sysoev <igor@sysoev.ru>
Thu, 11 Feb 2016 15:42:06 +0000 (18:42 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 11 Feb 2016 15:42:06 +0000 (18:42 +0300)
njs/njs_array.c
njs/njs_function.c
njs/njs_function.h
njs/njs_vm.c

index 29434b1f8a14ee8e0779ca15cd88811e2a0bc93b..02507abb880d8750602449cb5530b724244676de 100644 (file)
@@ -41,6 +41,7 @@ static njs_ret_t njs_array_prototype_join_continuation(njs_vm_t *vm,
     njs_param_t *param);
 static nxt_noinline njs_value_t *njs_array_copy(njs_value_t *dst,
     njs_value_t *src);
+static nxt_int_t njs_array_iterator_args(njs_vm_t *vm, njs_param_t *param);
 static nxt_noinline nxt_int_t njs_array_next(njs_value_t *value, nxt_uint_t n,
     nxt_uint_t length);
 
@@ -506,7 +507,7 @@ njs_array_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
         prop = njs_object_property(vm, this->data.u.object, &lhq);
 
         if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
-            return njs_function_apply(vm, &prop->value, param);
+            return njs_function_apply(vm, prop->value.data.u.function, param);
         }
     }
 
@@ -772,11 +773,11 @@ njs_array_copy(njs_value_t *dst, njs_value_t *src)
 static njs_ret_t
 njs_array_prototype_for_each(njs_vm_t *vm, njs_param_t *param)
 {
-    nxt_int_t         n;
+    nxt_int_t         n, ret;
     uintptr_t         nargs;
     njs_param_t       p;
     njs_array_t       *array;
-    njs_value_t       *this, *args, *func, arguments[3];
+    njs_value_t       *this, *args, arguments[3];
     njs_array_next_t  *next;
 
     this = param->this;
@@ -784,9 +785,9 @@ njs_array_prototype_for_each(njs_vm_t *vm, njs_param_t *param)
     if (!vm->frame->reentrant) {
         vm->frame->reentrant = 1;
 
-        if (!njs_is_array(this)) {
-            vm->exception = &njs_exception_type_error;
-            return NXT_ERROR;
+        ret = njs_array_iterator_args(vm, param);
+        if (nxt_slow_path(ret != NXT_OK)) {
+            return ret;
         }
 
         array = this->data.u.array;
@@ -826,9 +827,7 @@ njs_array_prototype_for_each(njs_vm_t *vm, njs_param_t *param)
     p.nargs = 3;
     p.retval = (njs_index_t) &next->retval;
 
-    func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void;
-
-    return njs_function_apply(vm, func, &p);
+    return njs_function_apply(vm, args[0].data.u.function, &p);
 }
 
 
@@ -836,10 +835,10 @@ static njs_ret_t
 njs_array_prototype_some(njs_vm_t *vm, njs_param_t *param)
 {
     uintptr_t         nargs;
-    nxt_int_t         n;
+    nxt_int_t         n, ret;
     njs_param_t       p;
     njs_array_t       *array;
-    njs_value_t       *this, *args, *func, arguments[3];
+    njs_value_t       *this, *args, arguments[3];
     njs_array_next_t  *next;
 
     this = param->this;
@@ -847,9 +846,9 @@ njs_array_prototype_some(njs_vm_t *vm, njs_param_t *param)
     if (!vm->frame->reentrant) {
         vm->frame->reentrant = 1;
 
-        if (!njs_is_array(this)) {
-            vm->exception = &njs_exception_type_error;
-            return NXT_ERROR;
+        ret = njs_array_iterator_args(vm, param);
+        if (nxt_slow_path(ret != NXT_OK)) {
+            return ret;
         }
 
         array = this->data.u.array;
@@ -890,9 +889,7 @@ njs_array_prototype_some(njs_vm_t *vm, njs_param_t *param)
     p.nargs = 3;
     p.retval = (njs_index_t) &next->retval;
 
-    func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void;
-
-    return njs_function_apply(vm, func, &p);
+    return njs_function_apply(vm, args[0].data.u.function, &p);
 }
 
 
@@ -900,10 +897,10 @@ static njs_ret_t
 njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param)
 {
     uintptr_t         nargs;
-    nxt_int_t         n;
+    nxt_int_t         n, ret;
     njs_param_t       p;
     njs_array_t       *array;
-    njs_value_t       *this, *args, *func, arguments[3];
+    njs_value_t       *this, *args, arguments[3];
     njs_array_next_t  *next;
 
     this = param->this;
@@ -911,9 +908,9 @@ njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param)
     if (!vm->frame->reentrant) {
         vm->frame->reentrant = 1;
 
-        if (!njs_is_array(this)) {
-            vm->exception = &njs_exception_type_error;
-            return NXT_ERROR;
+        ret = njs_array_iterator_args(vm, param);
+        if (nxt_slow_path(ret != NXT_OK)) {
+            return ret;
         }
 
         array = this->data.u.array;
@@ -954,9 +951,23 @@ njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param)
     p.nargs = 3;
     p.retval = (njs_index_t) &next->retval;
 
-    func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void;
+    return njs_function_apply(vm, args[0].data.u.function, &p);
+}
+
 
-    return njs_function_apply(vm, func, &p);
+static nxt_int_t
+njs_array_iterator_args(njs_vm_t *vm, njs_param_t *param)
+{
+    if (njs_is_array(param->this)
+        && param->nargs != 0
+        && njs_is_function(&param->args[0]))
+    {
+        return NXT_OK;
+    }
+
+    vm->exception = &njs_exception_type_error;
+
+    return NXT_ERROR;
 }
 
 
index 72aa5bfa786ea6baa4f9f675d9754565870bcf51..71defc101c1e5d55a8c888f0a3ab1997b1f0640b 100644 (file)
@@ -116,29 +116,21 @@ njs_function_constructor(njs_vm_t *vm, njs_param_t *param)
 
 
 nxt_noinline njs_ret_t
-njs_function_apply(njs_vm_t *vm, njs_value_t *value, njs_param_t *param)
+njs_function_apply(njs_vm_t *vm, njs_function_t *function, njs_param_t *param)
 {
-    njs_ret_t       ret;
-    njs_function_t  *function;
-
-    if (njs_is_function(value)) {
-
-        function = value->data.u.function;
-
-        if (function->native) {
-            return function->u.native(vm, param);
-        }
+    njs_ret_t  ret;
 
-        ret = njs_function_frame(vm, function, param, 0);
+    if (function->native) {
+        return function->u.native(vm, param);
+    }
 
-        if (nxt_fast_path(ret == NXT_OK)) {
-            vm->retval = njs_value_void;
+    ret = njs_function_frame(vm, function, param, 0);
 
-            return njs_function_call(vm, param->retval, 0);
-        }
+    if (nxt_fast_path(ret == NXT_OK)) {
+        return njs_function_call(vm, param->retval, 0);
     }
 
-    return NXT_ERROR;
+    return ret;
 }
 
 
index 1ba98e2516dc2678249915bd99e58e8d06717429..5e7379780be09b7d6dcc0a0d69c14398b486a70f 100644 (file)
@@ -134,7 +134,7 @@ typedef struct {
 njs_function_t *njs_function_alloc(njs_vm_t *vm);
 njs_native_frame_t *njs_function_frame_alloc(njs_vm_t *vm, size_t size);
 njs_ret_t njs_function_constructor(njs_vm_t *vm, njs_param_t *param);
-njs_ret_t njs_function_apply(njs_vm_t *vm, njs_value_t *name,
+njs_ret_t njs_function_apply(njs_vm_t *vm, njs_function_t *function,
     njs_param_t *param);
 njs_value_t *njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
     njs_vmcode_t *code);
index 744e1e354bd2f0ee1a5b35e0a7450d1731b36060..a6c2f3ed27723ec006bc1f14241a0f8eac54dacf 100644 (file)
@@ -2991,7 +2991,9 @@ njs_primitive_value(njs_vm_t *vm, njs_value_t *value, nxt_uint_t hint)
                         param.args = NULL;
                         param.nargs = 0;
 
-                        ret = njs_function_apply(vm, &prop->value, &param);
+                        ret = njs_function_apply(vm,
+                                                 prop->value.data.u.function,
+                                                 &param);
                         /*
                          * njs_function_apply() can return
                          *   NXT_OK, NJS_APPLIED, NXT_ERROR, NXT_AGAIN.