diff options
| author | Tim Foley <tim.foley.is@gmail.com> | 2017-07-19 18:52:38 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-19 18:52:38 -0700 |
| commit | f07c01ceb012b9b325a8ecebd12cdd5797d8d5b3 (patch) | |
| tree | 0b93a109d51e6565560ad785519a863386490e2a /source/core | |
| parent | a2b8b4c20632d79721052abd232fe2d1bdf2700d (diff) | |
| parent | 3f48e1c0d84bf4909954154ad147559656e87516 (diff) | |
Merge pull request #128 from tfoleyNV/improve-failure-modes
Try to improve handling of failures during compilation
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/common.h | 29 | ||||
| -rw-r--r-- | source/core/exception.h | 16 | ||||
| -rw-r--r-- | source/core/slang-string.cpp | 8 | ||||
| -rw-r--r-- | source/core/slang-string.h | 4 | ||||
| -rw-r--r-- | source/core/smart-pointer.h | 5 |
5 files changed, 53 insertions, 9 deletions
diff --git a/source/core/common.h b/source/core/common.h index 25e85dc66..f0f6902d1 100644 --- a/source/core/common.h +++ b/source/core/common.h @@ -34,6 +34,35 @@ namespace Slang v0 = _Move(v1); v1 = _Move(tmp); } + +#ifdef _MSC_VER +#define SLANG_RETURN_NEVER __declspec(noreturn) +#else +#efine SLANG_RETURN_NEVER /* empty */ +#endif + + SLANG_RETURN_NEVER void signalUnexpectedError(char const* message); } +#define SLANG_UNEXPECTED(reason) \ + Slang::signalUnexpectedError("unexpected: " reason) + +#define SLANG_UNIMPLEMENTED_X(what) \ + Slang::signalUnexpectedError("unimplemented: " what) + +#define SLANG_UNREACHABLE(msg) \ + Slang::signalUnexpectedError("unreachable code executed: " msg) + +#ifdef _DEBUG +#define SLANG_EXPECT(VALUE, MSG) if(VALUE) {} else Slang::signalUnexpectedError("assertion failed: '" MSG "'") +#define SLANG_ASSERT(VALUE) SLANG_EXPECT(VALUE, #VALUE) +#else +#define SLANG_EXPECT(VALUE, MSG) do {} while(0) +#define SLANG_ASSERT(VALUE) do {} while(0) +#endif + +#define SLANG_RELEASE_ASSERT(VALUE) if(VALUE) {} else Slang::signalUnexpectedError("assertion failed") +#define SLANG_RELEASE_EXPECT(VALUE, WHAT) if(VALUE) {} else SLANG_UNEXPECTED(WHAT) + + #endif diff --git a/source/core/exception.h b/source/core/exception.h index dc674de7f..aedb62add 100644 --- a/source/core/exception.h +++ b/source/core/exception.h @@ -111,12 +111,16 @@ namespace Slang } }; - #define SLANG_UNEXPECTED(reason) \ - throw Slang::Exception("unexpected: " reason) - - #define SLANG_UNIMPLEMENTED_X(what) \ - throw Slang::NotImplementedException("unimplemented: " what) - + class InternalError : public Exception + { + public: + InternalError() + {} + InternalError(const String & message) + : Exception(message) + { + } + }; } #endif
\ No newline at end of file diff --git a/source/core/slang-string.cpp b/source/core/slang-string.cpp index 8938db595..459396f69 100644 --- a/source/core/slang-string.cpp +++ b/source/core/slang-string.cpp @@ -3,6 +3,14 @@ namespace Slang { + // TODO: this belongs in a different file: + + SLANG_RETURN_NEVER void signalUnexpectedError(char const* message) + { + throw InternalError(message); + } + + // OSString OSString::OSString() diff --git a/source/core/slang-string.h b/source/core/slang-string.h index 3c1b48e8c..552afe833 100644 --- a/source/core/slang-string.h +++ b/source/core/slang-string.h @@ -1,8 +1,10 @@ #ifndef FUNDAMENTAL_LIB_STRING_H #define FUNDAMENTAL_LIB_STRING_H + #include <string.h> #include <cstdlib> #include <stdio.h> + #include "smart-pointer.h" #include "common.h" #include "hash.h" @@ -80,7 +82,7 @@ namespace Slang static StringRepresentation* createWithCapacityAndLength(UInt capacity, UInt length) { - assert(capacity >= length); + SLANG_ASSERT(capacity >= length); void* allocation = operator new(sizeof(StringRepresentation) + capacity + 1); StringRepresentation* obj = new(allocation) StringRepresentation(); obj->capacity = capacity; diff --git a/source/core/smart-pointer.h b/source/core/smart-pointer.h index fea149e06..87cb40d70 100644 --- a/source/core/smart-pointer.h +++ b/source/core/smart-pointer.h @@ -1,6 +1,7 @@ #ifndef FUNDAMENTAL_LIB_SMART_POINTER_H #define FUNDAMENTAL_LIB_SMART_POINTER_H +#include "common.h" #include "type-traits.h" #include <assert.h> @@ -36,7 +37,7 @@ namespace Slang void releaseReference() { - assert(referenceCount != 0); + SLANG_ASSERT(referenceCount != 0); if(--referenceCount == 0) { delete this; @@ -45,7 +46,7 @@ namespace Slang bool isUniquelyReferenced() { - assert(referenceCount != 0); + SLANG_ASSERT(referenceCount != 0); return referenceCount == 1; } }; |
