static njs_ret_t njs_method_private_copy(njs_vm_t *vm,
njs_property_query_t *pq);
-static nxt_noinline njs_ret_t njs_values_equal(const njs_value_t *val1,
- const njs_value_t *val2);
-static nxt_noinline njs_ret_t njs_values_compare(const njs_value_t *val1,
- const 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_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);
static njs_ret_t njs_function_frame_free(njs_vm_t *vm,
njs_native_frame_t *frame);
-static void njs_vm_trap(njs_vm_t *vm, nxt_uint_t trap, njs_value_t *value1,
+static void njs_vm_trap(njs_vm_t *vm, njs_trap_t trap, njs_value_t *value1,
njs_value_t *value2);
-static void njs_vm_trap_argument(njs_vm_t *vm, nxt_uint_t trap);
+static void njs_vm_trap_argument(njs_vm_t *vm, njs_trap_t trap);
static njs_ret_t njs_vmcode_number_primitive(njs_vm_t *vm, njs_value_t *invld,
njs_value_t *narg);
static njs_ret_t njs_vmcode_string_primitive(njs_vm_t *vm, njs_value_t *invld,
{
u_char *catch;
njs_ret_t ret;
+ njs_trap_t trap;
njs_value_t *retval, *value1, *value2;
njs_frame_t *frame;
njs_native_frame_t *previous;
}
}
- switch (ret) {
+ if (ret == NJS_TRAP) {
+ trap = vm->trap;
- case NJS_TRAP_NUMBER:
- value2 = value1;
+ switch (trap) {
- /* Fall through. */
+ case NJS_TRAP_NUMBER:
+ value2 = value1;
- case NJS_TRAP_NUMBERS:
- case NJS_TRAP_STRINGS:
- case NJS_TRAP_INCDEC:
- case NJS_TRAP_PROPERTY:
+ /* Fall through. */
- njs_vm_trap(vm, ret - NJS_TRAP_BASE, value1, value2);
+ case NJS_TRAP_NUMBERS:
+ case NJS_TRAP_STRINGS:
+ case NJS_TRAP_INCDEC:
+ case NJS_TRAP_PROPERTY:
- goto start;
+ njs_vm_trap(vm, trap, value1, value2);
- case NJS_TRAP_NUMBER_ARG:
- case NJS_TRAP_STRING_ARG:
+ goto start;
- njs_vm_trap_argument(vm, ret - NJS_TRAP_BASE);
+ case NJS_TRAP_NUMBER_ARG:
+ case NJS_TRAP_STRING_ARG:
- goto start;
+ njs_vm_trap_argument(vm, trap);
- default:
- break;
+ goto start;
+
+ default:
+ ret = NXT_ERROR;
+ break;
+ }
}
if (ret == NXT_ERROR) {
return sizeof(njs_vmcode_prop_get_t);
- case NJS_TRAP_PROPERTY:
+ case NJS_TRAP:
case NXT_ERROR:
default:
return sizeof(njs_vmcode_prop_set_t);
- case NJS_TRAP_PROPERTY:
+ case NJS_TRAP:
case NXT_ERROR:
default:
break;
- case NJS_TRAP_PROPERTY:
+ case NJS_TRAP:
case NXT_ERROR:
default:
break;
- case NJS_TRAP_PROPERTY:
+ case NJS_TRAP:
case NXT_ERROR:
default:
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_INCDEC;
+ return njs_trap(vm, NJS_TRAP_INCDEC);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_INCDEC;
+ return njs_trap(vm, NJS_TRAP_INCDEC);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_INCDEC;
+ return njs_trap(vm, NJS_TRAP_INCDEC);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_INCDEC;
+ return njs_trap(vm, NJS_TRAP_INCDEC);
}
return sizeof(njs_vmcode_2addr_t);
}
- return NJS_TRAP_NUMBER;
+ return njs_trap(vm, NJS_TRAP_NUMBER);
}
return sizeof(njs_vmcode_2addr_t);
}
- return NJS_TRAP_NUMBER;
+ return njs_trap(vm, NJS_TRAP_NUMBER);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_STRINGS;
+ return njs_trap(vm, NJS_TRAP_STRINGS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_2addr_t);
}
- return NJS_TRAP_NUMBER;
+ return njs_trap(vm, NJS_TRAP_NUMBER);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
return sizeof(njs_vmcode_3addr_t);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
njs_ret_t ret;
const njs_value_t *retval;
- ret = njs_values_equal(val1, val2);
+ ret = njs_values_equal(vm, val1, val2);
if (nxt_fast_path(ret >= 0)) {
njs_ret_t ret;
const njs_value_t *retval;
- ret = njs_values_equal(val1, val2);
+ ret = njs_values_equal(vm, val1, val2);
if (nxt_fast_path(ret >= 0)) {
static nxt_noinline njs_ret_t
-njs_values_equal(const njs_value_t *val1, const njs_value_t *val2)
+njs_values_equal(njs_vm_t *vm, const njs_value_t *val1, const njs_value_t *val2)
{
/* Void and null are equal and not comparable with anything else. */
if (njs_is_null_or_void(val1)) {
return (val1->data.u.object == val2->data.u.object);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
njs_ret_t ret;
const njs_value_t *retval;
- ret = njs_values_compare(val1, val2);
+ ret = njs_values_compare(vm, val1, val2);
if (nxt_fast_path(ret >= -1)) {
njs_ret_t ret;
const njs_value_t *retval;
- ret = njs_values_compare(val1, val2);
+ ret = njs_values_compare(vm, val1, val2);
if (nxt_fast_path(ret >= -1)) {
*/
static nxt_noinline njs_ret_t
-njs_values_compare(const njs_value_t *val1, const njs_value_t *val2)
+njs_values_compare(njs_vm_t *vm, const njs_value_t *val1,
+ const njs_value_t *val2)
{
if (nxt_fast_path(njs_is_numeric(val1) || njs_is_numeric(val2))) {
return (val1->data.u.number < val2->data.u.number);
}
- return NJS_TRAP_NUMBERS;
+ return njs_trap(vm, NJS_TRAP_NUMBERS);
}
if (nxt_fast_path(njs_is_string(val1) && njs_is_string(val2))) {
return (njs_string_cmp(val1, val2) < 0) ? 1 : 0;
}
- return NJS_TRAP_STRINGS;
+ return njs_trap(vm, NJS_TRAP_STRINGS);
}
njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
nxt_uint_t nargs)
{
- njs_ret_t trap;
nxt_uint_t n;
+ njs_trap_t trap;
n = nxt_min(nargs, NJS_ARGS_TYPES_MAX);
njs_vm_trap_value(vm, args);
- return trap;
+ return njs_trap(vm, trap);
type_error:
static const njs_vm_trap_t njs_vm_traps[] = {
- /* NJS_TRAP_STRING_ARG */ { &njs_trap_string_argument, 0 },
- /* NJS_TRAP_INTEGER_ARG */ { &njs_trap_number_argument, 0 },
- /* NJS_TRAP_PROPERTY */ { &njs_trap_strings[1], 0 },
- /* NJS_TRAP_STRINGS */ { &njs_trap_strings[0], 0 },
- /* NJS_TRAP_INCDEC */ { &njs_trap_numbers[1], 1 },
- /* NJS_TRAP_NUMBERS */ { &njs_trap_numbers[0], 0 },
- /* NJS_TRAP_NUMBER */ { &njs_trap_number[0], 0 },
+ /* NJS_TRAP_NUMBER */ { .code = &njs_trap_number[0] },
+ /* NJS_TRAP_NUMBERS */ { .code = &njs_trap_numbers[0] },
+ /* NJS_TRAP_INCDEC */ { .code = &njs_trap_numbers[1],
+ .reference = 1 },
+ /* NJS_TRAP_STRINGS */ { .code = &njs_trap_strings[0] },
+ /* NJS_TRAP_PROPERTY */ { .code = &njs_trap_strings[1] },
+ /* NJS_TRAP_NUMBER_ARG */ { .code = &njs_trap_number_argument },
+ /* NJS_TRAP_STRING_ARG */ { .code = &njs_trap_string_argument },
};
static void
-njs_vm_trap(njs_vm_t *vm, nxt_uint_t trap, njs_value_t *value1,
+njs_vm_trap(njs_vm_t *vm, njs_trap_t trap, njs_value_t *value1,
njs_value_t *value2)
{
njs_native_frame_t *frame;
*/
njs_set_invalid(&frame->trap_scratch);
frame->trap_values[1] = *value2;
- frame->trap_reference = njs_vm_traps[trap].reference_value;
+ frame->trap_reference = njs_vm_traps[trap].reference;
- if (njs_vm_traps[trap].reference_value) {
+ if (njs_vm_traps[trap].reference) {
frame->trap_values[0].data.u.value = value1;
} else {
static void
-njs_vm_trap_argument(njs_vm_t *vm, nxt_uint_t trap)
+njs_vm_trap_argument(njs_vm_t *vm, njs_trap_t trap)
{
njs_value_t *value;
njs_native_frame_t *frame;