+ njs_string_map_size(length);
}
- value_size += sizeof(njs_string_t) + size;
+ value_size += sizeof(njs_string_t) + size + 1;
}
value_size += sizeof(njs_index_t);
string->length = src->string.data->length;
string->size = src->string.data->size;
+ string->start[size] = '\0';
+
memcpy(string->start, start, size);
}
}
+/* Underlying string data is zero-terminated. */
u_char *
njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
uint64_t length)
value->atom_id = NJS_ATOM_STRING_unknown;
if (size != length && length > NJS_STRING_MAP_STRIDE) {
- map_offset = njs_string_map_offset(size);
+ map_offset = njs_string_map_offset(size + njs_length("\0"));
total = map_offset + njs_string_map_size(length);
} else {
map_offset = 0;
- total = size;
+ total = size + njs_length("\0");
}
string = njs_mp_alloc(vm->mem_pool, sizeof(njs_string_t) + total);
string->size = size;
string->length = length;
+ string->start[size] = '\0';
+
if (map_offset != 0) {
map = (uint32_t *) (string->start + map_offset);
map[0] = 0;
#define njs_string_map_offset(size) njs_align_size((size), sizeof(uint32_t))
#define njs_string_map_start(p) \
- ((uint32_t *) njs_align_ptr((p), sizeof(uint32_t)))
+ ((uint32_t *) njs_align_ptr((u_char *) (p) + 1, sizeof(uint32_t)))
#define njs_string_map_size(length) \
(((length - 1) / NJS_STRING_MAP_STRIDE) * sizeof(uint32_t))
njs_assert((value)->string.data != NULL); \
(str)->length = (value)->string.data->size; \
(str)->start = (u_char *) (value)->string.data->start; \
+ njs_assert((str)->start[(str)->length] == '\0'); \
} while (0)
}
-/*
- * If string value is null-terminated the corresponding C string
- * is returned as is, otherwise the new copy is allocated with
- * the terminating zero byte.
- */
const char *
njs_vm_value_to_c_string(njs_vm_t *vm, njs_value_t *value)
{
- u_char *p, *data;
- size_t size;
-
njs_assert(njs_is_string(value));
- size = value->string.data->size;
-
- data = njs_mp_alloc(vm->mem_pool, size + njs_length("\0"));
- if (njs_slow_path(data == NULL)) {
- njs_memory_error(vm);
- return NULL;
- }
-
- p = njs_cpymem(data, value->string.data->start, size);
- *p++ = '\0';
-
- return (const char *) data;
+ return (const char *) value->string.data->start;
}
{ njs_str("'\\ud83d\\udc4d'.length"),
njs_str("1") },
+ { njs_str("'\\u00A0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.length"),
+ njs_str("35") },
+
{ njs_str("'\\ud83d abc \\udc4d'"),
njs_str("� abc �") },