summaryrefslogtreecommitdiffstats
path: root/source/core/slang-signal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/slang-signal.cpp')
-rw-r--r--source/core/slang-signal.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/source/core/slang-signal.cpp b/source/core/slang-signal.cpp
new file mode 100644
index 000000000..9641fe5f7
--- /dev/null
+++ b/source/core/slang-signal.cpp
@@ -0,0 +1,69 @@
+#include "slang-signal.h"
+
+#include "slang-exception.h"
+
+#include "stdio.h"
+
+namespace Slang
+{
+
+static const char* _getSignalTypeAsText(SignalType type)
+{
+ switch (type)
+ {
+ case SignalType::AssertFailure: return "assert failure";
+ case SignalType::Unimplemented: return "unimplemented";
+ case SignalType::Unreachable: return "hit unreachable code";
+ case SignalType::Unexpected: return "unexpected";
+ case SignalType::InvalidOperation: return "invalid operation";
+ case SignalType::AbortCompilation: return "abort compilation";
+ default: return "unhandled";
+ }
+}
+
+String _getMessage(SignalType type, char const* message)
+{
+ StringBuilder buf;
+ const char* const typeText = _getSignalTypeAsText(type);
+ buf << typeText;
+ if (message)
+ {
+ buf << ": " << message;
+ }
+
+ return buf.ProduceString();
+}
+
+// One point of having as a single function is a choke point both for handling (allowing different
+// handling scenarios) as well as a choke point to set a breakpoint to catch 'signal' types
+SLANG_RETURN_NEVER void handleSignal(SignalType type, char const* message)
+{
+ StringBuilder buf;
+ const char*const typeText = _getSignalTypeAsText(type);
+ buf << typeText << ": " << message;
+
+ // Can be useful to enable during debug when problem is on CI
+ if (false)
+ {
+ printf("%s\n", _getMessage(type, message).getBuffer());
+ }
+
+#if SLANG_HAS_EXCEPTIONS
+ switch (type)
+ {
+ case SignalType::InvalidOperation: throw InvalidOperationException(_getMessage(type, message));
+ case SignalType::AbortCompilation: throw AbortCompilationException();
+ default: throw InternalError(_getMessage(type, message));
+ }
+#else
+ // Attempt to drop out into the debugger. If a debugger isn't attached this will likely crash - which is probably the best
+ // we can do.
+
+ SLANG_BREAKPOINT(0);
+
+ // 'panic'. Exit with an error code as we can't throw or catch.
+ exit(-1);
+#endif
+}
+
+}