]> git.kaiwu.me - njs.git/commitdiff
Change: removed byte strings API.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 18 May 2024 04:54:50 +0000 (21:54 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 18 May 2024 04:54:50 +0000 (21:54 -0700)
These functions are unsafe because they produce byte strings.
Byte strings may not work as expected with the existing JS methods.

The following functions were removed:
    - njs_vm_value_string_set() use njs_vm_value_string_create() as a
    drop-in replacement.
    - njs_vm_value_string_alloc() use njs_chb_t and
    njs_vm_value_string_create_chb() instead.

This fixes #710 on Github.

16 files changed:
external/njs_query_string_module.c
external/njs_shell.c
external/njs_webcrypto_module.c
external/njs_xml_module.c
nginx/ngx_http_js_module.c
nginx/ngx_js.c
nginx/ngx_js.h
nginx/ngx_js_fetch.c
nginx/ngx_js_shared_dict.c
nginx/ngx_stream_js_module.c
src/njs.h
src/njs_string.c
src/njs_vm.c
src/test/njs_benchmark.c
src/test/njs_externals_test.c
src/test/njs_unit_test.c

index f61bb97a041332d3dd3c956f5f04527cfa39d8d2..f9b7c552a5c47ac9d61204769b079b017d7a1436 100644 (file)
@@ -694,7 +694,7 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     object = njs_arg(args, nargs, 1);
 
     if (njs_slow_path(!njs_value_is_object(object))) {
-        njs_vm_value_string_set(vm, retval, (u_char *) "", 0);
+        njs_vm_value_string_create(vm, retval, (u_char *) "", 0);
         return NJS_OK;
     }
 
index cc4bf8e4892cd73bb20fddc97ce92345726b5dd2..e00f2529bb32cb705c08ca7d721e3a19256cb420 100644 (file)
@@ -1579,8 +1579,8 @@ njs_engine_njs_complete(njs_engine_t *engine, njs_str_t *expression)
 
         while (p < end && *p != '.') { p++; }
 
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&key), start,
-                                      p - start);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&key), start,
+                                         p - start);
         if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
index b8adc0b2435a6eb7e413cc9bc960e4de6ceb537f..d4725d89ef23394c9ebdd8755618772de93371c8 100644 (file)
@@ -1855,7 +1855,7 @@ njs_export_jwk_rsa(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
         return NJS_ERROR;
     }
 
-    njs_vm_value_string_set(vm, njs_value_arg(&rsa_s), (u_char *) "RSA", 3);
+    njs_vm_value_string_create(vm, njs_value_arg(&rsa_s), (u_char *) "RSA", 3);
 
     ret = njs_vm_object_prop_set(vm, retval, &string_kty, &rsa_s);
     if (ret != NJS_OK) {
@@ -1909,8 +1909,8 @@ njs_export_jwk_rsa(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
 
     nm = &njs_webcrypto_alg_name[key->alg->type][key->hash];
 
-    (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start,
-                                   nm->length);
+    (void) njs_vm_value_string_create(vm, njs_value_arg(&alg), nm->start,
+                                      nm->length);
 
     return njs_vm_object_prop_set(vm, retval, &string_alg, &alg);
 }
@@ -1975,8 +1975,8 @@ njs_export_jwk_ec(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
     nid = EC_GROUP_get_curve_name(group);
 
     cname = njs_algorithm_curve_name(nid);
-    (void) njs_vm_value_string_set(vm, njs_value_arg(&name),
-                                   cname->start, cname->length);
+    (void) njs_vm_value_string_create(vm, njs_value_arg(&name),
+                                      cname->start, cname->length);
 
     if (cname->length == 0) {
         njs_vm_type_error(vm, "Unsupported JWK EC curve: %s", OBJ_nid2sn(nid));
@@ -1988,7 +1988,7 @@ njs_export_jwk_ec(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
         goto fail;
     }
 
-    njs_vm_value_string_set(vm, njs_value_arg(&ec_s), (u_char *) "EC", 2);
+    njs_vm_value_string_create(vm, njs_value_arg(&ec_s), (u_char *) "EC", 2);
 
     ret = njs_vm_object_prop_set(vm, retval, &string_kty, &ec_s);
     if (ret != NJS_OK) {
@@ -2154,8 +2154,8 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
 
     if (key->alg->type == NJS_ALGORITHM_HMAC) {
         nm = &njs_webcrypto_alg_name[type][key->hash];
-        (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start,
-                                       nm->length);
+        (void) njs_vm_value_string_create(vm, njs_value_arg(&alg), nm->start,
+                                          nm->length);
 
     } else {
         switch (key->u.s.raw.length) {
@@ -2164,8 +2164,8 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
         case 32:
             nm = &njs_webcrypto_alg_aes_name
                  [type - NJS_ALGORITHM_AES_GCM][(key->u.s.raw.length - 16) / 8];
-            (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start,
-                                           nm->length);
+            (void) njs_vm_value_string_create(vm, njs_value_arg(&alg),
+                                              nm->start, nm->length);
             break;
 
         default:
@@ -2186,7 +2186,7 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval)
         return NJS_ERROR;
     }
 
-    njs_vm_value_string_set(vm, njs_value_arg(&oct_s), (u_char *) "oct", 3);
+    njs_vm_value_string_create(vm, njs_value_arg(&oct_s), (u_char *) "oct", 3);
 
     ret = njs_vm_object_prop_set(vm, retval, &string_kty, &oct_s);
     if (ret != NJS_OK) {
@@ -4150,14 +4150,14 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
     }
 
     name = &njs_webcrypto_alg[key->alg->type].name;
-    ret = njs_vm_value_string_set(vm, njs_value_arg(&alg), name->start,
-                                  name->length);
+    ret = njs_vm_value_string_create(vm, njs_value_arg(&alg), name->start,
+                                     name->length);
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
-    (void) njs_vm_value_string_set(vm, njs_value_arg(&name_s),
-                                   (u_char *) "name", njs_length("name"));
+    (void) njs_vm_value_string_create(vm, njs_value_arg(&name_s),
+                                     (u_char *) "name", njs_length("name"));
 
     ret = njs_vm_object_alloc(vm, retval, &name_s, &alg, NULL);
     if (njs_slow_path(ret != NJS_OK)) {
@@ -4203,8 +4203,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
         }
 
         name = njs_algorithm_hash_name(key->hash);
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&hash), name->start,
-                                      name->length);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&hash), name->start,
+                                         name->length);
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -4252,8 +4252,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
 
         name = njs_algorithm_curve_name(EC_GROUP_get_curve_name(group));
 
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&val), name->start,
-                                      name->length);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&val), name->start,
+                                         name->length);
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -4270,8 +4270,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
         /* HmacKeyGenParams */
 
         name = njs_algorithm_hash_name(key->hash);
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&val), name->start,
-                                      name->length);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&val), name->start,
+                                         name->length);
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -4320,12 +4320,12 @@ njs_key_ext_type(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
     }
 
     if (key->alg->raw) {
-        (void) njs_vm_value_string_set(vm, retval, (u_char *) "secret",
-                                       njs_length("secret"));
+        (void) njs_vm_value_string_create(vm, retval, (u_char *) "secret",
+                                          njs_length("secret"));
     } else {
         type = key->u.a.privat ? "private": "public";
-        (void) njs_vm_value_string_set(vm, retval, (u_char *) type,
-                                       key->u.a.privat ? 7 : 6);
+        (void) njs_vm_value_string_create(vm, retval, (u_char *) type,
+                                          key->u.a.privat ? 7 : 6);
     }
 
     return NJS_OK;
