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.
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;
}
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;
}
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) {
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);
}
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));
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) {
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) {
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:
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) {
}
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)) {
}
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;
}
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;
}
/* 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;
}
}
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;
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;
}
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);
}
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);
}
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
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;
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;
}
}
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
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;
{
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);
}
}
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)) {
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);
}
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
- );
+ );
}
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);
}
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);
}
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);
}
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);
}
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));
}
#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))
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;
}
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);
}
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;
}
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;
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;
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;
}
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"));
}
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);
}
}
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;
}
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;
}
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;
}
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);
}
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);
}
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;
}
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);
}
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);
}
/* 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,
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;
}
}
-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)
}
-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)
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;
}
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;
}
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;
}
}
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;
}
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);
}
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);
}
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);
}
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);
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);
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]++;
}
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);
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);
}
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);
}
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) {"
"}; 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") },
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] +',' }"
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) {
};
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);