Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
duktape-1.5.2/src-separate/duk_error_macros.c
Go to the documentation of this file.
1/*
2 * Error, fatal, and panic handling.
3 */
4
5#include "duk_internal.h"
6
7#define DUK__ERRFMT_BUFSIZE 256 /* size for formatting buffers */
8
9#if defined(DUK_USE_VERBOSE_ERRORS)
10
11DUK_INTERNAL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...) {
12 va_list ap;
13 char msg[DUK__ERRFMT_BUFSIZE];
14 va_start(ap, fmt);
15 (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap);
16 msg[sizeof(msg) - 1] = (char) 0;
17 duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));
18 va_end(ap); /* dead code, but ensures portability (see Linux man page notes) */
19}
20
21DUK_INTERNAL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg) {
22 duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));
23}
24
25#else /* DUK_USE_VERBOSE_ERRORS */
26
28 duk_err_create_and_throw(thr, code);
29}
30
31#endif /* DUK_USE_VERBOSE_ERRORS */
32
33/*
34 * Error throwing helpers
35 */
36
37#if defined(DUK_USE_VERBOSE_ERRORS)
38#if defined(DUK_USE_PARANOID_ERRORS)
39DUK_INTERNAL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t index, const char *expect_name) {
40 DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)",
41 expect_name, duk_get_type_name((duk_context *) thr, index), (long) index);
42}
43#else
44DUK_INTERNAL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t index, const char *expect_name) {
45 DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)",
46 expect_name, duk_push_string_readable((duk_context *) thr, index), (long) index);
47}
48#endif
49DUK_INTERNAL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
50 DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, message);
51}
52DUK_INTERNAL void duk_err_api_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t index) {
53 DUK_ERROR_RAW_FMT1(thr, filename, linenumber, DUK_ERR_API_ERROR, "invalid stack index %ld", (long) (index));
54}
55DUK_INTERNAL void duk_err_api(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
56 DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_API_ERROR, message);
57}
58DUK_INTERNAL void duk_err_unimplemented_defmsg(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
60}
61#if !defined(DUK_USE_BYTECODE_DUMP_SUPPORT)
62DUK_INTERNAL void duk_err_unsupported_defmsg(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
64}
65#endif
66DUK_INTERNAL void duk_err_internal_defmsg(duk_hthread *thr, const char *filename, duk_int_t linenumber) {
68}
69DUK_INTERNAL void duk_err_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
70 DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_INTERNAL_ERROR, message);
71}
72DUK_INTERNAL void duk_err_alloc(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {
73 DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ALLOC_ERROR, message);
74}
75#else
76/* The file/line arguments are NULL and 0, they're ignored by DUK_ERROR_RAW()
77 * when non-verbose errors are used.
78 */
79DUK_INTERNAL void duk_err_type(duk_hthread *thr) {
81}
84}
87}
88DUK_INTERNAL void duk_err_syntax(duk_hthread *thr) {
90}
91DUK_INTERNAL void duk_err_unimplemented(duk_hthread *thr) {
93}
94DUK_INTERNAL void duk_err_unsupported(duk_hthread *thr) {
96}
99}
102}
103#endif
104
105/*
106 * Default fatal error handler
107 */
108
110 DUK_UNREF(ctx);
111#if defined(DUK_USE_FILE_IO)
112 DUK_FPRINTF(DUK_STDERR, "FATAL %ld: %s\n", (long) code, (const char *) (msg ? msg : "null"));
114#else
115 /* omit print */
116#endif
117 DUK_D(DUK_DPRINT("default fatal handler called, code %ld -> calling DUK_PANIC()", (long) code));
118 DUK_PANIC(code, msg);
120}
121
122/*
123 * Default panic handler
124 */
125
126#if !defined(DUK_USE_PANIC_HANDLER)
128#if defined(DUK_USE_FILE_IO)
129 DUK_FPRINTF(DUK_STDERR, "PANIC %ld: %s ("
130#if defined(DUK_USE_PANIC_ABORT)
131 "calling abort"
132#elif defined(DUK_USE_PANIC_EXIT)
133 "calling exit"
134#elif defined(DUK_USE_PANIC_SEGFAULT)
135 "segfaulting on purpose"
136#else
137#error no DUK_USE_PANIC_xxx macro defined
138#endif
139 ")\n", (long) code, (const char *) (msg ? msg : "null"));
141#else
142 /* omit print */
143 DUK_UNREF(code);
144 DUK_UNREF(msg);
145#endif
146
147#if defined(DUK_USE_PANIC_ABORT)
148 DUK_ABORT();
149#elif defined(DUK_USE_PANIC_EXIT)
150 DUK_EXIT(-1);
151#elif defined(DUK_USE_PANIC_SEGFAULT)
152 /* exit() afterwards to satisfy "noreturn" */
153 DUK_CAUSE_SEGFAULT(); /* SCANBUILD: "Dereference of null pointer", normal */
154 DUK_EXIT(-1);
155#else
156#error no DUK_USE_PANIC_xxx macro defined
157#endif
158
160}
161#endif /* !DUK_USE_PANIC_HANDLER */
162
163#undef DUK__ERRFMT_BUFSIZE
guint index
duk_int_fast32_t duk_int_t
duk_uint_fast32_t duk_uint_t
DUK_INTERNAL_DECL const char * duk_push_string_readable(duk_context *ctx, duk_idx_t index)
#define DUK_ERROR_RAW_FMT1(thr, file, line, err, fmt, arg1)
#define DUK_STR_INTERNAL_ERROR
DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line)
#define DUK_PANIC(code, msg)
#define DUK_ERROR_RAW_FMT3(thr, file, line, err, fmt, arg1, arg2, arg3)
#define DUK_STR_UNIMPLEMENTED
#define DUK_ERROR_RAW(thr, file, line, err, msg)
#define DUK_ERR_ALLOC_ERROR
#define DUK_ERR_INTERNAL_ERROR
#define DUK_ERR_SYNTAX_ERROR
#define DUK_ERR_RANGE_ERROR
#define DUK_ERR_UNIMPLEMENTED_ERROR
#define DUK_ERR_UNSUPPORTED_ERROR
DUK_INTERNAL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t index, const char *expect_name)
DUK_INTERNAL void duk_err_api(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)
DUK_INTERNAL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)
DUK_INTERNAL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt,...)
DUK_INTERNAL void duk_default_panic_handler(duk_errcode_t code, const char *msg)
DUK_INTERNAL void duk_default_fatal_handler(duk_context *ctx, duk_errcode_t code, const char *msg)
DUK_INTERNAL void duk_err_api_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t index)
DUK_INTERNAL void duk_err_internal_defmsg(duk_hthread *thr, const char *filename, duk_int_t linenumber)
DUK_INTERNAL void duk_err_alloc(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)
DUK_INTERNAL void duk_err_unimplemented_defmsg(duk_hthread *thr, const char *filename, duk_int_t linenumber)
DUK_INTERNAL void duk_err_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)
DUK_INTERNAL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg)
#define NULL
Definition gmacros.h:924
static void error(LoadState *S, const char *why)