1 /*
2 * Do a longjmp call, calling the fatal error handler if no
3 * catchpoint exists.
4 */
5
6 #include "duk_internal.h"
7
duk_err_longjmp(duk_hthread * thr)8 DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) {
9 DUK_ASSERT(thr != NULL);
10
11 DUK_DD(DUK_DDPRINT("longjmp error: type=%d iserror=%d value1=%!T value2=%!T",
12 (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
13 &thr->heap->lj.value1, &thr->heap->lj.value2));
14
15 #if !defined(DUK_USE_CPP_EXCEPTIONS)
16 /* If we don't have a jmpbuf_ptr, there is little we can do
17 * except panic. The caller's expectation is that we never
18 * return.
19 *
20 * With C++ exceptions we now just propagate an uncaught error
21 * instead of invoking the fatal error handler. Because there's
22 * a dummy jmpbuf for C++ exceptions now, this could be changed.
23 */
24 if (!thr->heap->lj.jmpbuf_ptr) {
25
26 DUK_D(DUK_DPRINT("uncaught error: type=%d iserror=%d value1=%!T value2=%!T",
27 (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,
28 &thr->heap->lj.value1, &thr->heap->lj.value2));
29
30 duk_fatal((duk_context *) thr, DUK_ERR_UNCAUGHT_ERROR, "uncaught error");
31 DUK_UNREACHABLE();
32 }
33 #endif /* DUK_USE_CPP_EXCEPTIONS */
34
35 #if defined(DUK_USE_CPP_EXCEPTIONS)
36 {
37 duk_internal_exception exc; /* dummy */
38 throw exc;
39 }
40 #else /* DUK_USE_CPP_EXCEPTIONS */
41 DUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb);
42 #endif /* DUK_USE_CPP_EXCEPTIONS */
43
44 DUK_UNREACHABLE();
45 }
46