@@ -4544,8 +4544,8 @@ njs_key_ops(njs_vm_t *vm, njs_value_t *retval, unsigned mask)
                 return NJS_ERROR;
             }
 
-            ret = njs_vm_value_string_set(vm, value, e->name.start,
-                                          e->name.length);
+            ret = njs_vm_value_string_create(vm, value, e->name.start,
+                                             e->name.length);
             if (ret != NJS_OK) {
                 return NJS_ERROR;
             }
index 7fbc21a8ffdec7a1d40ea404f9664167bfee229b..86c896c0e1bd1a32ae736dc8cfc592a4269d8c36 100644 (file)
@@ -584,8 +584,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, push, (u_char *) "$name",
-                                      njs_length("$name"));
+        ret = njs_vm_value_string_create(vm, push, (u_char *) "$name",
+                                         njs_length("$name"));
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -597,8 +597,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, push, (u_char *) "$ns",
-                                      njs_length("$ns"));
+        ret = njs_vm_value_string_create(vm, push, (u_char *) "$ns",
+                                         njs_length("$ns"));
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -610,8 +610,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, push, (u_char *) "$attrs",
-                                      njs_length("$attrs"));
+        ret = njs_vm_value_string_create(vm, push, (u_char *) "$attrs",
+                                         njs_length("$attrs"));
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -623,8 +623,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, push, (u_char *) "$text",
-                                      njs_length("$text"));
+        ret = njs_vm_value_string_create(vm, push, (u_char *) "$text",
+                                         njs_length("$text"));
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -640,8 +640,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, push, (u_char *) "$tags",
-                                      njs_length("$tags"));
+        ret = njs_vm_value_string_create(vm, push, (u_char *) "$tags",
+                                         njs_length("$tags"));
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
index d280ca0f653f05362f0d6186bd83506b48a720bc..fd3c1742c6c818011049759db3d1085fb60845fa 100644 (file)
@@ -1144,8 +1144,8 @@ ngx_http_js_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
 
     njs_value_assign(&arguments[0], &ctx->request);
 
