Cherry pick changes from wip-scritchui which should be mainline.
[SquirrelJME.git] / nanocoat / src / except.c
blob2498691db50086a665efd00442dd0a3af6746d43
1 /* -*- Mode: C; indent-tabs-mode: t; tab-width: 4 -*-
2 // ---------------------------------------------------------------------------
3 // SquirrelJME
4 // Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
5 // ---------------------------------------------------------------------------
6 // SquirrelJME is under the Mozilla Public License Version 2.0.
7 // See license.mkd for licensing and copyright information.
8 // -------------------------------------------------------------------------*/
10 #include "sjme/except.h"
11 #include "sjme/debug.h"
13 void sjme_genericMessage(sjme_lpcstr file, int line,
14 sjme_lpcstr func, sjme_lpcstr prefix, sjme_lpcstr format, va_list args);
16 sjme_errorCode sjme_except_printStackTraceR(SJME_DEBUG_DECL_FILE_LINE_FUNC,
17 sjme_errorCode errorCode, volatile sjme_exceptTrace* exceptTrace)
19 volatile sjme_exceptTrace* seeker;
21 /* Add notice, similar to Java. */
22 sjme_messageR(NULL, -1, NULL, SJME_JNI_TRUE,
23 "EXCEPTION native: Error %d",
24 errorCode);
26 /* Go down the stack. */
27 seeker = exceptTrace;
28 while (seeker != NULL)
30 /* Print indicators. */
31 if (seeker->file != NULL)
33 if (seeker->line >= 0)
34 sjme_messageR(NULL, -1, NULL, SJME_JNI_TRUE,
35 " | IN %s() (%s:%d)",
36 seeker->func,
37 sjme_debug_shortenFile(seeker->file),
38 seeker->line);
39 else
40 sjme_messageR(NULL, -1, NULL, SJME_JNI_TRUE,
41 " | IN %s() (%s)",
42 seeker->func,
43 sjme_debug_shortenFile(seeker->file));
45 else
47 if (seeker->line >= 0)
48 sjme_messageR(NULL, -1, NULL, SJME_JNI_TRUE,
49 " | IN %s(:%d)",
50 seeker->func,
51 seeker->line);
52 else
53 sjme_messageR(NULL, -1, NULL, SJME_JNI_TRUE,
54 " | IN %s()",
55 seeker->func);
58 /* Go up one. */
59 seeker = seeker->parent;
62 /* Always works. */
63 return SJME_ERROR_NONE;
66 sjme_errorCode sjme_except_gracefulDeathR(SJME_DEBUG_DECL_FILE_LINE_FUNC,
67 sjme_attrInNotNull sjme_nvm_frame* frame,
68 sjme_attrInRange(SJME_NUM_ERROR_CODES, SJME_ERROR_NONE)
69 sjme_errorCode errorCode,
70 sjme_attrInNotNull sjme_attrFormatArg sjme_lpcstr message, ...)
72 #if defined(SJME_CONFIG_DEBUG)
73 va_list args;
75 /* Emit debug message. */
76 va_start(args, message);
77 sjme_messageV(file, line, func, SJME_JNI_FALSE, message, args);
78 va_end(args);
80 /* If debugging and not release version, mark to-do to fix issue. */
81 sjme_todoR(file, line, func, "Fix bug! Because %d %08x!",
82 (int)errorCode, (int)errorCode);
83 #else
84 sjme_todo("Implement graceful exit for release??");
85 #endif