15#ifndef DUK_ERROR_H_INCLUDED
16#define DUK_ERROR_H_INCLUDED
50#if defined(DUK_USE_VERBOSE_ERRORS)
55#define DUK_ERROR(thr,err,msg) do { \
56 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
57 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
58 duk_err_handle_error((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \
60#define DUK_ERROR_RAW(thr,file,line,err,msg) do { \
61 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
62 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
63 duk_err_handle_error((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \
66#define DUK_ERROR_FMT1(thr,err,fmt,arg1) do { \
67 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
68 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
69 duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \
71#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) do { \
72 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
73 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
74 duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \
77#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) do { \
78 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
79 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
80 duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \
82#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) do { \
83 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
84 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
85 duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \
88#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) do { \
89 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
90 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
91 duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \
93#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) do { \
94 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
95 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
96 duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \
99#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) do { \
100 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \
101 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
102 duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \
104#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) do { \
105 duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \
106 DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \
107 duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \
112#define DUK_ERROR(thr,err,msg) duk_err_handle_error((thr), (err))
113#define DUK_ERROR_RAW(thr,file,line,err,msg) duk_err_handle_error((thr), (err))
115#define DUK_ERROR_FMT1(thr,err,fmt,arg1) DUK_ERROR((thr),(err),(fmt))
116#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
118#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) DUK_ERROR((thr),(err),(fmt))
119#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
121#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) DUK_ERROR((thr),(err),(fmt))
122#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
124#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR((thr),(err),(fmt))
125#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))
152#if defined(DUK_USE_PANIC_HANDLER)
154#define DUK_PANIC(code,msg) DUK_USE_PANIC_HANDLER((code),(msg))
156#define DUK_PANIC(code,msg) duk_default_panic_handler((code),(msg))
163#if defined(DUK_USE_ASSERTIONS)
169#define DUK_ASSERT(x) do { \
171 DUK_PANIC(DUK_ERR_ASSERTION_ERROR, \
172 "assertion failed: " #x \
173 " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"); \
181#if defined(DUK_USE_PANIC_HANDLER)
183#define DUK_ASSERT_EXPR(x) ((void) 0)
185#define DUK_ASSERT_EXPR(x) \
186 ((void) ((x) ? 0 : (DUK_PANIC(DUK_ERR_ASSERTION_ERROR, \
187 "assertion failed: " #x \
188 " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"), 0)))
193#define DUK_ASSERT(x) do { } while (0)
195#define DUK_ASSERT_EXPR(x) ((void) 0)
202#define DUK_ASSERT_DISABLE(x) do { } while (0)
208#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)
209#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) do { \
210 DUK_ASSERT((h) == NULL || DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) (h)) > 0); \
212#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) do { \
213 if ((tv) != NULL && DUK_TVAL_IS_HEAP_ALLOCATED((tv))) { \
214 DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(DUK_TVAL_GET_HEAPHDR((tv))) > 0); \
218#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h)
219#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv)
222#define DUK_ASSERT_TOP(ctx,n) DUK_ASSERT((duk_idx_t) duk_get_top((ctx)) == (duk_idx_t) (n))
224#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_PACKED_TVAL)
225#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) do { \
226 duk_double_union duk__assert_tmp_du; \
227 duk__assert_tmp_du.d = (dval); \
228 DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&duk__assert_tmp_du)); \
231#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval)
242#define DUK_VALSTACK_ASSERT_EXTRA 5
245#if defined(DUK_USE_ASSERTIONS)
246#define DUK_ASSERT_VALSTACK_SPACE(thr,n) do { \
247 DUK_ASSERT((thr) != NULL); \
248 DUK_ASSERT((thr)->valstack_end - (thr)->valstack_top >= (n) + DUK_VALSTACK_ASSERT_EXTRA); \
251#define DUK_ASSERT_VALSTACK_SPACE(thr,n)
264#if defined(DUK_USE_VERBOSE_ERRORS)
269#if defined(DUK_USE_PARANOID_ERRORS)
270#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,index,expectname,lowmemstr) do { \
271 duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (index), (expectname)); \
274#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,index,expectname,lowmemstr) do { \
275 duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (index), (expectname)); \
279#define DUK_ERROR_UNIMPLEMENTED(thr,msg) do { \
280 DUK_ERROR((thr), DUK_ERR_UNIMPLEMENTED_ERROR, (msg)); \
282#define DUK_ERROR_UNIMPLEMENTED_DEFMSG(thr) do { \
283 duk_err_unimplemented_defmsg((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
285#define DUK_ERROR_UNSUPPORTED(thr,msg) do { \
286 DUK_ERROR((thr), DUK_ERR_UNSUPPORTED_ERROR, (msg)); \
288#if !defined(DUK_USE_BYTECODE_DUMP_SUPPORT)
289#define DUK_ERROR_UNSUPPORTED_DEFMSG(thr) do { \
290 duk_err_unsupported_defmsg((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
293#define DUK_ERROR_INTERNAL(thr,msg) do { \
294 duk_err_internal((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
296#define DUK_ERROR_INTERNAL_DEFMSG(thr) do { \
297 duk_err_internal_defmsg((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \
299#define DUK_ERROR_ALLOC(thr,msg) do { \
300 duk_err_alloc((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
302#define DUK_ERROR_ALLOC_DEFMSG(thr) do { \
303 DUK_ERROR_ALLOC((thr), DUK_STR_ALLOC_FAILED); \
306#define DUK_ERROR_API_INDEX(thr,index) do { \
307 duk_err_api_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (index)); \
309#define DUK_ERROR_API(thr,msg) do { \
310 duk_err_api((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
315#define DUK_ERROR_RANGE(thr,msg) do { \
316 duk_err_range((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \
319#define DUK_ERROR_SYNTAX(thr,msg) do { \
320 DUK_ERROR((thr), DUK_ERR_SYNTAX_ERROR, (msg)); \
322#define DUK_ERROR_TYPE(thr,msg) do { \
323 DUK_ERROR((thr), DUK_ERR_TYPE_ERROR, (msg)); \
329#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,index,expectname,lowmemstr) do { \
330 duk_err_type((thr)); \
333#define DUK_ERROR_UNIMPLEMENTED(thr,msg) do { \
334 duk_err_unimplemented((thr)); \
336#define DUK_ERROR_UNIMPLEMENTED_DEFMSG(thr) do { \
337 duk_err_unimplemented((thr)); \
339#define DUK_ERROR_UNSUPPORTED(thr,msg) do { \
340 duk_err_unsupported((thr)); \
342#define DUK_ERROR_UNSUPPORTED_DEFMSG(thr) do { \
343 duk_err_unsupported((thr)); \
345#define DUK_ERROR_INTERNAL(thr,msg) do { \
346 duk_err_internal((thr)); \
348#define DUK_ERROR_INTERNAL_DEFMSG(thr) do { \
349 duk_err_internal((thr)); \
351#define DUK_ERROR_ALLOC(thr,msg) do { \
352 duk_err_alloc((thr)); \
354#define DUK_ERROR_ALLOC_DEFMSG(thr) do { \
355 duk_err_alloc((thr)); \
357#define DUK_ERROR_API_INDEX(thr,index) do { \
358 duk_err_api((thr)); \
360#define DUK_ERROR_API(thr,msg) do { \
361 duk_err_api((thr)); \
363#define DUK_ERROR_RANGE(thr,msg) do { \
364 duk_err_range((thr)); \
366#define DUK_ERROR_SYNTAX(thr,msg) do { \
367 duk_err_syntax((thr)); \
369#define DUK_ERROR_TYPE(thr,msg) do { \
370 duk_err_type((thr)); \
378#if defined(DUK_USE_VERBOSE_ERRORS)
385#if defined(DUK_USE_VERBOSE_ERRORS)
393#if defined(DUK_USE_AUGMENT_ERROR_CREATE)
396#if defined(DUK_USE_AUGMENT_ERROR_THROW)
400#if defined(DUK_USE_VERBOSE_ERRORS)
401#if defined(DUK_USE_PARANOID_ERRORS)
410#if !defined(DUK_USE_BYTECODE_DUMP_SUPPORT)
431#if !defined(DUK_USE_PANIC_HANDLER)
duk_small_int_t duk_ret_t
#define DUK_INTERNAL_DECL
duk_int_fast32_t duk_int_t
#define DUK_NORETURN(decl)
duk_uint_fast32_t duk_uint_t
duk_small_int_t duk_bool_t
DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr)
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_DECL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, duk_int_t line, duk_bool_t noblame_fileline)
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_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line)
DUK_INTERNAL_DECL void duk_err_augment_error_throw(duk_hthread *thr)
DUK_INTERNAL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc)
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)
DUK_INTERNAL_DECL void duk_err_setup_heap_ljstate(duk_hthread *thr, duk_small_int_t lj_type)
DUK_INTERNAL_DECL duk_hobject * duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t err_code)