[njs] Added public API to throw standard exceptions.
Dmitry Volyntsev
xeioex at nginx.com
Thu Jun 22 22:40:00 UTC 2023
details: https://hg.nginx.org/njs/rev/09441c1c24ea
branches:
changeset: 2157:09441c1c24ea
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Wed Jun 21 16:17:42 2023 -0700
description:
Added public API to throw standard exceptions.
diffstat:
src/njs.h | 26 +++++++++++++++++++-------
src/njs_error.c | 18 +++++++++---------
src/njs_error.h | 6 +++---
src/njs_parser.c | 2 +-
src/njs_promise.c | 10 ++++++----
src/njs_vm.c | 9 +++++++--
src/njs_vm.h | 1 +
7 files changed, 46 insertions(+), 26 deletions(-)
diffs (226 lines):
diff -r c2bc1525be25 -r 09441c1c24ea src/njs.h
--- a/src/njs.h Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs.h Wed Jun 21 16:17:42 2023 -0700
@@ -72,12 +72,23 @@ extern const njs_value_t njs_
((n < nargs) ? njs_argument(args, n) \
: (njs_value_assign(lvalue, &njs_value_undefined), lvalue))
-#define njs_vm_log(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_INFO, fmt, \
- ##__VA_ARGS__)
-#define njs_vm_warn(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_WARN, fmt, \
- ##__VA_ARGS__)
-#define njs_vm_err(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_ERROR, fmt, \
- ##__VA_ARGS__)
+#define njs_vm_log(vm, fmt, ...) \
+ njs_vm_logger(vm, NJS_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
+#define njs_vm_warn(vm, fmt, ...) \
+ njs_vm_logger(vm, NJS_LOG_LEVEL_WARN, fmt, ##__VA_ARGS__)
+#define njs_vm_err(vm, fmt, ...) \
+ njs_vm_logger(vm, NJS_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
+
+#define njs_vm_error(vm, fmt, ...) \
+ njs_vm_error2(vm, 0, fmt, ##__VA_ARGS__)
+#define njs_vm_internal_error(vm, fmt, ...) \
+ njs_vm_error2(vm, 2, fmt, ##__VA_ARGS__)
+#define njs_vm_range_error(vm, fmt, ...) \
+ njs_vm_error2(vm, 3, fmt, ##__VA_ARGS__)
+#define njs_vm_syntax_error(vm, fmt, ...) \
+ njs_vm_error2(vm, 5, fmt, ##__VA_ARGS__)
+#define njs_vm_type_error(vm, fmt, ...) \
+ njs_vm_error2(vm, 6, fmt, ##__VA_ARGS__)
#define njs_deprecated(vm, text) \
do { \
@@ -419,7 +430,8 @@ NJS_EXPORT njs_function_t *njs_vm_functi
NJS_EXPORT njs_bool_t njs_vm_constructor(njs_vm_t *vm);
NJS_EXPORT void njs_vm_throw(njs_vm_t *vm, const njs_value_t *value);
-NJS_EXPORT void njs_vm_error(njs_vm_t *vm, const char *fmt, ...);
+NJS_EXPORT void njs_vm_error2(njs_vm_t *vm, unsigned type, const char *fmt,
+ ...);
NJS_EXPORT void njs_vm_exception_get(njs_vm_t *vm, njs_value_t *retval);
NJS_EXPORT njs_mp_t *njs_vm_memory_pool(njs_vm_t *vm);
NJS_EXPORT njs_external_ptr_t njs_vm_external_ptr(njs_vm_t *vm);
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_error.c
--- a/src/njs_error.c Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_error.c Wed Jun 21 16:17:42 2023 -0700
@@ -28,7 +28,7 @@ static const njs_value_t njs_error_erro
void
-njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
+njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_t *proto,
u_char *start, size_t size)
{
ssize_t length;
@@ -46,7 +46,7 @@ njs_error_new(njs_vm_t *vm, njs_value_t
return;
}
- error = njs_error_alloc(vm, type, NULL, &string, NULL);
+ error = njs_error_alloc(vm, proto, NULL, &string, NULL);
if (njs_slow_path(error == NULL)) {
return;
}
@@ -55,7 +55,7 @@ njs_error_new(njs_vm_t *vm, njs_value_t
}
void
-njs_throw_error_va(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
+njs_throw_error_va(njs_vm_t *vm, njs_object_t *proto, const char *fmt,
va_list args)
{
u_char buf[NJS_MAX_ERROR_STR], *p;
@@ -66,7 +66,7 @@ njs_throw_error_va(njs_vm_t *vm, njs_obj
p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
}
- njs_error_new(vm, &vm->exception, type, buf, p - buf);
+ njs_error_new(vm, &vm->exception, proto, buf, p - buf);
}
@@ -76,7 +76,7 @@ njs_throw_error(njs_vm_t *vm, njs_object
va_list args;
va_start(args, fmt);
- njs_throw_error_va(vm, type, fmt, args);
+ njs_throw_error_va(vm, &vm->prototypes[type].object, fmt, args);
va_end(args);
}
@@ -96,7 +96,7 @@ njs_error_fmt_new(njs_vm_t *vm, njs_valu
va_end(args);
}
- njs_error_new(vm, dst, type, buf, p - buf);
+ njs_error_new(vm, dst, &vm->prototypes[type].object, buf, p - buf);
}
@@ -202,7 +202,7 @@ njs_error_stack(njs_vm_t *vm, njs_value_
njs_object_t *
-njs_error_alloc(njs_vm_t *vm, njs_object_type_t type, const njs_value_t *name,
+njs_error_alloc(njs_vm_t *vm, njs_object_t *proto, const njs_value_t *name,
const njs_value_t *message, const njs_value_t *errors)
{
njs_int_t ret;
@@ -223,7 +223,7 @@ njs_error_alloc(njs_vm_t *vm, njs_object
error->fast_array = 0;
error->error_data = 1;
error->stack_attached = 0;
- error->__proto__ = &vm->prototypes[type].object;
+ error->__proto__ = proto;
error->slots = NULL;
lhq.replace = 0;
@@ -339,7 +339,7 @@ njs_error_constructor(njs_vm_t *vm, njs_
}
}
- error = njs_error_alloc(vm, type, NULL,
+ error = njs_error_alloc(vm, &vm->prototypes[type].object, NULL,
njs_is_defined(value) ? value : NULL,
njs_is_defined(&list) ? &list : NULL);
if (njs_slow_path(error == NULL)) {
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_error.h
--- a/src/njs_error.h Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_error.h Wed Jun 21 16:17:42 2023 -0700
@@ -25,19 +25,19 @@
#define njs_uri_error(vm, fmt, ...) \
njs_throw_error(vm, NJS_OBJ_TYPE_URI_ERROR, fmt, ##__VA_ARGS__)
-void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
+void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_t *proto,
u_char *start, size_t size);
void njs_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst,
njs_object_type_t type, const char *fmt, ...);
void njs_throw_error(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
...);
-void njs_throw_error_va(njs_vm_t *vm, njs_object_type_t type, const char *fmt,
+void njs_throw_error_va(njs_vm_t *vm, njs_object_t *proto, const char *fmt,
va_list args);
void njs_memory_error(njs_vm_t *vm);
void njs_memory_error_set(njs_vm_t *vm, njs_value_t *value);
-njs_object_t *njs_error_alloc(njs_vm_t *vm, njs_object_type_t type,
+njs_object_t *njs_error_alloc(njs_vm_t *vm, njs_object_t *proto,
const njs_value_t *name, const njs_value_t *message,
const njs_value_t *errors);
njs_int_t njs_error_to_string(njs_vm_t *vm, njs_value_t *retval,
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_parser.c
--- a/src/njs_parser.c Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_parser.c Wed Jun 21 16:17:42 2023 -0700
@@ -9205,7 +9205,7 @@ njs_parser_error(njs_vm_t *vm, njs_objec
p = njs_sprintf(p, end, " in %uD", line);
}
- njs_error_new(vm, &error, type, msg, p - msg);
+ njs_error_new(vm, &error, &vm->prototypes[type].object, msg, p - msg);
njs_set_number(&value, line);
njs_value_property_set(vm, &error, njs_value_arg(&line_number), &value);
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_promise.c
--- a/src/njs_promise.c Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_promise.c Wed Jun 21 16:17:42 2023 -0700
@@ -1351,8 +1351,9 @@ njs_promise_perform_all(njs_vm_t *vm, nj
njs_set_array(&argument, pargs->args.data);
if (handler == njs_promise_perform_any_handler) {
- error = njs_error_alloc(vm, NJS_OBJ_TYPE_AGGREGATE_ERROR,
- NULL, &string_any_rejected, &argument);
+ error = njs_error_alloc(vm,
+ &vm->prototypes[NJS_OBJ_TYPE_AGGREGATE_ERROR].object,
+ NULL, &string_any_rejected, &argument);
if (njs_slow_path(error == NULL)) {
return NJS_ERROR;
}
@@ -1728,8 +1729,9 @@ njs_promise_any_reject_element_functions
if (--(*context->remaining_elements) == 0) {
njs_mp_free(vm->mem_pool, context->remaining_elements);
- error = njs_error_alloc(vm, NJS_OBJ_TYPE_AGGREGATE_ERROR,
- NULL, &string_any_rejected, &arr_value);
+ error = njs_error_alloc(vm,
+ &vm->prototypes[NJS_OBJ_TYPE_AGGREGATE_ERROR].object,
+ NULL, &string_any_rejected, &arr_value);
if (njs_slow_path(error == NULL)) {
return NJS_ERROR;
}
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_vm.c
--- a/src/njs_vm.c Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_vm.c Wed Jun 21 16:17:42 2023 -0700
@@ -733,12 +733,17 @@ njs_vm_throw(njs_vm_t *vm, const njs_val
void
-njs_vm_error(njs_vm_t *vm, const char *fmt, ...)
+njs_vm_error2(njs_vm_t *vm, unsigned type, const char *fmt, ...)
{
va_list args;
+ if (type > (NJS_OBJ_TYPE_ERROR_MAX - NJS_OBJ_TYPE_ERROR)) {
+ return;
+ }
+
va_start(args, fmt);
- njs_throw_error_va(vm, NJS_OBJ_TYPE_ERROR, fmt, args);
+ type += NJS_OBJ_TYPE_ERROR;
+ njs_throw_error_va(vm, &vm->prototypes[type].object, fmt, args);
va_end(args);
}
diff -r c2bc1525be25 -r 09441c1c24ea src/njs_vm.h
--- a/src/njs_vm.h Sun Jun 11 00:43:33 2023 +0200
+++ b/src/njs_vm.h Wed Jun 21 16:17:42 2023 -0700
@@ -76,6 +76,7 @@ typedef enum {
NJS_OBJ_TYPE_URI_ERROR,
NJS_OBJ_TYPE_MEMORY_ERROR,
NJS_OBJ_TYPE_AGGREGATE_ERROR,
+#define NJS_OBJ_TYPE_ERROR_MAX (NJS_OBJ_TYPE_AGGREGATE_ERROR)
NJS_OBJ_TYPE_MAX,
} njs_object_type_t;
More information about the nginx-devel
mailing list