-    njs_vm_value_string_set(ctx->vm, njs_value_arg(&last_key),
-                            last_str.start, last_str.length);
+    njs_vm_value_string_create(ctx->vm, njs_value_arg(&last_key),
+                               last_str.start, last_str.length);
 
     while (in != NULL) {
         ctx->buf = in->buf;
@@ -1474,7 +1474,7 @@ ngx_http_js_ext_keys_header(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys,
                 return NJS_ERROR;
             }
 
-            rc = njs_vm_value_string_set(vm, value, h->key.data, h->key.len);
+            rc = njs_vm_value_string_create(vm, value, h->key.data, h->key.len);
             if (rc != NJS_OK) {
                 return NJS_ERROR;
             }
@@ -1586,7 +1586,7 @@ ngx_http_js_ext_raw_header(njs_vm_t *vm, njs_object_prop_t *prop,
             return NJS_ERROR;
         }
 
-        rc = njs_vm_value_string_set(vm, elem, h->key.data, h->key.len);
+        rc = njs_vm_value_string_create(vm, elem, h->key.data, h->key.len);
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -1596,7 +1596,7 @@ ngx_http_js_ext_raw_header(njs_vm_t *vm, njs_object_prop_t *prop,
             return NJS_ERROR;
         }
 
-        rc = njs_vm_value_string_set(vm, elem, h->value.data, h->value.len);
+        rc = njs_vm_value_string_create(vm, elem, h->value.data, h->value.len);
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -1703,7 +1703,8 @@ ngx_http_js_header_single(njs_vm_t *vm, ngx_http_request_t *r,
             return NJS_DECLINED;
         }
 
-        rc = njs_vm_value_string_set(vm, retval, h->value.data, h->value.len);
+        rc = njs_vm_value_string_create(vm, retval, h->value.data,
+                                        h->value.len);
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -1845,8 +1846,8 @@ ngx_http_js_header_array(njs_vm_t *vm, ngx_http_request_t *r,
                 return NJS_ERROR;
             }
 
-            rc = njs_vm_value_string_set(vm, value, h->value.data,
-                                         h->value.len);
+            rc = njs_vm_value_string_create(vm, value, h->value.data,
+                                            h->value.len);
             if (rc != NJS_OK) {
                 return NJS_ERROR;
             }
@@ -1934,7 +1935,7 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_http_request_t *r,
             return NJS_DECLINED;
         }
 
-        return njs_vm_value_string_set(vm, retval, start, p - start);
+        return njs_vm_value_string_create(vm, retval, start, p - start);
     }
 
     header = part->elts;
@@ -2110,8 +2111,8 @@ ngx_http_js_ext_keys_header_out(njs_vm_t *vm, njs_value_t *value,
             return NJS_ERROR;
         }
 
-        rc = njs_vm_value_string_set(vm, value, (u_char *) "Content-Type",
-                                     njs_length("Content-Type"));
+        rc = njs_vm_value_string_create(vm, value, (u_char *) "Content-Type",
+                                        njs_length("Content-Type"));
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -2125,8 +2126,8 @@ ngx_http_js_ext_keys_header_out(njs_vm_t *vm, njs_value_t *value,
             return NJS_ERROR;
         }
 
-        rc = njs_vm_value_string_set(vm, value, (u_char *) "Content-Length",
-                                     njs_length("Content-Length"));
+        rc = njs_vm_value_string_create(vm, value, (u_char *) "Content-Length",
+                                        njs_length("Content-Length"));
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -2573,7 +2574,7 @@ ngx_http_js_ext_get_http_version(njs_vm_t *vm, njs_object_prop_t *prop,
         break;
     }
 
-    return njs_vm_value_string_set(vm, retval, v.data, v.len);
+    return njs_vm_value_string_create(vm, retval, v.data, v.len);
 }
 
 
@@ -2610,8 +2611,8 @@ ngx_http_js_ext_get_remote_address(njs_vm_t *vm, njs_object_prop_t *prop,
 
     c = r->connection;
 
-    return njs_vm_value_string_set(vm, retval, c->addr_text.data,
-                                   c->addr_text.len);
+    return njs_vm_value_string_create(vm, retval, c->addr_text.data,
+                                      c->addr_text.len);
 }
 
 
@@ -2819,52 +2820,36 @@ static njs_int_t
 ngx_http_js_header_in_array(njs_vm_t *vm, ngx_http_request_t *r,
     ngx_array_t *array, u_char sep, njs_value_t *retval)
 {
-    u_char            *p, *end;
-    size_t             len;
+    njs_chb_t          chain;
+    njs_int_t          ret;
     ngx_uint_t         i, n;
     ngx_table_elt_t  **hh;
 
     n = array->nelts;
     hh = array->elts;
 
-    len = 0;
-
-    for (i = 0; i < n; i++) {
-        len += hh[i]->value.len + 1;
-    }
-
-    if (len == 0) {
+    if (n == 0) {
         njs_value_undefined_set(retval);
         return NJS_DECLINED;
     }
 
-    len -= 1;
-
     if (n == 1) {
-        return njs_vm_value_string_set(vm, retval, (*hh)->value.data,
-                                       (*hh)->value.len);
-    }
-
-    p = njs_vm_value_string_alloc(vm, retval, len);
-    if (p == NULL) {
-        return NJS_ERROR;
+        return njs_vm_value_string_create(vm, retval, (*hh)->value.data,
+                                              (*hh)->value.len);
     }
 
-    end = p + len;
+    NJS_CHB_MP_INIT(&chain, vm);
 
+    for (i = 0; i < n; i++) {
+        njs_chb_append(&chain, hh[i]->value.data, hh[i]->value.len);
+        njs_chb_append(&chain, &sep, 1);
+    }
 
-    for (i = 0; /* void */ ; i++) {
+    ret = njs_vm_value_string_create_chb(vm, retval, &chain);
 
-        p = ngx_copy(p, hh[i]->value.data, hh[i]->value.len);
+    njs_chb_destroy(&chain);
 
-        if (p == end) {
-            break;
-        }
-
-        *p++ = sep;
-    }
-
-    return NJS_OK;
+    return ret;
 }
 #else
 static njs_int_t
@@ -3889,9 +3874,9 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_http_request_t *r,
     ngx_list_t *headers, ngx_table_elt_t **ph, unsigned flags, njs_str_t *name,
     njs_value_t *retval)
 {
-    u_char           *p, sep;
-    ssize_t           size;
-    njs_int_t         rc;
+    u_char            sep;
+    njs_chb_t         chain;
+    njs_int_t         rc, ret;
     ngx_uint_t        i;
     njs_value_t      *value;
     ngx_list_part_t  *part;
@@ -3949,8 +3934,8 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_http_request_t *r,
                 return NJS_ERROR;
             }
 
