#ifndef __JITTERBUG_TRY_H #define __JITTERBUG_TRY_H #include "config.h" #include "util.h" #ifdef JB_ENABLE_TRY_TRACE #define __TRY_TRACE() do { \ printf("trace: %s:%d\n", __FILE__, __LINE__); \ } while(0); #else #define __TRY_TRACE() #endif // JB_ENABLE_TRY_TRACE // NOTE: The macro(s) below make use of a GCC extension called "Statement Exprs", which is nonstandard. // More info: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html #define TRYPTR_NIL(M_expr) __extension__({ void* _result = (void*)(M_expr); if (unlikely(!_result)) { __TRY_TRACE() return (NULL); } _result; }) #define TRYPTR(M_expr) __extension__({ void* _result = (void*)(M_expr); if (unlikely(!_result)) { __TRY_TRACE() return (-1); } _result; }) #define TRYST_NIL(M_expr) __extension__({ int _result = (int)(M_expr); if (unlikely(_result < 0)) { __TRY_TRACE() return (NULL); } _result; }) #define TRYST(M_expr) __extension__({ int _result = (int)(M_expr); if (unlikely(_result < 0)) { __TRY_TRACE() return (-1); } _result; }) #endif // __JITTERBUG_TRY_H