From c999f10039290cb5e7162ad4ae7366b4ef3fac4f Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 12 Dec 2018 19:35:18 -0800 Subject: [PATCH] Use _Noreturn for lovrThrow; Generates smaller and prettier assembly. --- src/util.c | 1 + src/util.h | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/util.c b/src/util.c index 88306a86..62e5aa6c 100644 --- a/src/util.c +++ b/src/util.c @@ -16,6 +16,7 @@ void lovrThrow(const char* format, ...) { va_start(args, format); lovrErrorCallback(lovrErrorUserdata, format, args); va_end(args); + exit(EXIT_FAILURE); } else { va_list args; va_start(args, format); diff --git a/src/util.h b/src/util.h index c0b9bc6b..ddf4f36e 100644 --- a/src/util.h +++ b/src/util.h @@ -1,10 +1,25 @@ -#include "lib/tinycthread/tinycthread.h" #include #include #include #pragma once +#ifndef _Thread_local +# ifdef _WIN32 +# define _Thread_local __declspec(thread) +# else +# define _Thread_local __thread +# endif +#endif + +#ifndef _Noreturn +# ifdef _WIN32 +# define _Noreturn __declspec(noreturn) +# else +# define _Noreturn __attribute__((noreturn)) +# endif +#endif + #define CHECK_SIZEOF(T) int(*_o)[sizeof(T)]=1 #define lovrAssert(c, ...) if (!(c)) { lovrThrow(__VA_ARGS__); } @@ -28,7 +43,7 @@ extern _Thread_local lovrErrorHandler lovrErrorCallback; extern _Thread_local void* lovrErrorUserdata; void lovrSetErrorCallback(lovrErrorHandler callback, void* context); -void lovrThrow(const char* format, ...); +void _Noreturn lovrThrow(const char* format, ...); void* _lovrAlloc(const char* type, size_t size, void (*destructor)(void*)); void lovrRetain(void* object); void lovrRelease(void* object);