-            rc = njs_vm_value_string_set(vm, value, h->value.data,
-                                         h->value.len);
+            rc = njs_vm_value_string_create(vm, value, h->value.data,
+                                            h->value.len);
             if (rc != NJS_OK) {
                 return NJS_ERROR;
             }
@@ -3960,34 +3945,25 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_http_request_t *r,
     }
 
     if ((*ph)->next == NULL || flags & NJS_HEADER_SINGLE) {
-        return njs_vm_value_string_set(vm, retval, (*ph)->value.data,
-                                       (*ph)->value.len);
+        return njs_vm_value_string_create(vm, retval, (*ph)->value.data,
+                                          (*ph)->value.len);
     }
 
-    size = - (ssize_t) njs_length("; ");
-
-    for (h = *ph; h; h = h->next) {
-        size += h->value.len + njs_length("; ");
-    }
-
-    p = njs_vm_value_string_alloc(vm, retval, size);
-    if (p == NULL) {
-        return NJS_ERROR;
-    }
+    NJS_CHB_MP_INIT(&chain, vm);
 
     sep = flags & NJS_HEADER_SEMICOLON ? ';' : ',';
 
     for (h = *ph; h; h = h->next) {
-        p = ngx_copy(p, h->value.data, h->value.len);
+        njs_chb_append(&chain, h->value.data, h->value.len);
+        njs_chb_append(&chain, &sep, 1);
+        njs_chb_append_literal(&chain, " ");
+    }
 
-        if (h->next == NULL) {
-            break;
-        }
+    ret = njs_vm_value_string_create_chb(vm, retval, &chain);
 
-        *p++ = sep; *p++ = ' ';
-    }
+    njs_chb_destroy(&chain);
 
-    return NJS_OK;
+    return ret;
 }
 #endif
 
@@ -4016,7 +3992,7 @@ static njs_int_t
 ngx_http_js_content_length(njs_vm_t *vm, ngx_http_request_t *r,
     unsigned flags, njs_str_t *v, njs_value_t *setval, njs_value_t *retval)
 {
-    u_char           *p, *start;
+    u_char           *p;
     njs_int_t         rc;
     ngx_int_t         n;
     ngx_table_elt_t  *h;
@@ -4028,14 +4004,8 @@ ngx_http_js_content_length(njs_vm_t *vm, ngx_http_request_t *r,
         {
             p = ngx_sprintf(content_len, "%O", r->headers_out.content_length_n);
 
-            start = njs_vm_value_string_alloc(vm, retval, p - content_len);
-            if (start == NULL) {
-                return NJS_ERROR;
-            }
-
-            ngx_memcpy(start, content_len, p - content_len);
-
-            return NJS_OK;
+            return njs_vm_value_string_create(vm, retval, content_len,
+                                              p - content_len);
         }
     }
 
@@ -4084,7 +4054,7 @@ ngx_http_js_content_type(njs_vm_t *vm, ngx_http_request_t *r,
             return NJS_OK;
         }
 
-        return njs_vm_value_string_set(vm, retval, hdr->data, hdr->len);
+        return njs_vm_value_string_create(vm, retval, hdr->data, hdr->len);
     }
 
     if (setval != NULL && njs_value_is_array(setval)) {
index d171995129ea6ce05db50ca0bd36650aa5620d15..aa5e71cc66652db5c7f9943afaacd1bc92e23950 100644 (file)
@@ -668,7 +668,7 @@ ngx_js_ext_string(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
 
     field = (ngx_str_t *) (p + njs_vm_prop_magic32(prop));
 
-    return njs_vm_value_string_set(vm, retval, field->data, field->len);
+    return njs_vm_value_string_create(vm, retval, field->data, field->len);
 }
 
 
@@ -745,15 +745,15 @@ njs_int_t
 ngx_js_ext_build(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval,
+    return njs_vm_value_string_create(vm, retval,
 #ifdef NGX_BUILD
-                                   (u_char *) NGX_BUILD,
-                                   njs_strlen(NGX_BUILD)
+                                      (u_char *) NGX_BUILD,
+                                      njs_strlen(NGX_BUILD)
 #else
-                                   (u_char *) "",
-                                   0
+                                      (u_char *) "",
+                                      0
 #endif
-                                   );
+                                     );
 }
 
 
@@ -761,8 +761,8 @@ njs_int_t
 ngx_js_ext_conf_file_path(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, ngx_cycle->conf_file.data,
-                                   ngx_cycle->conf_file.len);
+    return njs_vm_value_string_create(vm, retval, ngx_cycle->conf_file.data,
+                                      ngx_cycle->conf_file.len);
 }
 
 
