]> git.kaiwu.me - njs.git/commitdiff
Introduced njs_object_to_string().
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 16 Sep 2022 00:56:35 +0000 (17:56 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 16 Sep 2022 00:56:35 +0000 (17:56 -0700)
src/njs_object.c
src/njs_object.h

index 31bd2b1967a0675ae27704a442faccd60dd908ee..ff74ffe43e2a871326b7c66df882254d86484a2d 100644 (file)
@@ -2342,18 +2342,24 @@ static const njs_value_t  njs_object_arguments_string =
 njs_int_t
 njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused)
+{
+    return njs_object_to_string(vm, &args[0], &vm->retval);
+}
+
+
+njs_int_t
+njs_object_to_string(njs_vm_t *vm, njs_value_t *this, njs_value_t *retval)
 {
     u_char             *p;
     njs_int_t          ret;
-    njs_value_t        tag, *this;
+    njs_value_t        tag;
     njs_string_prop_t  string;
     const njs_value_t  *name;
 
-    this = njs_argument(args, 0);
-
     if (njs_is_null_or_undefined(this)) {
-        vm->retval = njs_is_null(this) ? njs_object_null_string
-                                       : njs_object_undefined_string;
+        njs_value_assign(retval,
+                         njs_is_null(this) ? &njs_object_null_string
+                                           : &njs_object_undefined_string);
 
         return NJS_OK;
     }
@@ -2418,14 +2424,14 @@ njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
             return NJS_ERROR;
         }
 
-        vm->retval = *name;
+        njs_value_assign(retval, name);
 
         return NJS_OK;
     }
 
     (void) njs_string_prop(&string, &tag);
 
-    p = njs_string_alloc(vm, &vm->retval, string.size + njs_length("[object ]"),
+    p = njs_string_alloc(vm, retval, string.size + njs_length("[object ]"),
                          string.length + njs_length("[object ]"));
     if (njs_slow_path(p == NULL)) {
         return NJS_ERROR;
index db075edb2aa4f97fe947843d0082a8cce99888c0..90cf923589f4d3f1ac4f8d5a6e96b7d1104819e9 100644 (file)
@@ -65,6 +65,8 @@ njs_int_t njs_object_prototype_create_constructor(njs_vm_t *vm,
     njs_value_t *retval);
 njs_value_t *njs_property_constructor_set(njs_vm_t *vm, njs_lvlhsh_t *hash,
     njs_value_t *constructor);
+njs_int_t njs_object_to_string(njs_vm_t *vm, njs_value_t *value,
+    njs_value_t *retval);
 njs_int_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused);
 njs_int_t njs_object_length(njs_vm_t *vm, njs_value_t *value, int64_t *dst);
@@ -186,7 +188,8 @@ njs_primitive_value_to_key(njs_vm_t *vm, njs_value_t *dst,
 
 
 njs_inline njs_int_t
-njs_value_to_key(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
+njs_value_to_key2(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value,
+    njs_bool_t convert)
 {
     njs_int_t    ret;
     njs_value_t  primitive;
@@ -197,7 +200,13 @@ njs_value_to_key(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
             value = njs_object_value(value);
 
         } else {
-            ret = njs_value_to_primitive(vm, &primitive, value, 1);
+            if (convert) {
+                ret = njs_value_to_primitive(vm, &primitive, value, 1);
+
+            } else {
+                ret = njs_object_to_string(vm, value, &primitive);
+            }
+
             if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
@@ -210,6 +219,13 @@ njs_value_to_key(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
 }
 
 
+njs_inline njs_int_t
+njs_value_to_key(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
+{
+    return njs_value_to_key2(vm, dst, value, 1);
+}
+
+
 njs_inline njs_int_t
 njs_key_string_get(njs_vm_t *vm, njs_value_t *key, njs_str_t *str)
 {