47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
#include <stdlib.h>
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Winvalid-offsetof"
|
|
#include "js/Exception.h"
|
|
#pragma clang diagnostic pop
|
|
|
|
#include "smw/abort.h"
|
|
#include "smw/cx.h"
|
|
#include "smw/dump.h"
|
|
|
|
namespace smw {
|
|
|
|
void abort(const char* msg) {
|
|
abort(get_js_context(), msg);
|
|
}
|
|
|
|
void abort(JSContext *cx, const char* msg) {
|
|
fprintf(stderr, "Error: %s", msg);
|
|
|
|
if (JS_IsExceptionPending(cx)) {
|
|
fprintf(stderr, ":");
|
|
JS::ExceptionStack exception(cx);
|
|
if (!JS::GetPendingExceptionStack(cx, &exception)) {
|
|
fprintf(stderr, " failed to get pending exception value and stack\n");
|
|
} else {
|
|
fprintf(stderr, "\n exception value: ");
|
|
if (!dump_value(cx, exception.exception(), stderr)) {
|
|
fprintf(stderr, "<failed to dump value>");
|
|
}
|
|
fprintf(stderr, "\n exception stack:\n");
|
|
if (!dump_stack(cx, exception.stack(), stderr)) {
|
|
fprintf(stderr, "<failed to dump stack>\n");
|
|
}
|
|
}
|
|
} else {
|
|
fprintf(stderr, "\n");
|
|
}
|
|
|
|
// TODO: check for unhandled promise rejections.
|
|
|
|
fflush(stderr);
|
|
::abort();
|
|
}
|
|
|
|
} // namespace smw
|