@@ -770,8 +770,8 @@ njs_int_t
 ngx_js_ext_conf_prefix(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, ngx_cycle->conf_prefix.data,
-                                   ngx_cycle->conf_prefix.len);
+    return njs_vm_value_string_create(vm, retval, ngx_cycle->conf_prefix.data,
+                                      ngx_cycle->conf_prefix.len);
 }
 
 
@@ -779,8 +779,8 @@ njs_int_t
 ngx_js_ext_error_log_path(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, ngx_cycle->error_log.data,
-                                   ngx_cycle->error_log.len);
+    return njs_vm_value_string_create(vm, retval, ngx_cycle->error_log.data,
+                                      ngx_cycle->error_log.len);
 }
 
 
@@ -788,8 +788,8 @@ njs_int_t
 ngx_js_ext_prefix(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, ngx_cycle->prefix.data,
-                                   ngx_cycle->prefix.len);
+    return njs_vm_value_string_create(vm, retval, ngx_cycle->prefix.data,
+                                      ngx_cycle->prefix.len);
 }
 
 
@@ -797,8 +797,8 @@ njs_int_t
 ngx_js_ext_version(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, (u_char *) NGINX_VERSION,
-                                   njs_strlen(NGINX_VERSION));
+    return njs_vm_value_string_create(vm, retval, (u_char *) NGINX_VERSION,
+                                      njs_strlen(NGINX_VERSION));
 }
 
 
index a84058f360f3fc6746c32784624ca07fbb2b8dda..189d4878f1af73ffb5740c5b4b682a40575027db 100644 (file)
@@ -175,7 +175,7 @@ struct ngx_js_ctx_s {
 
 
 #define ngx_js_prop(vm, type, value, start, len)                              \
-    ((type == NGX_JS_STRING) ? njs_vm_value_string_set(vm, value, start, len) \
+    ((type == NGX_JS_STRING) ? njs_vm_value_string_create(vm, value, start, len) \
                              : njs_vm_value_buffer_set(vm, value, start, len))
 
 
index b95f6d55d9451e83350e9a1bbb35e2897e36081f..feef457cb567643e2cb15d8d77bbdcd7f86a6484 100644 (file)
@@ -3237,8 +3237,8 @@ ngx_headers_js_get(njs_vm_t *vm, njs_value_t *value, njs_str_t *name,
                 return NJS_ERROR;
             }
 
-            rc = njs_vm_value_string_set(vm, value, ph->value.data,
-                                         ph->value.len);
+            rc = njs_vm_value_string_create(vm, value, ph->value.data,
+                                            ph->value.len);
             if (rc != NJS_OK) {
                 return NJS_ERROR;
             }
@@ -3283,7 +3283,7 @@ ngx_headers_js_get(njs_vm_t *vm, njs_value_t *value, njs_str_t *name,
         h = h->next;
     }
 
-    return njs_vm_value_string_set(vm, retval, data, p - data);
+    return njs_vm_value_string_create(vm, retval, data, p - data);
 }
 
 
@@ -3574,8 +3574,8 @@ ngx_headers_js_ext_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
                 return NJS_ERROR;
             }
 
-            rc = njs_vm_value_string_set(vm, value, h[i].key.data,
-                                         h[i].key.len);
+            rc = njs_vm_value_string_create(vm, value, h[i].key.data,
+                                            h[i].key.len);
             if (rc != NJS_OK) {
                 return NJS_ERROR;
             }
