summaryrefslogtreecommitdiffstats
path: root/source/slang/diagnostics.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-12 13:26:53 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-12 13:26:53 -0700
commit0174470593881b5fe6c22594c9df875ab95a6735 (patch)
tree3bc9146ef6375c2f5055aa0db995e7a403afe931 /source/slang/diagnostics.cpp
parent11f12cd3a1d53f988d4c9726ac4301f35dc7f01f (diff)
Properly register error on downstream compiler failure
- The old code was just doing `exit(1)` if glslang or `D3DCompile` failed, which is obviously unacceptable - The new approach adds the output to the diagnostic buffer (or invokes the callback), and tracks the error count just like any other errors
Diffstat (limited to 'source/slang/diagnostics.cpp')
-rw-r--r--source/slang/diagnostics.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/source/slang/diagnostics.cpp b/source/slang/diagnostics.cpp
index 0c55a94bd..870e6d172 100644
--- a/source/slang/diagnostics.cpp
+++ b/source/slang/diagnostics.cpp
@@ -194,6 +194,36 @@ void DiagnosticSink::diagnoseImpl(CodePosition const& pos, DiagnosticInfo const&
}
}
+void DiagnosticSink::diagnoseRaw(
+ Severity severity,
+ char const* message)
+{
+ if (severity >= Severity::Error)
+ {
+ errorCount++;
+ }
+
+ // Did the client supply a callback for us to use?
+ if( callback )
+ {
+ // If so, pass the error string along to them
+ callback(message, callbackUserData);
+ }
+ else
+ {
+ // If the user doesn't have a callback, then just
+ // collect our diagnostic messages into a buffer
+ outputBuffer.append(message);
+ }
+
+ if (severity >= Severity::Fatal)
+ {
+ // TODO: figure out a better policy for aborting compilation
+ throw InvalidOperationException();
+ }
+}
+
+
namespace Diagnostics
{
#define DIAGNOSTIC(id, severity, name, messageFormat) const DiagnosticInfo name = { id, Severity::severity, messageFormat };