njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_t *proto,
u_char *start, size_t size)
{
- ssize_t length;
njs_int_t ret;
njs_value_t string;
njs_object_t *error;
- length = njs_utf8_length(start, size);
- if (njs_slow_path(length < 0)) {
- length = 0;
- }
-
- ret = njs_string_new(vm, &string, start, size, length);
+ ret = njs_string_create(vm, &string, start, size);
if (njs_slow_path(ret != NJS_OK)) {
return;
}
const njs_external_t *external, njs_uint_t n)
{
size_t size;
- ssize_t length;
njs_int_t ret;
njs_lvlhsh_t *hash;
const u_char *start;
} else {
start = (u_char *) external->u.property.value;
size = njs_strlen(start);
- length = njs_utf8_length(start, size);
- if (njs_slow_path(length < 0)) {
- length = 0;
- }
- ret = njs_string_new(vm, &prop->u.value, start, size, length);
+ ret = njs_string_create(vm, &prop->u.value, start, size);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_generate_var_statement_after(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
- ssize_t length;
njs_int_t ret;
njs_variable_t *var;
njs_parser_node_t *lvalue, *expr;
return NJS_ERROR;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NJS_ERROR;
- }
-
- ret = njs_string_new(vm, &expr->u.value.data.u.lambda->name,
- lex_entry->name.start, lex_entry->name.length,
- length);
+ ret = njs_string_create(vm, &expr->u.value.data.u.lambda->name,
+ lex_entry->name.start, lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_generate_global_property_set(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node_dst, njs_parser_node_t *node_src)
{
- ssize_t length;
njs_int_t ret;
njs_value_t property;
njs_variable_t *var;
return NJS_ERROR;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NJS_ERROR;
- }
-
- ret = njs_string_new(vm, &property, lex_entry->name.start,
- lex_entry->name.length, length);
+ ret = njs_string_create(vm, &property, lex_entry->name.start,
+ lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_generate_function_expression(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
- ssize_t length;
njs_int_t ret;
njs_variable_t *var;
njs_function_lambda_t *lambda;
return ret;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NJS_ERROR;
- }
-
- ret = njs_string_new(vm, &lambda->name, lex_entry->name.start,
- lex_entry->name.length, length);
+ ret = njs_string_create(vm, &lambda->name, lex_entry->name.start,
+ lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
- ssize_t length;
njs_int_t ret;
njs_bool_t async;
njs_variable_t *var;
return NJS_ERROR;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NJS_ERROR;
- }
-
- ret = njs_string_new(vm, &lambda->name, lex_entry->name.start,
- lex_entry->name.length, length);
+ ret = njs_string_create(vm, &lambda->name, lex_entry->name.start,
+ lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_generate_global_reference(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node, njs_bool_t exception)
{
- ssize_t length;
njs_int_t ret;
njs_index_t index;
njs_value_t property;
return NJS_ERROR;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NJS_ERROR;
- }
-
- ret = njs_string_new(vm, &property, lex_entry->name.start,
- lex_entry->name.length, length);
+ ret = njs_string_create(vm, &property, lex_entry->name.start,
+ lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NJS_ERROR;
}
njs_chb_append_literal(chain, "[");
- (void) njs_typed_array_to_chain(stringify->vm, chain, array, NULL);
+ njs_typed_array_to_chain(stringify->vm, chain, array, NULL);
njs_chb_append_literal(chain, "]");
unsigned flags, njs_value_t *retval);
static njs_array_t *njs_regexp_exec_result(njs_vm_t *vm, njs_value_t *r,
njs_utf8_t utf8, njs_string_prop_t *string, njs_regex_match_data_t *data);
-static njs_int_t njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value,
- u_char *start, uint32_t size, int32_t length);
const njs_value_t njs_string_lindex = njs_string("lastIndex");
{
u_char *start;
size_t c;
- int32_t size, length;
+ int32_t size;
uint32_t index;
njs_int_t ret;
njs_uint_t i, n;
start = &string->start[c];
size = njs_regex_capture(match_data, n + 1) - c;
- if (utf8 == NJS_STRING_UTF8) {
- length = njs_max(njs_utf8_length(start, size), 0);
-
- } else {
- length = size;
- }
-
- ret = njs_regexp_string_create(vm, &array->start[i], start, size,
- length);
+ ret = njs_string_create(vm, &array->start[i], start, size);
if (njs_slow_path(ret != NJS_OK)) {
goto fail;
}
}
-static njs_int_t
-njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
- uint32_t size, int32_t length)
-{
- length = (length >= 0) ? length : 0;
-
- return njs_string_new(vm, value, start, size, length);
-}
-
-
njs_int_t
njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
}
-/*
- * njs_string_validate() validates an UTF-8 string, evaluates its length,
- * sets njs_string_prop_t struct.
- */
-
-njs_int_t
-njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value)
-{
- u_char *start;
- size_t new_size, map_offset;
- ssize_t size, length;
- uint32_t *map;
-
- size = value->short_string.size;
-
- if (size != NJS_STRING_LONG) {
- string->start = value->short_string.start;
- length = value->short_string.length;
-
- if (length == 0 && length != size) {
- length = njs_utf8_length(value->short_string.start, size);
-
- if (njs_slow_path(length < 0)) {
- /* Invalid UTF-8 string. */
- return length;
- }
-
- value->short_string.length = length;
- }
-
- } else {
- string->start = value->long_string.data->start;
- size = value->long_string.size;
- length = value->long_string.data->length;
-
- if (length == 0 && length != size) {
- length = njs_utf8_length(string->start, size);
-
- if (length != size) {
- if (njs_slow_path(length < 0)) {
- /* Invalid UTF-8 string. */
- return length;
- }
-
- if (length > NJS_STRING_MAP_STRIDE) {
- /*
- * Reallocate the long string with offset map
- * after the string.
- */
- map_offset = njs_string_map_offset(size);
- new_size = map_offset + njs_string_map_size(length);
-
- start = njs_mp_alloc(vm->mem_pool, new_size);
- if (njs_slow_path(start == NULL)) {
- njs_memory_error(vm);
- return NJS_ERROR;
- }
-
- memcpy(start, string->start, size);
- string->start = start;
- value->long_string.data->start = start;
-
- map = (uint32_t *) (start + map_offset);
- map[0] = 0;
- }
- }
-
- value->long_string.data->length = length;
- }
- }
-
- string->size = size;
- string->length = length;
-
- return length;
-}
-
-
static njs_int_t
njs_string_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused, njs_value_t *retval)
uint32_t njs_string_trim(const njs_value_t *value, njs_string_prop_t *string,
unsigned mode);
void njs_string_copy(njs_value_t *dst, njs_value_t *src);
-njs_int_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string,
- njs_value_t *value);
njs_int_t njs_string_cmp(const njs_value_t *val1, const njs_value_t *val2);
void njs_string_slice_string_prop(njs_string_prop_t *dst,
const njs_string_prop_t *string, const njs_slice_prop_t *slice);
default:
length = njs_utf8_length(start, size);
- return (length >= 0) ? length : 0;
+ return length;
}
}
}
-njs_int_t
+void
njs_typed_array_to_chain(njs_vm_t *vm, njs_chb_t *chain,
njs_typed_array_t *array, njs_value_t *sep)
{
- size_t size, length, arr_length;
+ size_t length;
uint32_t i;
njs_string_prop_t separator;
(void) njs_string_prop(&separator, sep);
- arr_length = njs_typed_array_length(array);
+ length = njs_typed_array_length(array);
- if (arr_length == 0) {
- return 0;
+ if (length == 0) {
+ return;
}
- for (i = 0; i < arr_length; i++) {
+ for (i = 0; i < length; i++) {
njs_number_to_chain(vm, chain, njs_typed_array_prop(array, i));
njs_chb_append(chain, separator.start, separator.size);
}
njs_chb_drop(chain, separator.size);
-
- size = njs_chb_size(chain);
-
- if (njs_utf8_length(separator.start, separator.size) >= 0) {
- length = size - (separator.size - separator.length) * (arr_length - 1);
-
- } else {
- length = 0;
- }
-
- return length;
}
njs_typed_array_prototype_join(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
- u_char *p;
- size_t size, length, arr_length;
+ size_t length;
njs_int_t ret;
njs_chb_t chain;
njs_value_t *this, *separator;
return NJS_ERROR;
}
- arr_length = njs_typed_array_length(array);
+ length = njs_typed_array_length(array);
separator = njs_arg(args, nargs, 1);
}
}
- if (arr_length == 0) {
+ if (length == 0) {
njs_value_assign(retval, &njs_string_empty);
return NJS_OK;
}
NJS_CHB_MP_INIT(&chain, vm);
- length = njs_typed_array_to_chain(vm, &chain, array, separator);
- size = njs_chb_size(&chain);
+ njs_typed_array_to_chain(vm, &chain, array, separator);
- p = njs_string_alloc(vm, retval, size, length);
- if (njs_slow_path(p == NULL)) {
- return NJS_ERROR;
- }
+ ret = njs_string_create_chb(vm, retval, &chain);
- njs_chb_join_to(&chain, p);
njs_chb_destroy(&chain);
- return NJS_OK;
+ return ret;
}
njs_typed_array_t *array);
njs_int_t njs_typed_array_set_value(njs_vm_t *vm, njs_typed_array_t *array,
uint32_t index, njs_value_t *setval);
-njs_int_t njs_typed_array_to_chain(njs_vm_t *vm, njs_chb_t *chain,
+void njs_typed_array_to_chain(njs_vm_t *vm, njs_chb_t *chain,
njs_typed_array_t *array, njs_value_t *sep);
njs_int_t njs_typed_array_prototype_slice(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t copy, njs_value_t *retval);
njs_vm_value_enumerate(njs_vm_t *vm, njs_value_t *value, uint32_t flags,
njs_value_t *retval)
{
- ssize_t length;
njs_int_t ret;
njs_value_t *val;
njs_array_t *keys;
continue;
}
- length = njs_utf8_length(lex_entry->name.start, lex_entry->name.length);
- if (njs_slow_path(length < 0)) {
- return NULL;
- }
-
val = njs_array_push(vm, keys);
if (njs_slow_path(value == NULL)) {
return NULL;
}
- ret = njs_string_new(vm, val, lex_entry->name.start,
- lex_entry->name.length, length);
+ ret = njs_string_create(vm, val, lex_entry->name.start,
+ lex_entry->name.length);
if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}