@@ -3709,9 +3709,9 @@ ngx_request_js_ext_body(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     case NGX_JS_BODY_JSON:
     case NGX_JS_BODY_TEXT:
     default:
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&result),
-                                      request->body.start,
-                                      request->body.length);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&result),
+                                         request->body.start,
+                                         request->body.length);
         if (ret != NJS_OK) {
             njs_vm_memory_error(vm);
             return NJS_ERROR;
@@ -3869,8 +3869,8 @@ ngx_response_js_ext_body(njs_vm_t *vm, njs_value_t *args,
     case NGX_JS_BODY_JSON:
     case NGX_JS_BODY_TEXT:
     default:
-        ret = njs_vm_value_string_set(vm, njs_value_arg(&result),
-                                      string.start, string.length);
+        ret = njs_vm_value_string_create(vm, njs_value_arg(&result),
+                                         string.start, string.length);
         if (ret != NJS_OK) {
             njs_vm_memory_error(vm);
             return NJS_ERROR;
@@ -3985,8 +3985,8 @@ ngx_response_js_ext_status_text(njs_vm_t *vm, njs_object_prop_t *prop,
         return NJS_DECLINED;
     }
 
-    njs_vm_value_string_set(vm, retval, response->status_text.start,
-                            response->status_text.length);
+    njs_vm_value_string_create(vm, retval, response->status_text.start,
+                               response->status_text.length);
 
     return NJS_OK;
 }
@@ -4004,8 +4004,8 @@ ngx_response_js_ext_type(njs_vm_t *vm, njs_object_prop_t *prop,
         return NJS_DECLINED;
     }
 
-    return njs_vm_value_string_set(vm, retval, (u_char *) "basic",
-                                   njs_length("basic"));
+    return njs_vm_value_string_create(vm, retval, (u_char *) "basic",
+                                      njs_length("basic"));
 }
 
 
@@ -4017,8 +4017,8 @@ ngx_fetch_flag(njs_vm_t *vm, const ngx_js_entry_t *entries, njs_int_t value,
 
     for (e = entries; e->name.length != 0; e++) {
         if (e->value == value) {
-            return njs_vm_value_string_set(vm, retval, e->name.start,
-                                           e->name.length);
+            return njs_vm_value_string_create(vm, retval, e->name.start,
+                                              e->name.length);
         }
     }
 
index 3c94bd585e7fd5b7079d28af1d0a6ac88779cd2e..c40a6dbdf53ee950c46df0c917fb619a388f9c09 100644 (file)
@@ -423,8 +423,8 @@ njs_js_ext_global_shared_keys(njs_vm_t *vm, njs_value_t *unused,
             return NJS_ERROR;
         }
 
-        rc = njs_vm_value_string_set(vm, value, shm_zone->shm.name.data,
-                                     shm_zone->shm.name.len);
+        rc = njs_vm_value_string_create(vm, value, shm_zone->shm.name.data,
+                                        shm_zone->shm.name.len);
         if (rc != NJS_OK) {
             return NJS_ERROR;
         }
@@ -698,8 +698,8 @@ njs_js_ext_shared_dict_keys(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
             goto fail;
         }
 
-        rc = njs_vm_value_string_set(vm, value, node->sn.str.data,
-                                     node->sn.str.len);
+        rc = njs_vm_value_string_create(vm, value, node->sn.str.data,
+                                        node->sn.str.len);
         if (rc != NJS_OK) {
             goto fail;
         }
@@ -853,8 +853,8 @@ njs_js_ext_shared_dict_items(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
             goto fail;
         }
 
-        rc = njs_vm_value_string_set(vm, value, node->sn.str.data,
-                                     node->sn.str.len);
+        rc = njs_vm_value_string_create(vm, value, node->sn.str.data,
+                                        node->sn.str.len);
         if (rc != NJS_OK) {
             goto fail;
         }
@@ -896,8 +896,8 @@ njs_js_ext_shared_dict_name(njs_vm_t *vm, njs_object_prop_t *prop,
         return NJS_DECLINED;
     }
 
-    return njs_vm_value_string_set(vm, retval, shm_zone->shm.name.data,
-                                   shm_zone->shm.name.len);
+    return njs_vm_value_string_create(vm, retval, shm_zone->shm.name.data,
+                                      shm_zone->shm.name.len);
 }
 
 
@@ -1063,7 +1063,7 @@ njs_js_ext_shared_dict_type(njs_vm_t *vm, njs_object_prop_t *prop,
         break;
     }
 
-    return njs_vm_value_string_set(vm, retval, type.start, type.length);
+    return njs_vm_value_string_create(vm, retval, type.start, type.length);
 }
 
 
@@ -1406,7 +1406,8 @@ ngx_js_dict_copy_value_locked(njs_vm_t *vm, ngx_js_dict_t *dict,
             return NGX_ERROR;
         }
 
-        ret = njs_vm_value_string_set(vm, retval, string.start, string.length);
+        ret = njs_vm_value_string_create(vm, retval, string.start,
+                                         string.length);
         if (ret != NJS_OK) {
             return NGX_ERROR;
         }
@@ -1493,8 +1494,8 @@ static njs_int_t
 ngx_js_dict_shared_error_name(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, (u_char *) "SharedMemoryError",
-                                   17);
+    return njs_vm_value_string_create(vm, retval,
+                                      (u_char *) "SharedMemoryError", 17);
 }
 
 
index b8b29a560db2e6f7c8c7e1b524a790fbfad34cb9..23c288bca8926afb3472439681709395bd137516 100644 (file)
@@ -1241,8 +1241,8 @@ ngx_stream_js_ext_get_remote_address(njs_vm_t *vm,
 
     c = s->connection;
 
-    return njs_vm_value_string_set(vm, retval, c->addr_text.data,
-                                   c->addr_text.len);
+    return njs_vm_value_string_create(vm, retval, c->addr_text.data,
+                                      c->addr_text.len);
 }
 
 
index 3a6bd7fc717fd425e00e492125c0757d53f1e1fb..2e16ce4ee9ad3294edddf1f734333c71a569da62 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -400,14 +400,6 @@ NJS_EXPORT njs_int_t njs_value_to_integer(njs_vm_t *vm, njs_value_t *value,
 
 /*  Gets string value, no copy. */
 NJS_EXPORT void njs_value_string_get(njs_value_t *value, njs_str_t *dst);
-/*
- * Sets a byte string value.
- *   start data is not copied and should not be freed.
- */
-NJS_EXPORT njs_int_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value,
-    const u_char *start, uint32_t size);
-NJS_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value,
-    uint32_t size);
 NJS_EXPORT njs_int_t njs_vm_value_string_create(njs_vm_t *vm,
     njs_value_t *value, const u_char *start, uint32_t size);
 NJS_EXPORT njs_int_t njs_vm_value_string_create_chb(njs_vm_t *vm,
index 2549491af0bfe493b4d7d8489121f731c96e43f5..702d652d4350869915396f305ef9a1b6eb1355e9 100644 (file)
@@ -3152,7 +3152,7 @@ njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched,
 
             p += 2;
 
-            ret = njs_vm_value_string_set(vm, &name, p, r - p);
+            ret = njs_string_create(vm, &name, (const char *) p, r - p);
             if (njs_slow_path(ret != NJS_OK)) {
                 goto exception;
             }
index f9c798aa2d9aea5572f4a474d08338f178c2fb05..9e4125f8ee6676fafd106d7a75479aa67941033f 100644 (file)
@@ -945,14 +945,6 @@ njs_value_string_get(njs_value_t *value, njs_str_t *dst)
 }
 
 
