From 84b89ea93d54beb9fba95b9bed3efe8f74760510 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 2 Jul 2019 21:37:10 +0300 Subject: [PATCH] Refactored functions inlining. Allowing compiler to decide whether inline a function or not by removing most of nxt_noinline prefixes. Inlining simple functions. Splitting public function getters from njs internal value getters. --- njs/njs.c | 164 ++++++++++++++++++++++- njs/njs_array.c | 149 ++++++++++----------- njs/njs_builtin.c | 14 +- njs/njs_crypto.c | 4 +- njs/njs_date.c | 101 +++++++-------- njs/njs_error.c | 2 +- njs/njs_error.h | 4 +- njs/njs_event.c | 2 +- njs/njs_extern.c | 2 +- njs/njs_fs.c | 20 +-- njs/njs_function.c | 14 +- njs/njs_generator.c | 48 ++++--- njs/njs_json.c | 44 +++---- njs/njs_math.c | 70 +++++----- njs/njs_module.c | 12 +- njs/njs_number.c | 121 +---------------- njs/njs_number.h | 124 ++++++++++++++++-- njs/njs_object.c | 50 ++------ njs/njs_object_property.c | 12 +- njs/njs_regexp.c | 14 +- njs/njs_string.c | 66 +++++----- njs/njs_string.h | 8 +- njs/njs_vm.c | 264 +++++++------------------------------- njs/njs_vm.h | 90 +++++++++++++ nxt/nxt_lvlhsh.c | 2 +- 25 files changed, 699 insertions(+), 702 deletions(-) diff --git a/njs/njs.c b/njs/njs.c index 950ee708..9ee74554 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -663,20 +663,174 @@ njs_vm_add_path(njs_vm_t *vm, const nxt_str_t *path) } -nxt_noinline njs_value_t * +njs_value_t * njs_vm_retval(njs_vm_t *vm) { return &vm->retval; } -nxt_noinline void +void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value) { vm->retval = *value; } +void +njs_value_undefined_set(njs_value_t *value) +{ + njs_set_undefined(value); +} + + +void +njs_value_boolean_set(njs_value_t *value, int yn) +{ + njs_set_boolean(value, yn); +} + + +void +njs_value_number_set(njs_value_t *value, double num) +{ + njs_set_number(value, num); +} + + +void +njs_value_data_set(njs_value_t *value, void *data) +{ + njs_set_data(value, data); +} + + +njs_ret_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); +} + + +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); +} + + +nxt_noinline void +njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...) +{ + va_list args; + u_char buf[NXT_MAX_ERROR_STR], *p; + + p = buf; + + if (fmt != NULL) { + va_start(args, fmt); + p = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args); + va_end(args); + } + + njs_error_new(vm, value, NJS_OBJECT_ERROR, buf, p - buf); +} + + +uint8_t +njs_value_bool(const njs_value_t *value) +{ + return njs_bool(value); +} + + +double +njs_value_number(const njs_value_t *value) +{ + return njs_number(value); +} + + +void * +njs_value_data(const njs_value_t *value) +{ + return njs_data(value); +} + + +njs_function_t * +njs_value_function(const njs_value_t *value) +{ + return njs_function(value); +} + + +nxt_int_t +njs_value_is_null(const njs_value_t *value) +{ + return njs_is_null(value); +} + + +nxt_int_t +njs_value_is_undefined(const njs_value_t *value) +{ + return njs_is_undefined(value); +} + + +nxt_int_t +njs_value_is_null_or_undefined(const njs_value_t *value) +{ + return njs_is_null_or_undefined(value); +} + + +nxt_int_t +njs_value_is_boolean(const njs_value_t *value) +{ + return njs_is_boolean(value); +} + + +nxt_int_t +njs_value_is_number(const njs_value_t *value) +{ + return njs_is_number(value); +} + + +nxt_int_t +njs_value_is_valid_number(const njs_value_t *value) +{ + return njs_is_number(value) + && !isnan(value->data.u.number) + && !isinf(value->data.u.number); +} + + +nxt_int_t +njs_value_is_string(const njs_value_t *value) +{ + return njs_is_string(value); +} + + +nxt_int_t +njs_value_is_object(const njs_value_t *value) +{ + return njs_is_object(value); +} + + +nxt_int_t +njs_value_is_function(const njs_value_t *value) +{ + return njs_is_function(value); +} + + nxt_noinline void njs_vm_memory_error(njs_vm_t *vm) { @@ -770,9 +924,7 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...) rc = NJS_OK; - retval->data.u.object = object; - retval->type = NJS_OBJECT; - retval->data.truth = 1; + njs_set_object(retval, object); done: @@ -797,7 +949,7 @@ njs_vm_object_prop(njs_vm_t *vm, const njs_value_t *value, const nxt_str_t *key) lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&value->data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(value), &lhq); if (nxt_slow_path(ret != NXT_OK)) { return NULL; } diff --git a/njs/njs_array.c b/njs/njs_array.c index c935647f..b418b74f 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -118,15 +118,15 @@ static njs_ret_t njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static njs_ret_t njs_array_prototype_map_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); -static nxt_noinline uint32_t njs_array_prototype_map_index(njs_array_t *array, +static uint32_t njs_array_prototype_map_index(njs_array_t *array, njs_array_map_t *map); -static nxt_noinline njs_ret_t njs_array_iterator_args(njs_vm_t *vm, +static njs_ret_t njs_array_iterator_args(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs); -static nxt_noinline uint32_t njs_array_iterator_index(njs_array_t *array, +static uint32_t njs_array_iterator_index(njs_array_t *array, njs_array_iter_t *iter); -static nxt_noinline njs_ret_t njs_array_iterator_apply(njs_vm_t *vm, +static njs_ret_t njs_array_iterator_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs); -static nxt_noinline njs_ret_t njs_array_prototype_find_apply(njs_vm_t *vm, +static njs_ret_t njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs); static njs_ret_t njs_array_prototype_reduce_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); @@ -138,7 +138,7 @@ static njs_ret_t njs_array_prototype_sort_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); -nxt_noinline njs_array_t * +njs_array_t * njs_array_alloc(njs_vm_t *vm, uint64_t length, uint32_t spare) { uint64_t size; @@ -308,7 +308,6 @@ njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, if (nxt_fast_path(array != NULL)) { - vm->retval.data.u.array = array; value = array->start; if (args == NULL) { @@ -326,8 +325,8 @@ njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } } - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + + njs_set_array(&vm->retval, array); return NXT_OK; } @@ -369,9 +368,7 @@ njs_array_of(njs_vm_t *vm, njs_value_t *args, return NXT_ERROR; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); for (i = 0; i < length; i++) { array->start[i] = args[i + 1]; @@ -464,7 +461,7 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval, array = (njs_array_t *) proto; - njs_value_number_set(retval, array->length); + njs_set_number(retval, array->length); return NJS_OK; } @@ -506,7 +503,7 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval, array->length = length; - njs_value_number_set(retval, length); + njs_set_number(retval, length); return NJS_OK; } @@ -619,15 +616,13 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this, return NXT_ERROR; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); if (length != 0) { n = 0; if (nxt_fast_path(njs_is_array(this))) { - value = this->data.u.array->start; + value = njs_array_start(this); do { /* GC: retain long string and object in values[start]. */ @@ -704,7 +699,7 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_array_t *array; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); if (nargs != 0) { ret = njs_array_expand(vm, array, 0, nargs); @@ -718,7 +713,7 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } } - njs_value_number_set(&vm->retval, array->length); + njs_set_number(&vm->retval, array->length); } return NXT_OK; @@ -735,7 +730,7 @@ njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, retval = &njs_value_undefined; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); if (array->length != 0) { array->length--; @@ -762,7 +757,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_array_t *array; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); n = nargs - 1; if (n != 0) { @@ -782,7 +777,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } while (n > 1); } - njs_value_number_set(&vm->retval, array->length); + njs_set_number(&vm->retval, array->length); } return NXT_OK; @@ -799,7 +794,7 @@ njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, retval = &njs_value_undefined; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); if (array->length != 0) { array->length--; @@ -833,7 +828,7 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, delete = 0; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); length = array->length; if (nargs > 1) { @@ -913,9 +908,7 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } } - vm->retval.data.u.array = deleted; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, deleted); return NXT_OK; } @@ -930,7 +923,7 @@ njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_array_t *array; if (njs_is_array(&args[0])) { - array = args[0].data.u.array; + array = njs_array(&args[0]); length = array->length; if (length > 1) { @@ -941,9 +934,7 @@ njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); } else { /* STUB */ @@ -991,7 +982,7 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, goto empty; } - array = args[0].data.u.array; + array = njs_array(&args[0]); if (array->length == 0) { goto empty; @@ -1076,7 +1067,7 @@ njs_array_prototype_join_continuation(njs_vm_t *vm, njs_value_t *args, n = 0; mask = -1; - array = args[0].data.u.array; + array = njs_array(&args[0]); for (i = 0; i < array->length; i++) { value = &array->start[i]; @@ -1168,7 +1159,7 @@ njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, for (i = 0; i < nargs; i++) { if (njs_is_array(&args[i])) { - length += args[i].data.u.array->length; + length += njs_array_len(&args[i]); } else { length++; @@ -1180,9 +1171,7 @@ njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NXT_ERROR; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); value = array->start; @@ -1202,8 +1191,8 @@ njs_array_copy(njs_value_t *dst, njs_value_t *src) n = 1; if (njs_is_array(src)) { - n = src->data.u.array->length; - src = src->data.u.array->start; + n = njs_array_len(src); + src = njs_array_start(src); } while (n != 0) { @@ -1230,7 +1219,7 @@ njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, goto done; } - array = args[0].data.u.array; + array = njs_array(&args[0]); length = array->length; if (length == 0) { @@ -1270,7 +1259,7 @@ njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } @@ -1290,7 +1279,7 @@ njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, goto done; } - array = args[0].data.u.array; + array = njs_array(&args[0]); length = array->length; if (length == 0) { @@ -1329,7 +1318,7 @@ njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, done: - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } @@ -1350,7 +1339,7 @@ njs_array_prototype_includes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, goto done; } - array = args[0].data.u.array; + array = njs_array(&args[0]); length = array->length; if (length == 0) { @@ -1480,7 +1469,7 @@ njs_array_prototype_fill_continuation(njs_vm_t *vm, njs_value_t *args, fill = njs_vm_continuation(vm); if (njs_is_array(this)) { - array = this->data.u.array; + array = njs_array(this); length = array->length; } else { @@ -1584,7 +1573,7 @@ njs_array_prototype_for_each_continuation(njs_vm_t *vm, njs_value_t *args, iter = njs_vm_continuation(vm); - index = njs_array_iterator_index(args[0].data.u.array, iter); + index = njs_array_iterator_index(njs_array(&args[0]), iter); if (index == NJS_ARRAY_INVALID_INDEX) { vm->retval = njs_value_undefined; @@ -1628,7 +1617,7 @@ njs_array_prototype_some_continuation(njs_vm_t *vm, njs_value_t *args, retval = &njs_value_true; } else { - index = njs_array_iterator_index(args[0].data.u.array, iter); + index = njs_array_iterator_index(njs_array(&args[0]), iter); if (index == NJS_ARRAY_INVALID_INDEX) { retval = &njs_value_false; @@ -1678,7 +1667,7 @@ njs_array_prototype_every_continuation(njs_vm_t *vm, njs_value_t *args, retval = &njs_value_false; } else { - index = njs_array_iterator_index(args[0].data.u.array, iter); + index = njs_array_iterator_index(njs_array(&args[0]), iter); if (index == NJS_ARRAY_INVALID_INDEX) { retval = &njs_value_true; @@ -1736,13 +1725,11 @@ njs_array_prototype_filter_continuation(njs_vm_t *vm, njs_value_t *args, } } - array = args[0].data.u.array; + array = njs_array(&args[0]); index = njs_array_iterator_index(array, &filter->iter); if (index == NJS_ARRAY_INVALID_INDEX) { - vm->retval.data.u.array = filter->array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, filter->array); return NXT_OK; } @@ -1788,7 +1775,7 @@ njs_array_prototype_find_continuation(njs_vm_t *vm, njs_value_t *args, iter = &find->iter; if (!njs_is_true(&iter->retval)) { - array = args[0].data.u.array; + array = njs_array(&args[0]); iter->index++; if (iter->index < iter->length && iter->index < array->length) { @@ -1843,7 +1830,7 @@ njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args, iter->index++; if (iter->index < iter->length - && iter->index < args[0].data.u.array->length) + && iter->index < njs_array_len(&args[0])) { return njs_array_prototype_find_apply(vm, iter, args, nargs); } @@ -1851,13 +1838,13 @@ njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args, index = -1; } - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } -static nxt_noinline njs_ret_t +static njs_ret_t njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs) { @@ -1871,7 +1858,7 @@ njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter, arguments[0] = *value; n = iter->index; - value = &args[0].data.u.array->start[n]; + value = &njs_array_start(&args[0])[n]; if (!njs_is_valid(value)) { value = &njs_value_undefined; @@ -1879,7 +1866,7 @@ njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter, arguments[1] = *value; - njs_value_number_set(&arguments[2], n); + njs_set_number(&arguments[2], n); arguments[3] = args[0]; @@ -1904,7 +1891,7 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, map->iter.u.cont.function = njs_array_prototype_map_continuation; njs_set_invalid(&map->iter.retval); - map->array = njs_array_alloc(vm, args[0].data.u.array->length, 0); + map->array = njs_array_alloc(vm, njs_array_len(&args[0]), 0); if (nxt_slow_path(map->array == NULL)) { return NXT_ERROR; } @@ -1913,7 +1900,7 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } -static nxt_noinline njs_ret_t +static njs_ret_t njs_array_prototype_map_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { @@ -1926,12 +1913,10 @@ njs_array_prototype_map_continuation(njs_vm_t *vm, njs_value_t *args, map->array->start[map->iter.index] = map->iter.retval; } - index = njs_array_prototype_map_index(args[0].data.u.array, map); + index = njs_array_prototype_map_index(njs_array(&args[0]), map); if (index == NJS_ARRAY_INVALID_INDEX) { - vm->retval.data.u.array = map->array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, map->array); return NXT_OK; } @@ -1987,7 +1972,7 @@ njs_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, iter->retval = args[2]; } else { - array = args[0].data.u.array; + array = njs_array(&args[0]); n = njs_array_iterator_index(array, iter); if (n == NJS_ARRAY_INVALID_INDEX) { @@ -2012,7 +1997,7 @@ njs_array_prototype_reduce_continuation(njs_vm_t *vm, njs_value_t *args, njs_array_iter_t *iter; iter = njs_vm_continuation(vm); - array = args[0].data.u.array; + array = njs_array(&args[0]); n = njs_array_iterator_index(array, iter); @@ -2028,7 +2013,7 @@ njs_array_prototype_reduce_continuation(njs_vm_t *vm, njs_value_t *args, arguments[2] = array->start[n]; - njs_value_number_set(&arguments[3], n); + njs_set_number(&arguments[3], n); arguments[4] = args[0]; @@ -2037,7 +2022,7 @@ njs_array_prototype_reduce_continuation(njs_vm_t *vm, njs_value_t *args, } -static nxt_noinline njs_ret_t +static njs_ret_t njs_array_iterator_args(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs) { njs_array_iter_t *iter; @@ -2045,7 +2030,7 @@ njs_array_iterator_args(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs) if (nargs > 1 && njs_is_array(&args[0]) && njs_is_function(&args[1])) { iter = njs_vm_continuation(vm); - iter->length = args[0].data.u.array->length; + iter->length = njs_array_len(&args[0]); iter->retval.data.truth = 0; iter->index = NJS_ARRAY_INVALID_INDEX; @@ -2058,7 +2043,7 @@ njs_array_iterator_args(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs) } -static nxt_noinline uint32_t +static uint32_t njs_array_iterator_index(njs_array_t *array, njs_array_iter_t *iter) { uint32_t i, length; @@ -2076,7 +2061,7 @@ njs_array_iterator_index(njs_array_t *array, njs_array_iter_t *iter) } -static nxt_noinline njs_ret_t +static njs_ret_t njs_array_iterator_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs) { @@ -2090,9 +2075,9 @@ njs_array_iterator_apply(njs_vm_t *vm, njs_array_iter_t *iter, arguments[0] = *value; n = iter->index; - arguments[1] = args[0].data.u.array->start[n]; + arguments[1] = njs_array_start(&args[0])[n]; - njs_value_number_set(&arguments[2], n); + njs_set_number(&arguments[2], n); arguments[3] = args[0]; @@ -2122,7 +2107,7 @@ njs_array_prototype_reduce_right(njs_vm_t *vm, njs_value_t *args, iter->retval = args[2]; } else { - array = args[0].data.u.array; + array = njs_array(&args[0]); n = njs_array_reduce_right_index(array, iter); if (n == NJS_ARRAY_INVALID_INDEX) { @@ -2139,7 +2124,7 @@ njs_array_prototype_reduce_right(njs_vm_t *vm, njs_value_t *args, } -static nxt_noinline njs_ret_t +static njs_ret_t njs_array_prototype_reduce_right_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { @@ -2149,7 +2134,7 @@ njs_array_prototype_reduce_right_continuation(njs_vm_t *vm, njs_value_t *args, njs_array_iter_t *iter; iter = njs_vm_continuation(vm); - array = args[0].data.u.array; + array = njs_array(&args[0]); n = njs_array_reduce_right_index(array, iter); @@ -2165,7 +2150,7 @@ njs_array_prototype_reduce_right_continuation(njs_vm_t *vm, njs_value_t *args, arguments[2] = array->start[n]; - njs_value_number_set(&arguments[3], n); + njs_set_number(&arguments[3], n); arguments[4] = args[0]; @@ -2174,7 +2159,7 @@ njs_array_prototype_reduce_right_continuation(njs_vm_t *vm, njs_value_t *args, } -static nxt_noinline uint32_t +static uint32_t njs_array_reduce_right_index(njs_array_t *array, njs_array_iter_t *iter) { uint32_t n; @@ -2212,7 +2197,7 @@ njs_array_string_sort(njs_vm_t *vm, njs_value_t *args, ret = njs_string_cmp(&args[1], &args[2]); - njs_value_number_set(&vm->retval, ret); + njs_set_number(&vm->retval, ret); return NXT_OK; } @@ -2234,7 +2219,7 @@ njs_array_prototype_sort(njs_vm_t *vm, njs_value_t *args, { njs_array_sort_t *sort; - if (njs_is_array(&args[0]) && args[0].data.u.array->length > 1) { + if (njs_is_array(&args[0]) && njs_array_len(&args[0]) > 1) { sort = njs_vm_continuation(vm); sort->u.cont.function = njs_array_prototype_sort_continuation; @@ -2266,7 +2251,7 @@ njs_array_prototype_sort_continuation(njs_vm_t *vm, njs_value_t *args, njs_value_t value, *start, arguments[3]; njs_array_sort_t *sort; - array = args[0].data.u.array; + array = njs_array(&args[0]); start = array->start; sort = njs_vm_continuation(vm); diff --git a/njs/njs_builtin.c b/njs/njs_builtin.c index 012c0caf..b0ef7460 100644 --- a/njs/njs_builtin.c +++ b/njs/njs_builtin.c @@ -840,7 +840,7 @@ njs_vm_expression_completions(njs_vm_t *vm, nxt_str_t *expression) lhq.key.length = p - lhq.key.start; lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); - ret = nxt_lvlhsh_find(&value->data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(value), &lhq); if (nxt_slow_path(ret != NXT_OK)) { return NULL; } @@ -1178,9 +1178,7 @@ njs_process_object_argv(njs_vm_t *vm, njs_value_t *process, return NJS_ERROR; } - prop->value.data.u.array = argv; - prop->value.type = NJS_ARRAY; - prop->value.data.truth = 1; + njs_set_array(&prop->value, argv); lhq.value = prop; lhq.key_hash = NJS_ARGV_HASH; @@ -1189,7 +1187,7 @@ njs_process_object_argv(njs_vm_t *vm, njs_value_t *process, lhq.pool = vm->mem_pool; lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_insert(&process->data.u.object->hash, &lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(process), &lhq); if (nxt_fast_path(ret == NXT_OK)) { *retval = prop->value; @@ -1281,9 +1279,7 @@ njs_process_object_env(njs_vm_t *vm, njs_value_t *process, return NXT_ERROR; } - prop->value.data.u.object = env; - prop->value.type = NJS_OBJECT; - prop->value.data.truth = 1; + njs_set_object(&prop->value, env); lhq.replace = 0; lhq.pool = vm->mem_pool; @@ -1292,7 +1288,7 @@ njs_process_object_env(njs_vm_t *vm, njs_value_t *process, lhq.key = nxt_string_value("env"); lhq.key_hash = NJS_ENV_HASH; - ret = nxt_lvlhsh_insert(&process->data.u.object->hash, &lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(process), &lhq); if (nxt_fast_path(ret == NXT_OK)) { *retval = prop->value; diff --git a/njs/njs_crypto.c b/njs/njs_crypto.c index 99737105..92825df1 100644 --- a/njs/njs_crypto.c +++ b/njs/njs_crypto.c @@ -186,7 +186,7 @@ njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, alg->init(&dgst->u); - njs_value_data_set(&hash->value, dgst); + njs_set_data(&hash->value, dgst); vm->retval.data.u.object_value = hash; vm->retval.type = NJS_OBJECT_VALUE; @@ -452,7 +452,7 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NJS_ERROR; } - njs_value_data_set(&hmac->value, ctx); + njs_set_data(&hmac->value, ctx); vm->retval.data.u.object_value = hmac; vm->retval.type = NJS_OBJECT_VALUE; diff --git a/njs/njs_date.c b/njs/njs_date.c index 08bb30b4..d4f50701 100644 --- a/njs/njs_date.c +++ b/njs/njs_date.c @@ -23,32 +23,29 @@ sizeof("Mon Sep 28 1970 12:00:00 GMT+0600 (XXXXX)") -static nxt_noinline double njs_date_string_parse(njs_value_t *date); +static double njs_date_string_parse(njs_value_t *date); static double njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end); static double njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end); static const u_char *njs_date_skip_week_day(const u_char *p, const u_char *end); static const u_char *njs_date_skip_spaces(const u_char *p, const u_char *end); -static nxt_noinline nxt_int_t njs_date_month_parse(const u_char *p, +static nxt_int_t njs_date_month_parse(const u_char *p, const u_char *end); +static const u_char *njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end); -static nxt_noinline const u_char *njs_date_time_parse(struct tm *tm, - const u_char *p, const u_char *end); -static nxt_noinline nxt_int_t njs_date_gmtoff_parse(const u_char *start, - const u_char *end); -static nxt_noinline const u_char *njs_date_number_parse(int *value, - const u_char *p, const u_char *end, size_t size); +static nxt_int_t njs_date_gmtoff_parse(const u_char *start, const u_char *end); +static const u_char *njs_date_number_parse(int *value, const u_char *p, + const u_char *end, size_t size); static int64_t njs_timegm(struct tm *tm); -static nxt_noinline njs_ret_t njs_date_string(njs_vm_t *vm, const char *fmt, - double time); -static nxt_noinline double njs_date_time(struct tm *tm, int64_t ms); +static njs_ret_t njs_date_string(njs_vm_t *vm, const char *fmt, double time); +static double njs_date_time(struct tm *tm, int64_t ms); static double njs_date_utc_time(struct tm *tm, double time); static const njs_value_t njs_string_invalid_date = njs_string("Invalid Date"); -static nxt_noinline uint64_t +static uint64_t njs_gettime(void) { struct timeval tv; @@ -59,7 +56,7 @@ njs_gettime(void) } -static nxt_noinline double +static double njs_timeclip(double time) { if (isinf(time) || isnan(time) || fabs(time) > 8.64e15) { @@ -219,7 +216,7 @@ njs_date_utc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -278,7 +275,7 @@ static njs_ret_t njs_date_now(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { - njs_value_number_set(&vm->retval, njs_gettime()); + njs_set_number(&vm->retval, njs_gettime()); return NXT_OK; } @@ -297,13 +294,13 @@ njs_date_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, time = NAN; } - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } -static nxt_noinline double +static double njs_date_string_parse(njs_value_t *date) { int ext, ms, ms_length, skipped; @@ -704,7 +701,7 @@ njs_date_skip_spaces(const u_char *p, const u_char *end) } -static nxt_noinline nxt_int_t +static nxt_int_t njs_date_month_parse(const u_char *p, const u_char *end) { if (p + 2 < end) { @@ -792,7 +789,7 @@ njs_date_month_parse(const u_char *p, const u_char *end) } -static nxt_noinline const u_char * +static const u_char * njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end) { p = njs_date_number_parse(&tm->tm_hour, p, end, 2); @@ -821,7 +818,7 @@ njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end) } -static nxt_noinline nxt_int_t +static nxt_int_t njs_date_gmtoff_parse(const u_char *start, const u_char *end) { int gmtoff, hour, min; @@ -852,7 +849,7 @@ njs_date_gmtoff_parse(const u_char *start, const u_char *end) } -static nxt_noinline const u_char * +static const u_char * njs_date_number_parse(int *value, const u_char *p, const u_char *end, size_t size) { @@ -950,7 +947,7 @@ static njs_ret_t njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { - njs_value_number_set(&vm->retval, args[0].data.u.date->time); + njs_set_number(&vm->retval, args[0].data.u.date->time); return NXT_OK; } @@ -981,7 +978,7 @@ njs_date_prototype_to_time_string(njs_vm_t *vm, njs_value_t *args, } -static nxt_noinline njs_ret_t +static njs_ret_t njs_date_string(njs_vm_t *vm, const char *fmt, double time) { size_t size; @@ -1097,7 +1094,7 @@ njs_date_prototype_get_full_year(njs_vm_t *vm, njs_value_t *args, value = tm.tm_year + 1900; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1120,7 +1117,7 @@ njs_date_prototype_get_utc_full_year(njs_vm_t *vm, njs_value_t *args, value = tm.tm_year + 1900; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1143,7 +1140,7 @@ njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, value = tm.tm_mon; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1167,7 +1164,7 @@ njs_date_prototype_get_utc_month(njs_vm_t *vm, njs_value_t *args, value = tm.tm_mon; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1190,7 +1187,7 @@ njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, value = tm.tm_mday; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1213,7 +1210,7 @@ njs_date_prototype_get_utc_date(njs_vm_t *vm, njs_value_t *args, value = tm.tm_mday; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1236,7 +1233,7 @@ njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, value = tm.tm_wday; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1259,7 +1256,7 @@ njs_date_prototype_get_utc_day(njs_vm_t *vm, njs_value_t *args, value = tm.tm_wday; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1283,7 +1280,7 @@ njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, value = tm.tm_hour; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1306,7 +1303,7 @@ njs_date_prototype_get_utc_hours(njs_vm_t *vm, njs_value_t *args, value = tm.tm_hour; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1330,7 +1327,7 @@ njs_date_prototype_get_minutes(njs_vm_t *vm, njs_value_t *args, value = tm.tm_min; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1353,7 +1350,7 @@ njs_date_prototype_get_utc_minutes(njs_vm_t *vm, njs_value_t *args, value = tm.tm_min; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1371,7 +1368,7 @@ njs_date_prototype_get_seconds(njs_vm_t *vm, njs_value_t *args, value = (int64_t) (value / 1000) % 60; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1389,7 +1386,7 @@ njs_date_prototype_get_milliseconds(njs_vm_t *vm, njs_value_t *args, value = (int64_t) value % 1000; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1412,7 +1409,7 @@ njs_date_prototype_get_timezone_offset(njs_vm_t *vm, njs_value_t *args, value = - nxt_timezone(&tm) / 60; } - njs_value_number_set(&vm->retval, value); + njs_set_number(&vm->retval, value); return NXT_OK; } @@ -1437,7 +1434,7 @@ njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1462,7 +1459,7 @@ njs_date_prototype_set_milliseconds(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1491,7 +1488,7 @@ njs_date_prototype_set_seconds(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1530,7 +1527,7 @@ njs_date_prototype_set_minutes(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1565,7 +1562,7 @@ njs_date_prototype_set_utc_minutes(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1608,7 +1605,7 @@ njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1644,7 +1641,7 @@ njs_date_prototype_set_utc_hours(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1676,7 +1673,7 @@ njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1708,7 +1705,7 @@ njs_date_prototype_set_utc_date(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1744,7 +1741,7 @@ njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1780,7 +1777,7 @@ njs_date_prototype_set_utc_month(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1820,7 +1817,7 @@ njs_date_prototype_set_full_year(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } @@ -1860,13 +1857,13 @@ njs_date_prototype_set_utc_full_year(njs_vm_t *vm, njs_value_t *args, } args[0].data.u.date->time = time; - njs_value_number_set(&vm->retval, time); + njs_set_number(&vm->retval, time); return NXT_OK; } -static nxt_noinline double +static double njs_date_time(struct tm *tm, int64_t ms) { double time; diff --git a/njs/njs_error.c b/njs/njs_error.c index 82967adb..22e228f8 100644 --- a/njs/njs_error.c +++ b/njs/njs_error.c @@ -55,7 +55,7 @@ njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type, } -nxt_noinline njs_object_t * +njs_object_t * njs_error_alloc(njs_vm_t *vm, njs_value_type_t type, const njs_value_t *name, const njs_value_t *message) { diff --git a/njs/njs_error.h b/njs/njs_error.h index 6e7bf12a..05a8ad67 100644 --- a/njs/njs_error.h +++ b/njs/njs_error.h @@ -34,8 +34,8 @@ void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type, u_char *start, size_t size); -void njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type, - const char *fmt, ...); +void nxt_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, + njs_value_type_t type, const char *fmt, ...); void njs_memory_error(njs_vm_t *vm); void njs_memory_error_set(njs_vm_t *vm, njs_value_t *value); diff --git a/njs/njs_event.c b/njs/njs_event.c index fc4c00a2..90f71ed9 100644 --- a/njs/njs_event.c +++ b/njs/njs_event.c @@ -62,7 +62,7 @@ njs_add_event(njs_vm_t *vm, njs_event_t *event) return NJS_ERROR; } - njs_value_number_set(&vm->retval, vm->event_id - 1); + njs_set_number(&vm->retval, vm->event_id - 1); return NJS_OK; } diff --git a/njs/njs_extern.c b/njs/njs_extern.c index f0743b7e..6f33fddb 100644 --- a/njs/njs_extern.c +++ b/njs/njs_extern.c @@ -234,7 +234,7 @@ njs_vm_external_bind(njs_vm_t *vm, const nxt_str_t *var_name, } -nxt_noinline njs_external_ptr_t +njs_external_ptr_t njs_vm_external(njs_vm_t *vm, const njs_value_t *value) { if (nxt_fast_path(njs_is_external(value))) { diff --git a/njs/njs_fs.c b/njs/njs_fs.c index 3f897e2d..b1f8008e 100644 --- a/njs/njs_fs.c +++ b/njs/njs_fs.c @@ -120,7 +120,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, lhq.key = nxt_string_value("flag"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[2].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &flag); @@ -130,7 +130,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, lhq.key = nxt_string_value("encoding"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[2].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &encoding); @@ -339,7 +339,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, lhq.key = nxt_string_value("flag"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[2].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &flag); @@ -349,7 +349,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, lhq.key = nxt_string_value("encoding"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[2].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &encoding); @@ -573,7 +573,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("flag"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &flag); @@ -583,7 +583,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("encoding"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &encoding); @@ -593,7 +593,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("mode"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; mode = &prop->value; @@ -760,7 +760,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("flag"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &flag); @@ -770,7 +770,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("encoding"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; njs_string_get(&prop->value, &encoding); @@ -780,7 +780,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args, lhq.key = nxt_string_value("mode"); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&args[3].data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq); if (ret == NXT_OK) { prop = lhq.value; mode = &prop->value; diff --git a/njs/njs_function.c b/njs/njs_function.c index 2c58a519..55685177 100644 --- a/njs/njs_function.c +++ b/njs/njs_function.c @@ -171,7 +171,7 @@ njs_function_arguments_object_init(njs_vm_t *vm, njs_native_frame_t *frame) nargs = frame->nargs; - njs_value_number_set(&value, nargs); + njs_set_number(&value, nargs); prop = njs_object_prop_alloc(vm, &njs_string_length, &value, 1); if (nxt_slow_path(prop == NULL)) { @@ -247,9 +247,7 @@ njs_function_rest_parameters_init(njs_vm_t *vm, njs_native_frame_t *frame) rest_arguments = &frame->arguments[frame->function->u.lambda->nargs]; /* GC: retain. */ - rest_arguments->type = NJS_ARRAY; - rest_arguments->data.u.array = array; - rest_arguments->data.truth = 1; + njs_set_array(rest_arguments, array); return NXT_OK; } @@ -347,7 +345,7 @@ njs_function_native_frame(njs_vm_t *vm, njs_function_t *function, } -nxt_noinline njs_ret_t +njs_ret_t njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function, const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs, nxt_bool_t ctor) @@ -422,7 +420,7 @@ njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function, } -nxt_noinline njs_native_frame_t * +njs_native_frame_t * njs_function_frame_alloc(njs_vm_t *vm, size_t size) { size_t spare_size, chunk_size; @@ -474,7 +472,7 @@ njs_function_frame_alloc(njs_vm_t *vm, size_t size) } -nxt_noinline njs_ret_t +njs_ret_t njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, u_char *return_address) { @@ -948,7 +946,7 @@ njs_function_instance_length(njs_vm_t *vm, njs_value_t *value, n = 0; } - njs_value_number_set(retval, n); + njs_set_number(retval, n); return NXT_OK; } diff --git a/njs/njs_generator.c b/njs/njs_generator.c index c1ea3e49..be60bbf6 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -79,20 +79,20 @@ static nxt_int_t njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline nxt_int_t njs_generate_start_block(njs_vm_t *vm, +static nxt_int_t njs_generate_start_block(njs_vm_t *vm, njs_generator_t *generator, njs_generator_block_type_t type, const nxt_str_t *label); static njs_generator_block_t *njs_generate_lookup_block( njs_generator_block_t *block, uint32_t mask, const nxt_str_t *label); static njs_generator_block_t *njs_generate_find_block( njs_generator_block_t *block, uint32_t mask, const nxt_str_t *label); -static nxt_noinline void njs_generate_patch_block(njs_vm_t *vm, - njs_generator_t *generator, njs_generator_patch_t *list); +static void njs_generate_patch_block(njs_vm_t *vm, njs_generator_t *generator, + njs_generator_patch_t *list); static njs_generator_patch_t *njs_generate_make_continuation_patch(njs_vm_t *vm, njs_generator_block_t *block, const nxt_str_t *label, njs_ret_t offset); static njs_generator_patch_t *njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_block_t *block, const nxt_str_t *label, njs_ret_t offset); -static nxt_noinline void njs_generate_patch_block_exit(njs_vm_t *vm, +static void njs_generate_patch_block_exit(njs_vm_t *vm, njs_generator_t *generator); static const nxt_str_t *njs_generate_jump_destination(njs_vm_t *vm, njs_generator_block_t *block, const char *inst_type, uint32_t mask, @@ -148,8 +148,8 @@ static nxt_int_t njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_method_call(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline nxt_int_t njs_generate_call(njs_vm_t *vm, - njs_generator_t *generator, njs_parser_node_t *node); +static nxt_int_t njs_generate_call(njs_vm_t *vm, njs_generator_t *generator, + njs_parser_node_t *node); static nxt_int_t njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_throw_statement(njs_vm_t *vm, @@ -158,21 +158,19 @@ static nxt_int_t njs_generate_import_statement(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); static nxt_int_t njs_generate_export_statement(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline njs_index_t njs_generate_dest_index(njs_vm_t *vm, +static njs_index_t njs_generate_dest_index(njs_vm_t *vm, + njs_generator_t *generator, njs_parser_node_t *node); +static njs_index_t njs_generate_object_dest_index(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline njs_index_t - njs_generate_object_dest_index(njs_vm_t *vm, njs_generator_t *generator, - njs_parser_node_t *node); static njs_index_t njs_generate_node_temp_index_get(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline njs_index_t njs_generate_temp_index_get(njs_vm_t *vm, +static njs_index_t njs_generate_temp_index_get(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline nxt_int_t - njs_generate_children_indexes_release(njs_vm_t *vm, +static nxt_int_t njs_generate_children_indexes_release(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline nxt_int_t njs_generate_node_index_release(njs_vm_t *vm, +static nxt_int_t njs_generate_node_index_release(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); -static nxt_noinline nxt_int_t njs_generate_index_release(njs_vm_t *vm, +static nxt_int_t njs_generate_index_release(njs_vm_t *vm, njs_generator_t *generator, njs_index_t index); static nxt_int_t njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node); @@ -1239,7 +1237,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline nxt_int_t +static nxt_int_t njs_generate_start_block(njs_vm_t *vm, njs_generator_t *generator, njs_generator_block_type_t type, const nxt_str_t *label) { @@ -1354,7 +1352,7 @@ njs_generate_make_continuation_patch(njs_vm_t *vm, njs_generator_block_t *block, } -static nxt_noinline void +static void njs_generate_patch_block(njs_vm_t *vm, njs_generator_t *generator, njs_generator_patch_t *list) { @@ -1392,7 +1390,7 @@ njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_block_t *block, } -static nxt_noinline void +static void njs_generate_patch_block_exit(njs_vm_t *vm, njs_generator_t *generator) { njs_generator_block_t *block; @@ -2673,7 +2671,7 @@ njs_generate_method_call(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline nxt_int_t +static nxt_int_t njs_generate_call(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3136,7 +3134,7 @@ njs_generate_export_statement(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline njs_index_t +static njs_index_t njs_generate_dest_index(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3158,7 +3156,7 @@ njs_generate_dest_index(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline njs_index_t +static njs_index_t njs_generate_object_dest_index(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3197,7 +3195,7 @@ njs_generate_node_temp_index_get(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline njs_index_t +static njs_index_t njs_generate_temp_index_get(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3226,7 +3224,7 @@ njs_generate_temp_index_get(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline nxt_int_t +static nxt_int_t njs_generate_children_indexes_release(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3242,7 +3240,7 @@ njs_generate_children_indexes_release(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline nxt_int_t +static nxt_int_t njs_generate_node_index_release(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) { @@ -3254,7 +3252,7 @@ njs_generate_node_index_release(njs_vm_t *vm, njs_generator_t *generator, } -static nxt_noinline nxt_int_t +static nxt_int_t njs_generate_index_release(njs_vm_t *vm, njs_generator_t *generator, njs_index_t index) { diff --git a/njs/njs_json.c b/njs/njs_json.c index 5358fd22..89b0a9c9 100644 --- a/njs/njs_json.c +++ b/njs/njs_json.c @@ -519,9 +519,7 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value, } } - value->data.u.object = object; - value->type = NJS_OBJECT; - value->data.truth = 1; + njs_set_object(value, object); ctx->depth++; @@ -612,9 +610,7 @@ njs_json_parse_array(njs_json_parse_ctx_t *ctx, njs_value_t *value, } } - value->data.u.array = array; - value->type = NJS_ARRAY; - value->data.truth = 1; + njs_set_array(value, array); ctx->depth++; @@ -939,8 +935,8 @@ njs_json_skip_space(const u_char *start, const u_char *end) #define njs_json_is_non_empty(_value) \ (((_value)->type == NJS_OBJECT) \ - && !nxt_lvlhsh_is_empty(&(_value)->data.u.object->hash)) \ - || (((_value)->type == NJS_ARRAY) && (_value)->data.u.array->length != 0) + && !nxt_lvlhsh_is_empty(njs_object_hash(_value))) \ + || (((_value)->type == NJS_ARRAY) && njs_array_len(_value) != 0) static njs_ret_t @@ -966,7 +962,7 @@ njs_json_parse_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t unused, lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&state->value.data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&state->value), &lhq); if (nxt_slow_path(ret == NXT_DECLINED)) { state->index++; break; @@ -1010,8 +1006,7 @@ njs_json_parse_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t unused, lhq.pool = vm->mem_pool; if (njs_is_undefined(&parse->retval)) { - ret = nxt_lvlhsh_delete(&state->value.data.u.object->hash, - &lhq); + ret = nxt_lvlhsh_delete(njs_object_hash(&state->value), &lhq); } else { prop = njs_object_prop_alloc(vm, key, &parse->retval, 1); @@ -1020,8 +1015,7 @@ njs_json_parse_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t unused, } lhq.value = prop; - ret = nxt_lvlhsh_insert(&state->value.data.u.object->hash, - &lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(&state->value), &lhq); } if (nxt_slow_path(ret != NXT_OK)) { @@ -1035,8 +1029,8 @@ njs_json_parse_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t unused, break; case NJS_JSON_ARRAY_START: - if (state->index < state->value.data.u.array->length) { - value = &state->value.data.u.array->start[state->index]; + if (state->index < njs_array_len(&state->value)) { + value = &njs_array_start(&state->value)[state->index]; if (njs_json_is_non_empty(value)) { state = njs_json_push_parse_state(vm, parse, value); @@ -1054,7 +1048,7 @@ njs_json_parse_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t unused, return njs_json_parse_continuation_apply(vm, parse); case NJS_JSON_ARRAY_REPLACED: - value = &state->value.data.u.array->start[state->index]; + value = &njs_array_start(&state->value)[state->index]; *value = parse->retval; state->index++; @@ -1097,7 +1091,7 @@ njs_json_parse_continuation_apply(njs_vm_t *vm, njs_json_parse_t *parse) case NJS_JSON_ARRAY_START: njs_uint32_to_string(&arguments[1], state->index); - arguments[2] = state->value.data.u.array->start[state->index]; + arguments[2] = njs_array_start(&state->value)[state->index]; state->type = NJS_JSON_ARRAY_REPLACED; break; @@ -1270,7 +1264,7 @@ njs_json_stringify_continuation(njs_vm_t *vm, njs_value_t *args, lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); lhq.proto = &njs_object_hash_proto; - ret = nxt_lvlhsh_find(&state->value.data.u.object->hash, &lhq); + ret = nxt_lvlhsh_find(njs_object_hash(&state->value), &lhq); if (nxt_slow_path(ret == NXT_DECLINED)) { break; } @@ -1360,7 +1354,7 @@ njs_json_stringify_continuation(njs_vm_t *vm, njs_value_t *args, /* Fall through. */ case NJS_JSON_ARRAY_CONTINUE: - if (state->index >= state->value.data.u.array->length) { + if (state->index >= njs_array_len(&state->value)) { njs_json_stringify_indent(stringify->stack.items - 1); njs_json_stringify_append("]", 1); @@ -1377,7 +1371,7 @@ njs_json_stringify_continuation(njs_vm_t *vm, njs_value_t *args, njs_json_stringify_indent(stringify->stack.items); } - value = &state->value.data.u.array->start[state->index++]; + value = &njs_array_start(&state->value)[state->index++]; if (njs_is_object(value)) { to_json = njs_object_to_json_function(vm, value); @@ -1605,7 +1599,7 @@ njs_json_stringify_array(njs_vm_t *vm, njs_json_stringify_t *stringify) njs_array_t *properties, *array; properties_length = 1; - array = stringify->replacer.data.u.array; + array = njs_array(&stringify->replacer); array_length = array->length; for (i = 0; i < array_length; i++) { @@ -1704,7 +1698,7 @@ njs_json_push_stringify_state(njs_vm_t *vm, njs_json_stringify_t *stringify, state->prop_value = NULL; if (njs_is_array(&stringify->replacer)) { - state->keys = stringify->replacer.data.u.array; + state->keys = njs_array(&stringify->replacer); } else { if (njs_is_external(value)) { @@ -1953,7 +1947,7 @@ njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value) lhq.value = prop; - ret = nxt_lvlhsh_insert(&wrapper->data.u.object->hash, &lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(wrapper), &lhq); if (nxt_slow_path(ret != NXT_OK)) { return NULL; } @@ -2518,7 +2512,7 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value, /* Fall through. */ case NJS_JSON_ARRAY_CONTINUE: - if (state->index >= state->value.data.u.array->length) { + if (state->index >= njs_array_len(&state->value)) { njs_json_stringify_indent(stringify->stack.items); njs_json_stringify_append("]", 1); @@ -2535,7 +2529,7 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value, njs_json_stringify_indent(stringify->stack.items + 1); } - val = &state->value.data.u.array->start[state->index++]; + val = &njs_array_start(&state->value)[state->index++]; if (njs_dump_is_object(val)) { state = njs_json_push_stringify_state(vm, stringify, val); diff --git a/njs/njs_math.c b/njs/njs_math.c index 9b4ef2e5..6ef257bd 100644 --- a/njs/njs_math.c +++ b/njs/njs_math.c @@ -21,7 +21,7 @@ njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -49,7 +49,7 @@ njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -68,7 +68,7 @@ njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -96,7 +96,7 @@ njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -115,7 +115,7 @@ njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -134,7 +134,7 @@ njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -156,7 +156,7 @@ njs_object_math_atan2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -175,7 +175,7 @@ njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -194,7 +194,7 @@ njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -213,7 +213,7 @@ njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -234,7 +234,7 @@ njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = 32; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -253,7 +253,7 @@ njs_object_math_cos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -272,7 +272,7 @@ njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -291,7 +291,7 @@ njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -310,7 +310,7 @@ njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -329,7 +329,7 @@ njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -348,7 +348,7 @@ njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -379,7 +379,7 @@ njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -402,7 +402,7 @@ njs_object_math_imul(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = 0; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -421,7 +421,7 @@ njs_object_math_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -440,7 +440,7 @@ njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -459,7 +459,7 @@ njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -487,7 +487,7 @@ njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -525,7 +525,7 @@ njs_object_math_max(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -557,7 +557,7 @@ njs_object_math_min(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = INFINITY; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -590,7 +590,7 @@ njs_object_math_pow(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -604,7 +604,7 @@ njs_object_math_random(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = nxt_random(&vm->random) / 4294967296.0; - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -623,7 +623,7 @@ njs_object_math_round(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -646,7 +646,7 @@ njs_object_math_sign(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -665,7 +665,7 @@ njs_object_math_sin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -684,7 +684,7 @@ njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -703,7 +703,7 @@ njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -722,7 +722,7 @@ njs_object_math_tan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -741,7 +741,7 @@ njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -760,7 +760,7 @@ njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } diff --git a/njs/njs_module.c b/njs/njs_module.c index 17649c47..a012604c 100644 --- a/njs/njs_module.c +++ b/njs/njs_module.c @@ -24,7 +24,7 @@ typedef struct { static nxt_int_t njs_module_lookup(njs_vm_t *vm, const nxt_str_t *cwd, njs_module_info_t *info); -static nxt_noinline nxt_int_t njs_module_relative_path(njs_vm_t *vm, +static nxt_int_t njs_module_relative_path(njs_vm_t *vm, const nxt_str_t *dir, njs_module_info_t *info); static nxt_int_t njs_module_absolute_path(njs_vm_t *vm, njs_module_info_t *info); @@ -55,9 +55,7 @@ njs_module_load(njs_vm_t *vm) if (module->function.native) { value = njs_vmcode_operand(vm, module->index); - value->data.u.object = &module->object; - value->type = NJS_OBJECT; - value->data.truth = 1; + njs_set_object(value, &module->object); } else { ret = njs_vm_invoke(vm, &module->function, NULL, 0, module->index); @@ -285,7 +283,7 @@ njs_module_absolute_path(njs_vm_t *vm, njs_module_info_t *info) } -static nxt_noinline nxt_int_t +static nxt_int_t njs_module_relative_path(njs_vm_t *vm, const nxt_str_t *dir, njs_module_info_t *info) { @@ -532,9 +530,7 @@ njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args, module = lhq.value; module->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object; - vm->retval.data.u.object = &module->object; - vm->retval.type = NJS_OBJECT; - vm->retval.data.truth = 1; + njs_set_object(&vm->retval, &module->object); return NXT_OK; } diff --git a/njs/njs_number.c b/njs/njs_number.c index 2287472d..a0d83d22 100644 --- a/njs/njs_number.c +++ b/njs/njs_number.c @@ -38,7 +38,7 @@ njs_value_to_index(const njs_value_t *value) } else if (njs_is_array(value)) { - array = value->data.u.array; + array = njs_array(value); if (nxt_lvlhsh_is_empty(&array->object.hash)) { @@ -62,45 +62,6 @@ njs_value_to_index(const njs_value_t *value) } -double -njs_primitive_value_to_number(const njs_value_t *value) -{ - if (nxt_fast_path(njs_is_numeric(value))) { - return value->data.u.number; - } - - return njs_string_to_number(value, 1); -} - - -int32_t -njs_primitive_value_to_integer(const njs_value_t *value) -{ - return njs_number_to_integer(njs_primitive_value_to_number(value)); -} - - -int32_t -njs_primitive_value_to_int32(const njs_value_t *value) -{ - return njs_number_to_int32(njs_primitive_value_to_number(value)); -} - - -uint32_t -njs_primitive_value_to_uint32(const njs_value_t *value) -{ - return njs_number_to_uint32(njs_primitive_value_to_number(value)); -} - - -uint32_t -njs_primitive_value_to_length(const njs_value_t *value) -{ - return njs_number_to_length(njs_primitive_value_to_number(value)); -} - - double njs_number_dec_parse(const u_char **start, const u_char *end) { @@ -302,7 +263,7 @@ njs_number_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, vm->retval.data.truth = 1; } else { - njs_value_number_set(&vm->retval, value->data.u.number); + njs_set_number(&vm->retval, value->data.u.number); } return NXT_OK; @@ -809,7 +770,7 @@ njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -827,86 +788,12 @@ njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, num = njs_string_to_number(&args[1], 1); } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } -int64_t -njs_number_to_int64(double num) -{ -#if (NXT_NAN_TO_UINT_CONVERSION != 0) - /* - * PPC32: NaN and Inf are converted to 0x8000000080000000 - * and become non-zero after truncation. - */ - - if (isnan(num) || isinf(num)) { - return 0; - } -#endif - - /* - * ES5.1: integer must be modulo 2^32. - * 2^53 is the largest integer number which can be stored safely - * in the IEEE-754 format and numbers less than 2^53 can be just - * converted to int64_t eliding more expensive fmod() operation. - * Then the int64 integer is truncated to uint32_t. The NaN is - * converted to 0x8000000000000000 and becomes 0 after truncation. - * fmod() of the Infinity returns NaN. - */ - - if (fabs(num) > 9007199254740992.0) { - return (int64_t) fmod(num, 4294967296.0); - } - - return (int64_t) num; -} - - -nxt_noinline int32_t -njs_number_to_integer(double num) -{ - return (int32_t) njs_number_to_int64(num); -} - - -nxt_noinline int32_t -njs_number_to_int32(double num) -{ - return (int32_t) njs_number_to_int64(num); -} - - -nxt_noinline uint32_t -njs_number_to_uint32(double num) -{ - return (uint32_t) njs_number_to_int64(num); -} - - -nxt_noinline uint32_t -njs_number_to_length(double num) -{ -#if (NXT_NAN_TO_UINT_CONVERSION != 0) - if (isnan(num)) { - return 0; - } -#endif - - if (num > UINT32_MAX) { - return UINT32_MAX; - - } else if (num < 0.0) { - return 0; - } - - return (uint32_t) (int64_t) num; -} - - - static const njs_object_prop_t njs_is_nan_function_properties[] = { /* isNaN.name == "isNaN". */ diff --git a/njs/njs_number.h b/njs/njs_number.h index 47c6c618..a1e76285 100644 --- a/njs/njs_number.h +++ b/njs/njs_number.h @@ -8,15 +8,11 @@ #define _NJS_NUMBER_H_INCLUDED_ +#include #include uint32_t njs_value_to_index(const njs_value_t *value); -double njs_primitive_value_to_number(const njs_value_t *value); -int32_t njs_primitive_value_to_integer(const njs_value_t *value); -int32_t njs_primitive_value_to_int32(const njs_value_t *value); -uint32_t njs_primitive_value_to_uint32(const njs_value_t *value); -uint32_t njs_primitive_value_to_length(const njs_value_t *value); double njs_number_dec_parse(const u_char **start, const u_char *end); uint64_t njs_number_oct_parse(const u_char **start, const u_char *end); uint64_t njs_number_bin_parse(const u_char **start, const u_char *end); @@ -35,11 +31,80 @@ njs_ret_t njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); njs_ret_t njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); -int64_t njs_number_to_int64(double num); -nxt_noinline int32_t njs_number_to_integer(double num); -nxt_noinline int32_t njs_number_to_int32(double num); -nxt_noinline uint32_t njs_number_to_uint32(double num); -nxt_noinline uint32_t njs_number_to_length(double num); + + +nxt_inline int64_t +njs_number_to_int64(double num) +{ +#if (NXT_NAN_TO_UINT_CONVERSION != 0) + /* + * PPC32: NaN and Inf are converted to 0x8000000080000000 + * and become non-zero after truncation. + */ + + if (isnan(num) || isinf(num)) { + return 0; + } +#endif + + /* + * ES5.1: integer must be modulo 2^32. + * 2^53 is the largest integer number which can be stored safely + * in the IEEE-754 format and numbers less than 2^53 can be just + * converted to int64_t eliding more expensive fmod() operation. + * Then the int64 integer is truncated to uint32_t. The NaN is + * converted to 0x8000000000000000 and becomes 0 after truncation. + * fmod() of the Infinity returns NaN. + */ + + if (fabs(num) > 9007199254740992.0) { + return (int64_t) fmod(num, 4294967296.0); + } + + return (int64_t) num; +} + + +nxt_inline int32_t +njs_number_to_integer(double num) +{ + return (int32_t) njs_number_to_int64(num); +} + + +nxt_inline int32_t +njs_number_to_int32(double num) +{ + return (int32_t) njs_number_to_int64(num); +} + + +nxt_inline uint32_t +njs_number_to_uint32(double num) +{ + return (uint32_t) njs_number_to_int64(num); +} + + +nxt_inline uint32_t +njs_number_to_length(double num) +{ +#if (NXT_NAN_TO_UINT_CONVERSION != 0) + if (isnan(num)) { + return 0; + } +#endif + + if (num > UINT32_MAX) { + return UINT32_MAX; + + } else if (num < 0.0) { + return 0; + } + + return (uint32_t) (int64_t) num; +} + nxt_inline nxt_int_t njs_char_to_hex(u_char c) @@ -64,6 +129,45 @@ njs_char_to_hex(u_char c) } +nxt_inline double +njs_primitive_value_to_number(const njs_value_t *value) +{ + if (nxt_fast_path(njs_is_numeric(value))) { + return value->data.u.number; + } + + return njs_string_to_number(value, 1); +} + + +nxt_inline int32_t +njs_primitive_value_to_integer(const njs_value_t *value) +{ + return njs_number_to_integer(njs_primitive_value_to_number(value)); +} + + +nxt_inline int32_t +njs_primitive_value_to_int32(const njs_value_t *value) +{ + return njs_number_to_int32(njs_primitive_value_to_number(value)); +} + + +nxt_inline uint32_t +njs_primitive_value_to_uint32(const njs_value_t *value) +{ + return njs_number_to_uint32(njs_primitive_value_to_number(value)); +} + + +nxt_inline uint32_t +njs_primitive_value_to_length(const njs_value_t *value) +{ + return njs_number_to_length(njs_primitive_value_to_number(value)); +} + + nxt_inline void njs_uint32_to_string(njs_value_t *value, uint32_t u32) { diff --git a/njs/njs_object.c b/njs/njs_object.c index 9d80124d..a5fd7f48 100644 --- a/njs/njs_object.c +++ b/njs/njs_object.c @@ -29,7 +29,7 @@ static njs_ret_t njs_object_own_enumerate_object(njs_vm_t *vm, njs_object_enum_t kind, nxt_bool_t all); -nxt_noinline njs_object_t * +njs_object_t * njs_object_alloc(njs_vm_t *vm) { njs_object_t *object; @@ -79,7 +79,7 @@ njs_object_value_copy(njs_vm_t *vm, njs_value_t *value) } -nxt_noinline njs_object_t * +njs_object_t * njs_object_value_alloc(njs_vm_t *vm, const njs_value_t *value, nxt_uint_t type) { nxt_uint_t index; @@ -266,9 +266,7 @@ njs_object_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, object->__proto__ = NULL; } - vm->retval.data.u.object = object; - vm->retval.type = NJS_OBJECT; - vm->retval.data.truth = 1; + njs_set_object(&vm->retval, object); return NXT_OK; } @@ -301,9 +299,7 @@ njs_object_keys(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NXT_ERROR; } - vm->retval.data.u.array = keys; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, keys); return NXT_OK; } @@ -330,9 +326,7 @@ njs_object_values(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NXT_ERROR; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); return NXT_OK; } @@ -359,9 +353,7 @@ njs_object_entries(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NXT_ERROR; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); return NXT_OK; } @@ -739,9 +731,7 @@ njs_object_enumerate_array(njs_vm_t *vm, const njs_array_t *array, /* GC: retain. */ entry->start[1] = array->start[i]; - item->data.u.array = entry; - item->type = NJS_ARRAY; - item->data.truth = 1; + njs_set_array(item, entry); item++; } @@ -831,9 +821,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value, njs_string_short_set(string, 1, 1); - item->data.u.array = entry; - item->type = NJS_ARRAY; - item->data.truth = 1; + njs_set_array(item, entry); item++; } @@ -861,9 +849,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value, njs_string_short_set(string, size, 1); - item->data.u.array = entry; - item->type = NJS_ARRAY; - item->data.truth = 1; + njs_set_array(item, entry); item++; @@ -1049,9 +1035,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object, /* GC: retain. */ entry->start[1] = prop->value; - item->data.u.array = entry; - item->type = NJS_ARRAY; - item->data.truth = 1; + njs_set_array(item, entry); item++; } @@ -1088,9 +1072,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object, /* GC: retain. */ entry->start[1] = prop->value; - item->data.u.array = entry; - item->type = NJS_ARRAY; - item->data.truth = 1; + njs_set_array(item, entry); item++; } @@ -1181,7 +1163,7 @@ njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto); - hash = &desc->data.u.object->hash; + hash = njs_object_hash(desc); for ( ;; ) { prop = nxt_lvlhsh_each(hash, &lhe); @@ -1286,9 +1268,7 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args, } } - vm->retval.data.u.object = descriptors; - vm->retval.type = NJS_OBJECT; - vm->retval.data.truth = 1; + njs_set_object(&vm->retval, descriptors); return NXT_OK; } @@ -1315,9 +1295,7 @@ njs_object_get_own_property_names(njs_vm_t *vm, njs_value_t *args, return NXT_ERROR; } - vm->retval.data.u.array = names; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, names); return NXT_OK; } diff --git a/njs/njs_object_property.c b/njs/njs_object_property.c index b415213a..a307f3b3 100644 --- a/njs/njs_object_property.c +++ b/njs/njs_object_property.c @@ -698,7 +698,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object, pq.lhq.value = prop; pq.lhq.pool = vm->mem_pool; - ret = nxt_lvlhsh_insert(&object->data.u.object->hash, &pq.lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(object), &pq.lhq); if (nxt_slow_path(ret != NXT_OK)) { njs_internal_error(vm, "lvlhsh insert failed"); return NXT_ERROR; @@ -712,7 +712,7 @@ found: } -nxt_noinline njs_object_prop_t * +njs_object_prop_t * njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name, const njs_value_t *value, uint8_t attributes) { @@ -745,7 +745,7 @@ njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name, } -nxt_noinline njs_object_prop_t * +njs_object_prop_t * njs_object_property(njs_vm_t *vm, const njs_object_t *object, nxt_lvlhsh_query_t *lhq) { @@ -848,7 +848,7 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, pq.lhq.replace = 0; pq.lhq.pool = vm->mem_pool; - ret = nxt_lvlhsh_insert(&object->data.u.object->hash, &pq.lhq); + ret = nxt_lvlhsh_insert(njs_object_hash(object), &pq.lhq); if (nxt_slow_path(ret != NXT_OK)) { njs_internal_error(vm, "lvlhsh insert failed"); return NXT_ERROR; @@ -1315,9 +1315,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest, return NXT_ERROR; } - dest->data.u.object = desc; - dest->type = NJS_OBJECT; - dest->data.truth = 1; + njs_set_object(dest, desc); return NXT_OK; } diff --git a/njs/njs_regexp.c b/njs/njs_regexp.c index a78025f4..d25a914b 100644 --- a/njs/njs_regexp.c +++ b/njs/njs_regexp.c @@ -600,7 +600,7 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length, } while (n != pattern->ngroups); } - njs_value_undefined_set(&vm->retval); + njs_set_undefined(&vm->retval); return pattern; @@ -734,7 +734,7 @@ njs_regexp_prototype_last_index(njs_vm_t *vm, njs_value_t *value, (void) njs_string_prop(&string, ®exp->string); index = njs_string_index(&string, regexp->last_index); - njs_value_number_set(retval, index); + njs_set_number(retval, index); return NXT_OK; } @@ -1010,7 +1010,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8, /* TODO: Non UTF-8 position */ - njs_value_number_set(&prop->value, regexp->last_index + captures[0]); + njs_set_number(&prop->value, regexp->last_index + captures[0]); if (regexp->pattern->global) { regexp->last_index += captures[1]; @@ -1062,9 +1062,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8, goto fail; } - prop->value.data.u.object = groups; - prop->value.type = NJS_OBJECT; - prop->value.data.truth = 1; + njs_set_object(&prop->value, groups); i = 0; @@ -1097,9 +1095,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8, } while (i < regexp->pattern->ngroups); } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); ret = NXT_OK; goto done; diff --git a/njs/njs_string.c b/njs/njs_string.c index fa60e85c..cf036300 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -60,10 +60,10 @@ static void njs_encode_base64_core(nxt_str_t *dst, const nxt_str_t *src, const u_char *basis, nxt_uint_t padding); static njs_ret_t njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src, const u_char *basis); -static nxt_noinline void njs_string_slice_prop(njs_string_prop_t *string, +static void njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice, njs_value_t *args, nxt_uint_t nargs); -static nxt_noinline void njs_string_slice_args(njs_slice_prop_t *slice, - njs_value_t *args, nxt_uint_t nargs); +static void njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args, + nxt_uint_t nargs); static njs_ret_t njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static njs_ret_t njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args, @@ -165,7 +165,7 @@ njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, } -nxt_noinline njs_ret_t +njs_ret_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size, uint32_t length) { @@ -182,7 +182,7 @@ njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start, } -nxt_noinline u_char * +u_char * njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size, uint64_t length) { @@ -274,7 +274,7 @@ njs_string_truncate(njs_value_t *value, uint32_t size) } -nxt_noinline njs_ret_t +njs_ret_t njs_string_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { u_char *p, c; @@ -376,7 +376,7 @@ njs_encode_base64_core(nxt_str_t *dst, const nxt_str_t *src, } -nxt_noinline njs_ret_t +njs_ret_t njs_string_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { nxt_str_t dst; @@ -399,7 +399,7 @@ njs_string_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) } -nxt_noinline njs_ret_t +njs_ret_t njs_string_base64url(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { size_t padding; @@ -444,7 +444,7 @@ njs_string_copy(njs_value_t *dst, njs_value_t *src) * sets njs_string_prop_t struct. */ -nxt_noinline njs_ret_t +njs_ret_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value) { u_char *start; @@ -517,7 +517,7 @@ njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value) } -nxt_noinline size_t +size_t njs_string_prop(njs_string_prop_t *string, const njs_value_t *value) { size_t size; @@ -680,7 +680,7 @@ njs_string_instance_length(njs_vm_t *vm, njs_value_t *value, length = (length == 0) ? size : length; } - njs_value_number_set(retval, length); + njs_set_number(retval, length); njs_release(vm, value); @@ -1089,7 +1089,7 @@ njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, * JavaScript 1.2, ECMAScript 3. */ -static nxt_noinline njs_ret_t +static njs_ret_t njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { @@ -1243,7 +1243,7 @@ njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } -static nxt_noinline void +static void njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice, njs_value_t *args, nxt_uint_t nargs) { @@ -1253,7 +1253,7 @@ njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice, } -static nxt_noinline void +static void njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args, nxt_uint_t nargs) { @@ -1308,7 +1308,7 @@ njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args, } -nxt_noinline void +void njs_string_slice_string_prop(njs_string_prop_t *dst, const njs_string_prop_t *string, const njs_slice_prop_t *slice) { @@ -1352,7 +1352,7 @@ njs_string_slice_string_prop(njs_string_prop_t *dst, } -nxt_noinline njs_ret_t +njs_ret_t njs_string_slice(njs_vm_t *vm, njs_value_t *dst, const njs_string_prop_t *string, const njs_slice_prop_t *slice) { @@ -1408,7 +1408,7 @@ njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args, done: - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return NXT_OK; } @@ -1453,7 +1453,7 @@ njs_string_bytes_from_array(njs_vm_t *vm, const njs_value_t *value) njs_array_t *array; njs_value_t *octet; - array = value->data.u.array; + array = njs_array(value); length = array->length; for (i = 0; i < length; i++) { @@ -1514,7 +1514,7 @@ njs_string_bytes_from_string(njs_vm_t *vm, const njs_value_t *args, } -nxt_noinline njs_ret_t +njs_ret_t njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { u_char *p, *dst; @@ -1561,7 +1561,7 @@ njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) } -nxt_noinline njs_ret_t +njs_ret_t njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { static u_char basis64[] = { @@ -1588,7 +1588,7 @@ njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) } -nxt_noinline njs_ret_t +njs_ret_t njs_string_decode_base64url(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src) { @@ -1796,7 +1796,7 @@ njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } @@ -1900,7 +1900,7 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, done: - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } @@ -2063,7 +2063,7 @@ done: * njs_string_offset() assumes that index is correct. */ -nxt_noinline const u_char * +const u_char * njs_string_offset(const u_char *start, const u_char *end, size_t index) { uint32_t *map; @@ -2091,7 +2091,7 @@ njs_string_offset(const u_char *start, const u_char *end, size_t index) * njs_string_index() assumes that offset is correct. */ -nxt_noinline uint32_t +uint32_t njs_string_index(njs_string_prop_t *string, uint32_t offset) { uint32_t *map, last, index; @@ -2134,7 +2134,7 @@ njs_string_index(njs_string_prop_t *string, uint32_t offset) } -nxt_noinline void +void njs_string_offset_map_init(const u_char *start, size_t size) { size_t offset; @@ -2613,7 +2613,7 @@ njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, done: - njs_value_number_set(&vm->retval, index); + njs_set_number(&vm->retval, index); return NXT_OK; } @@ -2760,9 +2760,7 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args, } while (p <= end); - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); } return NXT_OK; @@ -2932,9 +2930,7 @@ single: done: - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); return NXT_OK; } @@ -3237,7 +3233,7 @@ njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args, r->empty = (captures[0] == captures[1]); /* The offset of the matched substring. */ - njs_value_number_set(&arguments[n + 1], captures[0]); + njs_set_number(&arguments[n + 1], captures[0]); /* The whole string being examined. */ length = njs_string_calc_length(r->utf8, r->part[0].start, r->part[0].size); @@ -3375,7 +3371,7 @@ njs_string_replace_search_function(njs_vm_t *vm, njs_value_t *args, arguments[1] = args[1]; /* The offset of the matched substring. */ - njs_value_number_set(&arguments[2], r->part[0].size); + njs_set_number(&arguments[2], r->part[0].size); /* The whole string being examined. */ arguments[3] = args[0]; diff --git a/njs/njs_string.h b/njs/njs_string.h index 1f621ca7..b8426ae9 100644 --- a/njs/njs_string.h +++ b/njs/njs_string.h @@ -165,20 +165,18 @@ void njs_string_truncate(njs_value_t *value, uint32_t size); void njs_string_copy(njs_value_t *dst, njs_value_t *src); njs_ret_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value); -nxt_noinline size_t njs_string_prop(njs_string_prop_t *string, - const njs_value_t *value); +size_t njs_string_prop(njs_string_prop_t *string, const njs_value_t *value); njs_ret_t njs_string_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); nxt_bool_t njs_string_eq(const njs_value_t *val1, const njs_value_t *val2); nxt_int_t njs_string_cmp(const njs_value_t *val1, const njs_value_t *val2); -nxt_noinline void njs_string_slice_string_prop(njs_string_prop_t *dst, +void njs_string_slice_string_prop(njs_string_prop_t *dst, const njs_string_prop_t *string, const njs_slice_prop_t *slice); njs_ret_t njs_string_slice(njs_vm_t *vm, njs_value_t *dst, const njs_string_prop_t *string, const njs_slice_prop_t *slice); const u_char *njs_string_offset(const u_char *start, const u_char *end, size_t index); -nxt_noinline uint32_t njs_string_index(njs_string_prop_t *string, - uint32_t offset); +uint32_t njs_string_index(njs_string_prop_t *string, uint32_t offset); void njs_string_offset_map_init(const u_char *start, size_t size); njs_ret_t njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *src); diff --git a/njs/njs_vm.c b/njs/njs_vm.c index cb87bcc3..3bab70a3 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -21,12 +21,12 @@ struct njs_property_next_s { * and should fit in CPU L1 instruction cache. */ -static nxt_noinline njs_ret_t njs_string_concat(njs_vm_t *vm, - njs_value_t *val1, njs_value_t *val2); -static nxt_noinline njs_ret_t njs_values_equal(njs_vm_t *vm, - const njs_value_t *val1, const njs_value_t *val2); -static nxt_noinline njs_ret_t njs_values_compare(njs_vm_t *vm, - const njs_value_t *val1, const njs_value_t *val2); +static njs_ret_t njs_string_concat(njs_vm_t *vm, njs_value_t *val1, + njs_value_t *val2); +static njs_ret_t njs_values_equal(njs_vm_t *vm, const njs_value_t *val1, + const njs_value_t *val2); +static njs_ret_t njs_values_compare(njs_vm_t *vm, const njs_value_t *val1, + const njs_value_t *val2); static njs_ret_t njs_function_frame_create(njs_vm_t *vm, njs_value_t *value, const njs_value_t *this, uintptr_t nargs, nxt_bool_t ctor); static njs_object_t *njs_function_new_object(njs_vm_t *vm, njs_value_t *value); @@ -108,7 +108,7 @@ const nxt_str_t njs_entry_anonymous = nxt_string("anonymous"); * values is passed as arguments although they are not always used. */ -nxt_noinline nxt_int_t +nxt_int_t njs_vmcode_interpreter(njs_vm_t *vm) { u_char *catch; @@ -255,7 +255,7 @@ start: } -nxt_noinline void +void njs_value_retain(njs_value_t *value) { njs_string_t *string; @@ -276,7 +276,7 @@ njs_value_retain(njs_value_t *value) } -nxt_noinline void +void njs_value_release(njs_vm_t *vm, njs_value_t *value) { njs_string_t *string; @@ -318,9 +318,7 @@ njs_vmcode_object(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2) object = njs_object_alloc(vm); if (nxt_fast_path(object != NULL)) { - vm->retval.data.u.object = object; - vm->retval.type = NJS_OBJECT; - vm->retval.data.truth = 1; + njs_set_object(&vm->retval, object); return sizeof(njs_vmcode_object_t); } @@ -359,9 +357,7 @@ njs_vmcode_array(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2) array->length = 0; } - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + njs_set_array(&vm->retval, array); return sizeof(njs_vmcode_array_t); } @@ -430,9 +426,7 @@ njs_vmcode_arguments(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2) code = (njs_vmcode_arguments_t *) vm->current; value = njs_vmcode_operand(vm, code->dst); - value->data.u.object = frame->native.arguments_object; - value->type = NJS_OBJECT; - value->data.truth = 1; + njs_set_object(value, frame->native.arguments_object); return sizeof(njs_vmcode_arguments_t); } @@ -477,7 +471,7 @@ njs_vmcode_template_literal(njs_vm_t *vm, njs_value_t *invld1, value = njs_vmcode_operand(vm, retval); if (!njs_is_primitive(value)) { - array = value->data.u.array; + array = njs_array(value); ret = njs_function_activate(vm, (njs_function_t *) &concat, &njs_string_empty, array->start, @@ -996,7 +990,7 @@ njs_vmcode_increment(njs_vm_t *vm, njs_value_t *reference, njs_value_t *value) njs_release(vm, reference); - njs_value_number_set(reference, num); + njs_set_number(reference, num); vm->retval = *reference; return sizeof(njs_vmcode_3addr_t); @@ -1016,7 +1010,7 @@ njs_vmcode_decrement(njs_vm_t *vm, njs_value_t *reference, njs_value_t *value) njs_release(vm, reference); - njs_value_number_set(reference, num); + njs_set_number(reference, num); vm->retval = *reference; return sizeof(njs_vmcode_3addr_t); @@ -1037,8 +1031,8 @@ njs_vmcode_post_increment(njs_vm_t *vm, njs_value_t *reference, njs_release(vm, reference); - njs_value_number_set(reference, num + 1.0); - njs_value_number_set(&vm->retval, num); + njs_set_number(reference, num + 1.0); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1058,8 +1052,8 @@ njs_vmcode_post_decrement(njs_vm_t *vm, njs_value_t *reference, njs_release(vm, reference); - njs_value_number_set(reference, num - 1.0); - njs_value_number_set(&vm->retval, num); + njs_set_number(reference, num - 1.0); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1140,7 +1134,7 @@ njs_ret_t njs_vmcode_unary_plus(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) { if (nxt_fast_path(njs_is_numeric(value))) { - njs_value_number_set(&vm->retval, value->data.u.number); + njs_set_number(&vm->retval, value->data.u.number); return sizeof(njs_vmcode_2addr_t); } @@ -1152,7 +1146,7 @@ njs_ret_t njs_vmcode_unary_negation(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) { if (nxt_fast_path(njs_is_numeric(value))) { - njs_value_number_set(&vm->retval, - value->data.u.number); + njs_set_number(&vm->retval, - value->data.u.number); return sizeof(njs_vmcode_2addr_t); } @@ -1170,7 +1164,7 @@ njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { num = val1->data.u.number + val2->data.u.number; - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1205,7 +1199,7 @@ njs_vmcode_addition(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) } -static nxt_noinline njs_ret_t +static njs_ret_t njs_string_concat(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) { u_char *start; @@ -1251,7 +1245,7 @@ njs_vmcode_substraction(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { num = val1->data.u.number - val2->data.u.number; - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1268,7 +1262,7 @@ njs_vmcode_multiplication(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { num = val1->data.u.number * val2->data.u.number; - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1302,7 +1296,7 @@ njs_vmcode_exponentiation(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num = NAN; } - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1319,7 +1313,7 @@ njs_vmcode_division(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { num = val1->data.u.number / val2->data.u.number; - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1336,7 +1330,7 @@ njs_vmcode_remainder(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) if (nxt_fast_path(njs_is_numeric(val1) && njs_is_numeric(val2))) { num = fmod(val1->data.u.number, val2->data.u.number); - njs_value_number_set(&vm->retval, num); + njs_set_number(&vm->retval, num); return sizeof(njs_vmcode_3addr_t); } @@ -1355,7 +1349,7 @@ njs_vmcode_left_shift(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num1 = njs_number_to_int32(val1->data.u.number); num2 = njs_number_to_uint32(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 << (num2 & 0x1f)); + njs_set_number(&vm->retval, num1 << (num2 & 0x1f)); return sizeof(njs_vmcode_3addr_t); } @@ -1374,7 +1368,7 @@ njs_vmcode_right_shift(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num1 = njs_number_to_int32(val1->data.u.number); num2 = njs_number_to_uint32(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 >> (num2 & 0x1f)); + njs_set_number(&vm->retval, num1 >> (num2 & 0x1f)); return sizeof(njs_vmcode_3addr_t); } @@ -1393,7 +1387,7 @@ njs_vmcode_unsigned_right_shift(njs_vm_t *vm, njs_value_t *val1, num1 = njs_number_to_uint32(val1->data.u.number); num2 = njs_number_to_uint32(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 >> (num2 & 0x1f)); + njs_set_number(&vm->retval, num1 >> (num2 & 0x1f)); return sizeof(njs_vmcode_3addr_t); } @@ -1459,7 +1453,7 @@ njs_vmcode_bitwise_not(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) if (nxt_fast_path(njs_is_numeric(value))) { num = njs_number_to_integer(value->data.u.number); - njs_value_number_set(&vm->retval, ~num); + njs_set_number(&vm->retval, ~num); return sizeof(njs_vmcode_2addr_t); } @@ -1477,7 +1471,7 @@ njs_vmcode_bitwise_and(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num1 = njs_number_to_integer(val1->data.u.number); num2 = njs_number_to_integer(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 & num2); + njs_set_number(&vm->retval, num1 & num2); return sizeof(njs_vmcode_3addr_t); } @@ -1495,7 +1489,7 @@ njs_vmcode_bitwise_xor(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num1 = njs_number_to_integer(val1->data.u.number); num2 = njs_number_to_integer(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 ^ num2); + njs_set_number(&vm->retval, num1 ^ num2); return sizeof(njs_vmcode_3addr_t); } @@ -1513,7 +1507,7 @@ njs_vmcode_bitwise_or(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) num1 = njs_number_to_uint32(val1->data.u.number); num2 = njs_number_to_uint32(val2->data.u.number); - njs_value_number_set(&vm->retval, num1 | num2); + njs_set_number(&vm->retval, num1 | num2); return sizeof(njs_vmcode_3addr_t); } @@ -1562,7 +1556,7 @@ njs_vmcode_not_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) } -static nxt_noinline njs_ret_t +static njs_ret_t njs_values_equal(njs_vm_t *vm, const njs_value_t *val1, const njs_value_t *val2) { nxt_bool_t nv1, nv2; @@ -1616,7 +1610,7 @@ njs_values_equal(njs_vm_t *vm, const njs_value_t *val1, const njs_value_t *val2) } -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_less(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) { njs_ret_t ret; @@ -1650,7 +1644,7 @@ njs_vmcode_less_or_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) } -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_greater_or_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) { njs_ret_t ret; @@ -1679,7 +1673,7 @@ njs_vmcode_greater_or_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) * or negative trap number if convertion to primitive is required. */ -static nxt_noinline njs_ret_t +static njs_ret_t njs_values_compare(njs_vm_t *vm, const njs_value_t *val1, const njs_value_t *val2) { @@ -1754,7 +1748,7 @@ njs_vmcode_strict_not_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2) } -nxt_noinline nxt_bool_t +nxt_bool_t njs_values_strict_equal(const njs_value_t *val1, const njs_value_t *val2) { size_t size, length1, length2; @@ -1925,9 +1919,7 @@ njs_function_frame_create(njs_vm_t *vm, njs_value_t *value, return NXT_ERROR; } - val.data.u.object = object; - val.type = NJS_OBJECT; - val.data.truth = 1; + njs_set_object(&val, object); this = &val; } } @@ -2398,7 +2390,7 @@ njs_vmcode_try_start(njs_vm_t *vm, njs_value_t *exception_value, * the nearest try_end block. The exit_value is checked by njs_vmcode_finally(). */ -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_try_break(njs_vm_t *vm, njs_value_t *exit_value, njs_value_t *offset) { @@ -2416,7 +2408,7 @@ njs_vmcode_try_break(njs_vm_t *vm, njs_value_t *exit_value, * the nearest try_end block. The exit_value is checked by njs_vmcode_finally(). */ -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_try_continue(njs_vm_t *vm, njs_value_t *exit_value, njs_value_t *offset) { @@ -2430,7 +2422,7 @@ njs_vmcode_try_continue(njs_vm_t *vm, njs_value_t *exit_value, * njs_vmcode_finally(), and jumps to the nearest try_break block. */ -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_try_return(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) { njs_vmcode_try_return_t *try_return; @@ -2450,7 +2442,7 @@ njs_vmcode_try_return(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld) * It is also set on the end of a "catch" block followed by a "finally" block. */ -nxt_noinline njs_ret_t +njs_ret_t njs_vmcode_try_end(njs_vm_t *vm, njs_value_t *invld, njs_value_t *offset) { njs_exception_t *e; @@ -2747,7 +2739,7 @@ njs_vmcode_number_primitive(njs_vm_t *vm, njs_value_t *invld, njs_value_t *narg) num = njs_string_to_number(value, 0); } - njs_value_number_set(value, num); + njs_set_number(value, num); } ret = sizeof(njs_vmcode_1addr_t); @@ -2845,7 +2837,7 @@ njs_vmcode_number_argument(njs_vm_t *vm, njs_value_t *invld1, num = njs_string_to_number(value, 0); } - njs_value_number_set(value, num); + njs_set_number(value, num); } *vm->top_frame->trap_values[1].data.u.value = *value; @@ -2959,7 +2951,7 @@ njs_vmcode_restart(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2) * for numbers and "toString", "valueOf" for strings. */ -static nxt_noinline njs_ret_t +static njs_ret_t njs_primitive_value(njs_vm_t *vm, njs_value_t *value, nxt_uint_t hint) { njs_ret_t ret; @@ -3342,164 +3334,6 @@ njs_vmcode_value_to_string(njs_vm_t *vm, njs_value_t *invld1, } -nxt_noinline void -njs_value_undefined_set(njs_value_t *value) -{ - *value = njs_value_undefined; -} - - -nxt_noinline void -njs_value_boolean_set(njs_value_t *value, int yn) -{ - *value = yn ? njs_value_true : njs_value_false; -} - - -nxt_noinline void -njs_value_number_set(njs_value_t *value, double num) -{ - value->data.u.number = num; - value->type = NJS_NUMBER; - value->data.truth = njs_is_number_true(num); -} - - -nxt_noinline void -njs_value_data_set(njs_value_t *value, void *data) -{ - value->data.u.data = data; - value->type = NJS_DATA; - value->data.truth = 1; -} - - -nxt_noinline njs_ret_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); -} - - -nxt_noinline 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); -} - - -void -njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...) -{ - va_list args; - u_char buf[NXT_MAX_ERROR_STR], *p; - - p = buf; - - if (fmt != NULL) { - va_start(args, fmt); - p = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args); - va_end(args); - } - - njs_error_new(vm, value, NJS_OBJECT_ERROR, buf, p - buf); -} - - -nxt_noinline uint8_t -njs_value_bool(const njs_value_t *value) -{ - return value->data.truth; -} - - -nxt_noinline double -njs_value_number(const njs_value_t *value) -{ - return value->data.u.number; -} - - -nxt_noinline void * -njs_value_data(const njs_value_t *value) -{ - return value->data.u.data; -} - - -nxt_noinline njs_function_t * -njs_value_function(const njs_value_t *value) -{ - return value->data.u.function; -} - - -nxt_noinline nxt_int_t -njs_value_is_null(const njs_value_t *value) -{ - return njs_is_null(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_undefined(const njs_value_t *value) -{ - return njs_is_undefined(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_null_or_undefined(const njs_value_t *value) -{ - return njs_is_null_or_undefined(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_boolean(const njs_value_t *value) -{ - return njs_is_boolean(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_number(const njs_value_t *value) -{ - return njs_is_number(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_valid_number(const njs_value_t *value) -{ - return njs_is_number(value) - && !isnan(value->data.u.number) - && !isinf(value->data.u.number); -} - - -nxt_noinline nxt_int_t -njs_value_is_string(const njs_value_t *value) -{ - return njs_is_string(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_object(const njs_value_t *value) -{ - return njs_is_object(value); -} - - -nxt_noinline nxt_int_t -njs_value_is_function(const njs_value_t *value) -{ - return njs_is_function(value); -} - - nxt_int_t njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value, uintptr_t *next) @@ -3518,7 +3352,7 @@ njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, break; case NJS_ARRAY: - array = value->data.u.array; + array = njs_array(value); do { n = (*next)++; diff --git a/njs/njs_vm.h b/njs/njs_vm.h index 19099c8f..6fc9c4b5 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -15,6 +15,8 @@ #include #include +#include + #define NJS_MAX_STACK_SIZE (16 * 1024 * 1024) @@ -564,6 +566,94 @@ typedef njs_ret_t (*njs_vmcode_operation_t)(njs_vm_t *vm, njs_value_t *value1, ((value)->type != NJS_INVALID) +#define njs_bool(value) \ + ((value)->data.truth) + + +#define njs_number(value) \ + ((value)->data.u.number) + + +#define njs_data(value) \ + ((value)->data.u.data) + + +#define njs_function(value) \ + ((value)->data.u.function) + + +#define njs_object(value) \ + ((value)->data.u.object) + + +#define njs_object_hash(value) \ + (&(value)->data.u.object->hash) + + +#define njs_array(value) \ + ((value)->data.u.array) + + +#define njs_array_len(value) \ + ((value)->data.u.array->length) + + +#define njs_array_start(value) \ + ((value)->data.u.array->start) + + +#define njs_set_undefined(value) \ + *(value) = njs_value_undefined + + +#define njs_set_boolean(value, yn) \ + *(value) = yn ? njs_value_true : njs_value_false + + +#define njs_set_true(value) \ + *(value) = njs_value_true + + +#define njs_set_false(value) \ + *(value) = njs_value_false + + +nxt_inline void +njs_set_number(njs_value_t *value, double num) +{ + value->data.u.number = num; + value->type = NJS_NUMBER; + value->data.truth = njs_is_number_true(num); +} + + +nxt_inline void +njs_set_data(njs_value_t *value, void *data) +{ + value->data.u.data = data; + value->type = NJS_DATA; + value->data.truth = 1; +} + + +nxt_inline void +njs_set_object(njs_value_t *value, njs_object_t *object) +{ + value->data.u.object = object; + value->type = NJS_OBJECT; + value->data.truth = 1; +} + + +nxt_inline void +njs_set_array(njs_value_t *value, njs_array_t *array) +{ + value->data.u.array = array; + value->type = NJS_ARRAY; + value->data.truth = 1; +} + + #define njs_set_invalid(value) \ (value)->type = NJS_INVALID diff --git a/nxt/nxt_lvlhsh.c b/nxt/nxt_lvlhsh.c index eb4a024f..916a5123 100644 --- a/nxt/nxt_lvlhsh.c +++ b/nxt/nxt_lvlhsh.c @@ -827,7 +827,7 @@ nxt_lvlhsh_level_each(nxt_lvlhsh_each_t *lhe, void **level, nxt_uint_t nlvl, } -static nxt_noinline void * +static void * nxt_lvlhsh_bucket_each(nxt_lvlhsh_each_t *lhe) { void *value, **next; -- 2.47.3