]> git.kaiwu.me - njs.git/commitdiff
Refactored njs_object_iterate() API.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 27 Apr 2023 04:19:48 +0000 (21:19 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 27 Apr 2023 04:19:48 +0000 (21:19 -0700)
As a side-effect it fixes dangling-pointer compilation error
found by GCC 13.1.

external/njs_webcrypto_module.c
src/njs_array.c
src/njs_iterator.c
src/njs_iterator.h
src/njs_promise.c

index f78280a1e43578faa0d840d441be2707d80fc7a4..3cabec1582ce7195b2433c9eecf7eeef2085fd1d 100644 (file)
@@ -4192,7 +4192,7 @@ njs_key_usage(njs_vm_t *vm, njs_value_t *value, unsigned *mask)
 
     *mask = 0;
 
-    args.value = value;
+    njs_value_assign(&args.value, value);
     args.from = 0;
     args.to = length;
     args.data = mask;
index 2993689e12fd983e0ec76f9214cf510d17c9cd41..b4e9f9742633f01f2d970b09e3cb59be3f270d61 100644 (file)
@@ -1862,10 +1862,10 @@ njs_array_iterator_call(njs_vm_t *vm, njs_iterator_args_t *args,
 
     arguments[0] = *entry;
     njs_set_number(&arguments[1], n);
-    arguments[2] = *args->value;
+    njs_value_assign(&arguments[2], &args->value);
 
-    return njs_function_call(vm, args->function, args->argument, arguments, 3,
-                             retval);
+    return njs_function_call(vm, args->function, njs_value_arg(&args->argument),
+                             arguments, 3, retval);
 }
 
 
@@ -1921,7 +1921,7 @@ njs_array_handler_includes(njs_vm_t *vm, njs_iterator_args_t *args,
         entry = njs_value_arg(&njs_value_undefined);
     }
 
-    if (njs_values_same_zero(args->argument, entry)) {
+    if (njs_values_same_zero(njs_value_arg(&args->argument), entry)) {
         njs_set_true(retval);
 
         return NJS_DONE;
@@ -1935,7 +1935,7 @@ static njs_int_t
 njs_array_handler_index_of(njs_vm_t *vm, njs_iterator_args_t *args,
     njs_value_t *entry, int64_t n, njs_value_t *retval)
 {
-    if (njs_values_strict_equal(args->argument, entry)) {
+    if (njs_values_strict_equal(njs_value_arg(&args->argument), entry)) {
         njs_set_number(retval, n);
 
         return NJS_DONE;
@@ -2023,21 +2023,21 @@ njs_array_handler_reduce(njs_vm_t *vm, njs_iterator_args_t *args,
     njs_value_t  arguments[5];
 
     if (njs_is_valid(entry)) {
-        if (!njs_is_valid(args->argument)) {
-            *(args->argument) = *entry;
+        if (!njs_value_is_valid(njs_value_arg(&args->argument))) {
+            njs_value_assign(&args->argument, entry);
             return NJS_OK;
         }
 
         /* GC: array elt, array */
 
         njs_set_undefined(&arguments[0]);
-        arguments[1] = *args->argument;
+        njs_value_assign(&arguments[1], &args->argument);
         arguments[2] = *entry;
         njs_set_number(&arguments[3], n);
-        arguments[4] = *args->value;
+        njs_value_assign(&arguments[4], &args->value);
 
         ret =  njs_function_apply(vm, args->function, arguments, 5,
-                                  args->argument);
+                                  njs_value_arg(&args->argument));
         if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
@@ -2120,18 +2120,17 @@ njs_array_prototype_iterator(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     int64_t                 i, length;
     njs_int_t               ret;
     njs_array_t             *array;
-    njs_value_t             accumulator;
     njs_iterator_args_t     iargs;
     njs_iterator_handler_t  handler;
 
-    iargs.value = njs_argument(args, 0);
+    njs_value_assign(&iargs.value, njs_argument(args, 0));
 
-    ret = njs_value_to_object(vm, iargs.value);
+    ret = njs_value_to_object(vm, njs_value_arg(&iargs.value));
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
-    ret = njs_value_length(vm, iargs.value, &iargs.to);
+    ret = njs_value_length(vm, njs_value_arg(&iargs.value), &iargs.to);
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
@@ -2145,10 +2144,10 @@ njs_array_prototype_iterator(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
 
         iargs.function = njs_function(njs_argument(args, 1));
-        iargs.argument = njs_arg(args, nargs, 2);
+        njs_value_assign(&iargs.argument, njs_arg(args, nargs, 2));
 
     } else {
-        iargs.argument = njs_arg(args, nargs, 1);
+        njs_value_assign(&iargs.argument, njs_arg(args, nargs, 1));
     }
 
     switch (njs_array_type(magic)) {
@@ -2206,13 +2205,10 @@ njs_array_prototype_iterator(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     case NJS_ARRAY_REDUCE:
         handler = njs_array_handler_reduce;
 
-        njs_set_invalid(&accumulator);
-
-        if (nargs > 2) {
-            accumulator = *iargs.argument;
+        if (nargs <= 2) {
+            njs_value_invalid_set(njs_value_arg(&iargs.argument));
         }
 
-        iargs.argument = &accumulator;
         break;
 
     case NJS_ARRAY_FILTER:
@@ -2277,12 +2273,12 @@ done:
         break;
 
     case NJS_ARRAY_REDUCE:
-        if (!njs_is_valid(&accumulator)) {
+        if (!njs_value_is_valid(njs_value_arg(&iargs.argument))) {
             njs_type_error(vm, "Reduce of empty object with no initial value");
             return NJS_ERROR;
         }
 
-        njs_value_assign(retval, &accumulator);
+        njs_value_assign(retval, njs_value_arg(&iargs.argument));
         break;
 
     case NJS_ARRAY_FILTER:
@@ -2301,20 +2297,19 @@ njs_array_prototype_reverse_iterator(njs_vm_t *vm, njs_value_t *args,
 {
     int64_t                 from, length;
     njs_int_t               ret;
-    njs_value_t             accumulator;
     njs_iterator_args_t     iargs;
     njs_iterator_handler_t  handler;
 
-    iargs.value = njs_argument(args, 0);
+    njs_value_assign(&iargs.value, njs_argument(args, 0));
 
-    ret = njs_value_to_object(vm, iargs.value);
+    ret = njs_value_to_object(vm, njs_value_arg(&iargs.value));
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
-    iargs.argument = njs_arg(args, nargs, 1);
+    njs_value_assign(&iargs.argument, njs_arg(args, nargs, 1));
 
-    ret = njs_value_length(vm, iargs.value, &length);
+    ret = njs_value_length(vm, njs_value_arg(&iargs.value), &length);
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
@@ -2355,13 +2350,12 @@ njs_array_prototype_reverse_iterator(njs_vm_t *vm, njs_value_t *args,
             return NJS_ERROR;
         }
 
-        njs_set_invalid(&accumulator);
 
         iargs.function = njs_function(njs_argument(args, 1));
-        iargs.argument = &accumulator;
+        njs_value_invalid_set(njs_value_arg(&iargs.argument));
 
         if (nargs > 2) {
-            accumulator = *njs_argument(args, 2);
+            njs_value_assign(&iargs.argument, njs_argument(args, 2));
 
         } else if (length == 0) {
             goto done;
@@ -2392,12 +2386,12 @@ done:
 
     case NJS_ARRAY_REDUCE_RIGHT:
     default:
-        if (!njs_is_valid(&accumulator)) {
+        if (!njs_value_is_valid(njs_value_arg(&iargs.argument))) {
             njs_type_error(vm, "Reduce of empty object with no initial value");
             return NJS_ERROR;
         }
 
-        njs_value_assign(retval, &accumulator);
+        njs_value_assign(retval, njs_value_arg(&iargs.argument));
         break;
     }
 
index 48c52eb48de6d9388b74b4af035f0b902b45cfb9..a78d1ace6543bfaa6c49f74167ccffbe7fc110fe 100644 (file)
@@ -298,12 +298,12 @@ njs_object_iterate(njs_vm_t *vm, njs_iterator_args_t *args,
     int64_t             length, i, from, to;
     njs_int_t           ret;
     njs_array_t         *array, *keys;
-    njs_value_t         *value, *entry, prop, character, string_obj;
+    njs_value_t         *value, *entry, prop, character;
     const u_char        *p, *end, *pos;
     njs_string_prop_t   string_prop;
     njs_object_value_t  *object;
 
-    value = args->value;
+    value = njs_value_arg(&args->value);
     from = args->from;
     to = args->to;
 
@@ -354,9 +354,7 @@ njs_object_iterate(njs_vm_t *vm, njs_iterator_args_t *args,
                 return NJS_ERROR;
             }
 
-            njs_set_object_value(&string_obj, object);
-
-            args->value = &string_obj;
+            njs_set_object_value(njs_value_arg(&args->value), object);
         }
         else {
             value = njs_object_value(value);
@@ -460,12 +458,12 @@ njs_object_iterate_reverse(njs_vm_t *vm, njs_iterator_args_t *args,
     int64_t             i, from, to, length;
     njs_int_t           ret;
     njs_array_t         *array, *keys;
-    njs_value_t         *entry, *value, prop, character, string_obj;
+    njs_value_t         *entry, *value, prop, character;
     const u_char        *p, *end, *pos;
     njs_string_prop_t   string_prop;
     njs_object_value_t  *object;
 
-    value = args->value;
+    value = njs_value_arg(&args->value);
     from = args->from;
     to = args->to;
 
@@ -518,9 +516,7 @@ njs_object_iterate_reverse(njs_vm_t *vm, njs_iterator_args_t *args,
                 return NJS_ERROR;
             }
 
-            njs_set_object_value(&string_obj, object);
-
-            args->value = &string_obj;
+            njs_set_object_value(njs_value_arg(&args->value), object);
         }
         else {
             value = njs_object_value(value);
@@ -640,13 +636,13 @@ njs_iterator_object_handler(njs_vm_t *vm, njs_iterator_handler_t handler,
     njs_value_t  prop, *entry;
 
     if (key != NULL) {
-        ret = njs_value_property(vm, args->value, key, &prop);
+        ret = njs_value_property(vm, njs_value_arg(&args->value), key, &prop);
         if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
 
     } else {
-        ret = njs_value_property_i64(vm, args->value, i, &prop);
+        ret = njs_value_property_i64(vm, njs_value_arg(&args->value), i, &prop);
         if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
@@ -687,7 +683,7 @@ njs_iterator_to_array(njs_vm_t *vm, njs_value_t *iterator, njs_value_t *retval)
         return NULL;
     }
 
-    args.value = iterator;
+    njs_value_assign(&args.value, iterator);
     args.to = length;
 
     ret = njs_object_iterate(vm, &args, njs_iterator_to_array_handler, retval);
index 7baf1dcf2a4d5a5db5f2159be9fab0524488a6f2..f04fa9315c720c592e0394485eb9a2e1b6aa4ae2 100644 (file)
@@ -9,14 +9,14 @@
 
 
 typedef struct {
-    njs_function_t  *function;
-    njs_value_t     *argument;
-    njs_value_t     *value;
+    njs_function_t      *function;
+    njs_opaque_value_t  argument;
+    njs_opaque_value_t  value;
 
-    void            *data;
+    void                *data;
 
-    int64_t         from;
-    int64_t         to;
+    int64_t             from;
+    int64_t             to;
 } njs_iterator_args_t;
 
 
index 0f31b1d7e824b8a116408f6a720110e7049be123..871f7fed65933273ad1b733eeb8aab856ddb5a19 100644 (file)
@@ -1337,7 +1337,7 @@ njs_promise_perform_all(njs_vm_t *vm, njs_value_t *iterator,
 
     (*pargs->remaining) = 1;
 
-    pargs->args.value = iterator;
+    njs_value_assign(&pargs->args.value, iterator);
     pargs->args.to = length;
 
     ret = njs_object_iterate(vm, &pargs->args, handler, retval);
@@ -1785,7 +1785,7 @@ njs_promise_race(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     pargs.function = njs_function(&resolve);
     pargs.constructor = promise_ctor;
 
-    pargs.args.value = iterator;
+    njs_value_assign(&pargs.args.value, iterator);
     pargs.args.to = length;
 
     ret = njs_object_iterate(vm, &pargs.args, njs_promise_perform_race_handler,