-njs_int_t
-njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
-    uint32_t size)
-{
-    return njs_string_set(vm, value, start, size);
-}
-
-
 njs_int_t
 njs_vm_value_array_buffer_set(njs_vm_t *vm, njs_value_t *value,
     const u_char *start, uint32_t size)
@@ -981,13 +973,6 @@ njs_vm_value_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
 }
 
 
-u_char *
-njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size)
-{
-    return njs_string_alloc(vm, value, size, 0);
-}
-
-
 njs_int_t
 njs_vm_value_string_create(njs_vm_t *vm, njs_value_t *value,
     const u_char *start, uint32_t size)
@@ -1342,7 +1327,7 @@ njs_vm_object_prop(njs_vm_t *vm, njs_value_t *value, const njs_str_t *prop,
         return NULL;
     }
 
-    ret = njs_vm_value_string_set(vm, &key, prop->start, prop->length);
+    ret = njs_vm_value_string_create(vm, &key, prop->start, prop->length);
     if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
@@ -1368,7 +1353,7 @@ njs_vm_object_prop_set(njs_vm_t *vm, njs_value_t *value, const njs_str_t *prop,
         return NJS_ERROR;
     }
 
-    ret = njs_vm_value_string_set(vm, &key, prop->start, prop->length);
+    ret = njs_vm_value_string_create(vm, &key, prop->start, prop->length);
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
index d22ccae3a9904cf78cff30322e6dbcae40fe1be6..ac684b8f7bb66cb2d0cd1a371c4b2e1f787099ab 100644 (file)
@@ -188,10 +188,10 @@ njs_benchmark_test(njs_vm_t *parent, njs_opts_t *opts, njs_value_t *report,
         goto done;
     }
 
-    ret = njs_vm_value_string_set(parent, &name, (u_char *) test->name,
-                                  njs_strlen(test->name));
+    ret = njs_vm_value_string_create(parent, &name, (u_char *) test->name,
+                                     njs_strlen(test->name));
     if (ret != NJS_OK) {
-        njs_printf("njs_vm_value_string_set() failed\n");
+        njs_printf("njs_vm_value_string_create() failed\n");
         goto done;
     }
 
@@ -595,10 +595,10 @@ main(int argc, char **argv)
     }
 
     if (opts.previous) {
-        ret = njs_vm_value_string_set(vm, &args[0], (u_char *) opts.previous,
-                                      njs_strlen(opts.previous));
+        ret = njs_vm_value_string_create(vm, &args[0], (u_char *) opts.previous,
+                                         njs_strlen(opts.previous));
         if (ret != NJS_OK) {
-            njs_printf("njs_vm_value_string_set() failed\n");
+            njs_printf("njs_vm_value_string_create() failed\n");
             goto done;
         }
 
index f9fa6dbf50aa31e09e69105ede451b31ce11d9ec..7dcad90b0e83f145fd962d5e9fdce75068dd8cc7 100644 (file)
@@ -158,7 +158,7 @@ njs_unit_test_r_uri(njs_vm_t *vm, njs_object_prop_t *prop,
         return njs_vm_value_to_bytes(vm, field, setval);
     }
 
-    return njs_vm_value_string_set(vm, retval, field->start, field->length);
+    return njs_vm_value_string_create(vm, retval, field->start, field->length);
 }
 
 
@@ -178,7 +178,7 @@ njs_unit_test_r_a(njs_vm_t *vm, njs_object_prop_t *prop,
 
     p = njs_sprintf(buf, buf + njs_length(buf), "%uD", r->a);
 
-    return njs_vm_value_string_set(vm, retval, buf, p - buf);
+    return njs_vm_value_string_create(vm, retval, buf, p - buf);
 }
 
 
