*/
value->short_string.size = NJS_STRING_LONG;
value->short_string.length = 0;
- value->data.external0 = 0xff;
- value->data.string_size = size;
+ value->long_string.external = 0xff;
+ value->long_string.size = size;
string = nxt_mem_cache_alloc(vm->mem_cache_pool, sizeof(njs_string_t));
if (nxt_slow_path(string == NULL)) {
return NXT_ERROR;
}
- value->data.u.string = string;
+ value->long_string.data = string;
string->start = start;
string->length = length;
*/
value->short_string.size = NJS_STRING_LONG;
value->short_string.length = 0;
- value->data.external0 = 0;
- value->data.string_size = size;
+ value->long_string.external = 0;
+ value->long_string.size = size;
if (size != length && length > NJS_STRING_MAP_STRIDE) {
map_offset = njs_string_map_offset(size);
sizeof(njs_string_t) + total);
if (nxt_fast_path(string != NULL)) {
- value->data.u.string = string;
+ value->long_string.data = string;
string->start = (u_char *) string + sizeof(njs_string_t);
string->length = length;
}
} else {
- string->start = value->data.u.string->start;
- size = value->data.string_size;
- length = value->data.u.string->length;
+ string->start = value->long_string.data->start;
+ size = value->long_string.size;
+ length = value->long_string.data->length;
if (length == 0 && length != size) {
length = nxt_utf8_length(string->start, size);
memcpy(start, string->start, size);
string->start = start;
- value->data.u.string->start = start;
+ value->long_string.data->start = start;
map = (uint32_t *) (start + map_offset);
map[0] = 0;
}
}
- value->data.u.string->length = length;
+ value->long_string.data->length = length;
}
}
length = value->short_string.length;
} else {
- string->start = value->data.u.string->start;
- size = value->data.string_size;
- length = value->data.u.string->length;
+ string->start = value->long_string.data->start;
+ size = value->long_string.size;
+ length = value->long_string.data->length;
}
string->size = size;
length = value->short_string.length;
if (size == NJS_STRING_LONG) {
- size = value->data.string_size;
- length = value->data.u.string->length;
+ size = value->long_string.size;
+ length = value->long_string.data->length;
}
length = (length == 0) ? size : length;
start2 = v2->short_string.start;
} else {
- size = v1->data.string_size;
+ size = v1->long_string.size;
- if (size != v2->data.string_size) {
+ if (size != v2->long_string.size) {
return 0;
}
- start1 = v1->data.u.string->start;
- start2 = v2->data.u.string->start;
+ start1 = v1->long_string.data->start;
+ start2 = v2->long_string.data->start;
}
return (memcmp(start1, start2, size) == 0);
start1 = v1->short_string.start;
} else {
- size1 = v1->data.string_size;
- start1 = v1->data.u.string->start;
+ size1 = v1->long_string.size;
+ start1 = v1->long_string.data->start;
}
size2 = v2->short_string.size;
start2 = v2->short_string.start;
} else {
- size2 = v2->data.string_size;
- start2 = v2->data.u.string->start;
+ size2 = v2->long_string.size;
+ start2 = v2->long_string.data->start;
}
size = nxt_min(size1, size2);
string->start = NULL;
} else {
- string->start = value->data.u.string->start;
- size = value->data.string_size;
+ string->start = value->long_string.data->start;
+ size = value->long_string.size;
}
string->size = size;
p = value->short_string.start;
} else {
- size = value->data.string_size;
- p = value->data.u.string->start;
+ size = value->long_string.size;
+ p = value->long_string.data->start;
}
end = p + size;
p = value->short_string.start;
} else {
- size = value->data.string_size;
- p = value->data.u.string->start;
+ size = value->long_string.size;
+ p = value->long_string.data->start;
}
if (size == 0) {
}
} else {
- start = value->data.u.string->start;
- size = value->data.string_size;
+ start = value->long_string.data->start;
+ size = value->long_string.size;
if (start[size] == '\0') {
return start;
vm->retval.short_string.length = length;
} else {
- vm->retval.data.u.string->length = length;
+ vm->retval.long_string.data->length = length;
}
}
}
if (njs_is_string(value)
- && value->data.string_size == lhq->key.length
- && memcmp(value->data.u.string->start, lhq->key.start, lhq->key.length)
+ && value->long_string.size == lhq->key.length
+ && memcmp(value->long_string.data->start, lhq->key.start,
+ lhq->key.length)
== 0)
{
return NXT_OK;
start = (u_char *) src;
} else {
- size = src->data.string_size;
- start = src->data.u.string->start;
+ size = src->long_string.size;
+ start = src->long_string.data->start;
}
lhq.key_hash = nxt_djb_hash(start, size);
/* Long string value is allocated together with string. */
value_size = sizeof(njs_value_t) + sizeof(njs_string_t);
- length = src->data.u.string->length;
+ length = src->long_string.data->length;
if (size != length && length > NJS_STRING_MAP_STRIDE) {
size = njs_string_map_offset(size)
if (start != (u_char *) src) {
string = (njs_string_t *) ((u_char *) value + sizeof(njs_value_t));
- value->data.u.string = string;
+ value->long_string.data = string;
string->start = (u_char *) string + sizeof(njs_string_t);
- string->length = src->data.u.string->length;
+ string->length = src->long_string.data->length;
string->retain = 0xffff;
memcpy(string->start, start, size);
if (njs_is_string(value)) {
- if (value->data.external0 != 0xff) {
- string = value->data.u.string;
+ if (value->long_string.external != 0xff) {
+ string = value->long_string.data;
nxt_thread_log_debug("retain:%uxD \"%*s\"", string->retain,
- value->data.string_size, string->start);
+ value->long_string.size, string->start);
if (string->retain != 0xffff) {
string->retain++;
if (njs_is_string(value)) {
- if (value->data.external0 != 0xff) {
- string = value->data.u.string;
+ if (value->long_string.external != 0xff) {
+ string = value->long_string.data;
nxt_thread_log_debug("release:%uxD \"%*s\"", string->retain,
- value->data.string_size, string->start);
+ value->long_string.size, string->start);
if (string->retain != 0xffff) {
string->retain--;
start2 = val2->short_string.start;
} else {
- size = val1->data.string_size;
+ size = val1->long_string.size;
- if (size != val2->data.string_size) {
+ if (size != val2->long_string.size) {
return 0;
}
- if (val1->data.u.string->length != val2->data.u.string->length) {
+ if (val1->long_string.data->length
+ != val2->long_string.data->length)
+ {
return 0;
}
- start1 = val1->data.u.string->start;
- start2 = val2->data.u.string->start;
+ start1 = val1->long_string.data->start;
+ start2 = val2->long_string.data->start;
}
return (memcmp(start1, start2, size) == 0);
memcpy(start, value.short_string.start, size);
} else {
- size = value.data.string_size;
- start = value.data.u.string->start;
+ size = value.long_string.size;
+ start = value.long_string.data->start;
}
dst->length = size;
p = value->short_string.start;
} else {
- length = value->data.string_size;
- p = value->data.u.string->start;
+ length = value->long_string.size;
+ p = value->long_string.data->start;
}
nxt_thread_log_debug("%p [\"%*s\"]", index, length, p);
* to provide 4 bits to encode scope in njs_index_t. This space is
* used to store short strings. The maximum size of a short string
* is 14 (NJS_STRING_SHORT). If the short_string.size field is 15
- * (NJS_STRING_LONG) then the size is in the data.string_size field
- * and the data.u.string field points to a long string.
+ * (NJS_STRING_LONG) then the size is in the long_string.size field
+ * and the long_string.data field points to a long string.
*
* The number of the string types is limited to 2 types to minimize
* overhead of processing string fields. It is also possible to add
*/
uint8_t truth;
- /* 0xff if u.data.string is external string. */
- uint8_t external0;
- uint8_t _spare;
-
- /* A long string size. */
- uint32_t string_size;
+ uint16_t _spare1;
+ uint32_t _spare2;
union {
- double number;
- njs_string_t *string;
- njs_object_t *object;
- njs_array_t *array;
- njs_object_value_t *object_value;
- njs_function_t *function;
- njs_function_lambda_t *lambda;
- njs_regexp_t *regexp;
- njs_date_t *date;
- njs_getter_t getter;
- njs_extern_t *external;
- njs_value_t *value;
- njs_property_next_t *next;
- void *data;
+ double number;
+ njs_object_t *object;
+ njs_array_t *array;
+ njs_object_value_t *object_value;
+ njs_function_t *function;
+ njs_function_lambda_t *lambda;
+ njs_regexp_t *regexp;
+ njs_date_t *date;
+ njs_getter_t getter;
+ njs_extern_t *external;
+ njs_value_t *value;
+ njs_property_next_t *next;
+ void *data;
} u;
} data;
u_char start[NJS_STRING_SHORT];
} short_string;
+ struct {
+ njs_value_type_t type:8; /* 5 bits */
+ uint8_t truth;
+
+ /* 0xff if data is external string. */
+ uint8_t external;
+ uint8_t _spare;
+
+ uint32_t size;
+ njs_string_t *data;
+ } long_string;
+
njs_value_type_t type:8; /* 5 bits */
};
/* NJS_STRING_LONG is set for both big and little endian platforms. */
#define njs_long_string(s) { \
- .data = { \
+ .long_string = { \
.type = NJS_STRING, \
.truth = (NJS_STRING_LONG << 4) | NJS_STRING_LONG, \
- .string_size = sizeof(s) - 1, \
- .u.string = & (njs_string_t) { \
+ .size = sizeof(s) - 1, \
+ .data = & (njs_string_t) { \
.start = (u_char *) s, \
.length = sizeof(s) - 1, \
} \
(str)->start = (u_char *) (value)->short_string.start; \
\
} else { \
- (str)->length = (value)->data.string_size; \
- (str)->start = (u_char *) (value)->data.u.string->start; \
+ (str)->length = (value)->long_string.size; \
+ (str)->start = (u_char *) (value)->long_string.data->start; \
} \
} while (0)
(value)->short_string.length = length; \
\
} else { \
- (value)->data.u.string->length = length; \
+ (value)->long_string.data->length = length; \
} \
} while (0)