@@ -214,7 +214,7 @@ static njs_int_t
 njs_unit_test_r_host(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
+    return njs_vm_value_string_create(vm, retval, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
 }
 
 
@@ -264,7 +264,7 @@ njs_unit_test_r_vars(njs_vm_t *vm, njs_object_prop_t *self,
 
     if (setval != NULL) {
         /* Set. */
-        njs_vm_value_string_set(vm, &name, lhq.key.start, lhq.key.length);
+        njs_vm_value_string_create(vm, &name, lhq.key.start, lhq.key.length);
         prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, setval);
         if (prop == NULL) {
             njs_memory_error(vm);
@@ -313,24 +313,22 @@ static njs_int_t
 njs_unit_test_r_header(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *unused, njs_value_t *retval)
 {
-    u_char     *p;
-    uint32_t   size;
     njs_int_t  ret;
     njs_str_t  h;
+    njs_chb_t  chain;
 
     ret = njs_vm_prop_name(vm, prop, &h);
     if (ret == NJS_OK) {
-        size = 7 + h.length;
+        NJS_CHB_MP_INIT(&chain, vm);
 
-        p = njs_vm_value_string_alloc(vm, retval, size);
-        if (p == NULL) {
-            return NJS_ERROR;
-        }
+        njs_chb_append(&chain, h.start, h.length);
+        njs_chb_append(&chain, (u_char *) "|АБВ", njs_length("|АБВ"));
 
-        p = njs_cpymem(p, h.start, h.length);
-        *p++ = '|';
-        memcpy(p, "АБВ", njs_length("АБВ"));
-        return NJS_OK;
+        ret = njs_vm_value_string_create_chb(vm, retval, &chain);
+
+        njs_chb_destroy(&chain);
+
+        return ret;
     }
 
     njs_value_undefined_set(retval);
@@ -360,7 +358,7 @@ njs_unit_test_r_header_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
             return NJS_ERROR;
         }
 
-        (void) njs_vm_value_string_set(vm, push, k, 2);
+        (void) njs_vm_value_string_create(vm, push, k, 2);
 
         k[1]++;
     }
@@ -385,7 +383,8 @@ njs_unit_test_r_method(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     ret = njs_vm_value_to_bytes(vm, &s, njs_arg(args, nargs, 1));
     if (ret == NJS_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
-        return njs_vm_value_string_set(vm, retval, r->uri.start, r->uri.length);
+        return njs_vm_value_string_create(vm, retval, r->uri.start,
+                                          r->uri.length);
     }
 
     njs_set_undefined(retval);
@@ -638,7 +637,8 @@ static njs_int_t
 njs_unit_test_error_name(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, (u_char *) "ExternalError", 13);
+    return njs_vm_value_string_create(vm, retval, (u_char *) "ExternalError",
+                                      13);
 }
 
 
@@ -646,7 +646,7 @@ static njs_int_t
 njs_unit_test_error_message(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
 {
-    return njs_vm_value_string_set(vm, retval, (u_char *) "", 0);
+    return njs_vm_value_string_create(vm, retval, (u_char *) "", 0);
 }
 
 
index 2fa7e01ff6d14f2f4fdb8388ae854f25264723ca..e048708bb6ef6140d22b88a82eb190cafeeb24bc 100644 (file)
@@ -22169,13 +22169,13 @@ static njs_unit_test_t  njs_externals_test[] =
       njs_str("АБВαβγ") },
 
     { njs_str("var a = $r.uri; a +' '+ a.length +' '+ a"),
-      njs_str("АБВ 6 АБВ") },
+      njs_str("АБВ 3 АБВ") },
 
     { njs_str("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"),
-      njs_str("6 αβγ") },
+      njs_str("3 αβγ") },
 
     { njs_str("$r.uri.length +' '+ $r.uri"),
-      njs_str("6 АБВ") },
+      njs_str("3 АБВ") },
 
     { njs_str("var t; "
               "switch ($r3.uri) {"
@@ -22187,8 +22187,8 @@ static njs_unit_test_t  njs_externals_test[] =
               "}; t"),
       njs_str("A") },
 
-    { njs_str("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
-      njs_str("4 БВ") },
+    { njs_str("$r.uri = $r.uri.substr(1); $r.uri.length +' '+ $r.uri"),
+      njs_str("2 БВ") },
 
     { njs_str("'' + $r.props.a + $r2.props.a + $r.props.a"),
       njs_str("121") },
@@ -22263,13 +22263,13 @@ static njs_unit_test_t  njs_externals_test[] =
       njs_str("undefined") },
 
     { njs_str("var a = $r.host; a +' '+ a.length +' '+ a"),
-      njs_str("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
+      njs_str("АБВГДЕЁЖЗИЙ 11 АБВГДЕЁЖЗИЙ") },
 
-    { njs_str("var a = $r.host; a.substr(2, 2)"),
+    { njs_str("var a = $r.host; a.substr(1, 1)"),
       njs_str("Б") },
 
     { njs_str("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
-      njs_str("User-Agent|АБВ 17 User-Agent|АБВ") },
+      njs_str("User-Agent|АБВ 14 User-Agent|АБВ") },
 
     { njs_str("var a='', p;"
                  "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
@@ -24141,10 +24141,10 @@ njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
     njs_value_number_set(njs_value_arg(&args[0]), 1);
     njs_value_boolean_set(njs_value_arg(&args[0]), 0);
 
-    (void) njs_vm_value_string_set(vm, njs_value_arg(&num_key),
-                                   (u_char *) "num", 3);
-    (void) njs_vm_value_string_set(vm, njs_value_arg(&bool_key),
-                                   (u_char *) "bool", 4);
+    (void) njs_vm_value_string_create(vm, njs_value_arg(&num_key),
+                                     (u_char *) "num", 3);
+    (void) njs_vm_value_string_create(vm, njs_value_arg(&bool_key),
+                                     (u_char *) "bool", 4);
 
     ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), NULL);
     if (ret != NJS_OK) {
@@ -24486,9 +24486,9 @@ njs_string_to_index_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
     };
 
     for (i = 0; i < njs_nitems(tests); i++) {
-            (void) njs_vm_value_string_set(vm, njs_value_arg(&input),
-                                           tests[i].value.start,
-                                           tests[i].value.length);
+            (void) njs_vm_value_string_create(vm, njs_value_arg(&input),
+                                             tests[i].value.start,
+                                             tests[i].value.length);
 
             num = njs_string_to_index(njs_value_arg(&input));
             njs_value_number_set(njs_value_arg(&value), num);