libGimbal 0.1.0
C17-Based Extended Standard Library and Cross-Language Runtime Framework
Loading...
Searching...
No Matches
gimbal_ctx.h
Go to the documentation of this file.
1/*! \file
2 * \brief GblContext top-level debug and control-flow macros
3 * \ingroup core
4 *
5 * \deprecated Internal helper macros which will soon be removed.
6 *
7 * \author Falco Girgis
8 */
9#ifndef GIMBAL_CTX_H
10#define GIMBAL_CTX_H
11
12#include "../algorithms/gimbal_numeric.h"
13#include "../meta/ifaces/gimbal_ilogger.h"
14#include "gimbal_thd.h"
15#include <stdarg.h>
16#include <string.h>
17#include <errno.h>
18
20
21// ===== GBL API FRAME CONVENIENCE ACCESSORS =====
22
23#define GBL_CTX_FRAME_DECLARE GblStackFrame* GBL_CTX_FRAME_NAME
24#define GBL_CTX_FRAME() (GblThd_current()->pStackFrameTop)
25#define GBL_CTX_CONTEXT() GBL_CTX_FRAME()->pContext
26#define GBL_CTX_OBJECT() GBL_CTX_FRAME()->pObject
27#define GBL_CTX_RECORD() (GBL_CTX_FRAME_NAME)->record
28#define GBL_CTX_RESULT() (GBL_CTX_FRAME_NAME)->record.result
29#define GBL_CTX_SOURCE() (GBL_CTX_FRAME_NAME)->record.srcLocation
30#define GBL_CTX_LAST_RECORD() (GblThd_current()->callRecord)
31#define GBL_CTX_LAST_RESULT() (GBL_CTX_LAST_RECORD().result)
32
33// ====== SOURCE LOCATION PROPAGATION UTILITIES =====
34
35#define GBL_SRC_FILE __FILE__
36#define GBL_SRC_FN __func__
37#define GBL_SRC_LN __LINE__
38#define GBL_SRC_LOC GBL_SOURCE_LOCATION
39#define GblSrcLoc GblSourceLocation
40
41#define GBL_SOURCE_LOCATION(FILE, FUNCTION, LINE) GBL_STRUCT_INIT(GblSourceLocation, FILE, FUNCTION, LINE)
42
43#define GBL_CTX_STACK_FRAME_SOURCE_PUSH(pStackFrame, current)
44 if(++pStackFrame->sourceCurrentCaptureDepth == 1) GBL_CTX_SOURCE() = current;
45
46#define GBL_CTX_STACK_FRAME_SOURCE_POP(pStackFrame)
48 GBL_ASSERT(pStackFrame->sourceCurrentCaptureDepth);
49 --pStackFrame->sourceCurrentCaptureDepth;
51
52#define GBL_CTX_SOURCE_LOC_PUSH(srcLoc)
53 GBL_CTX_STACK_FRAME_SOURCE_PUSH(GBL_CTX_FRAME_NAME, srcLoc)
54
55#define GBL_CTX_SOURCE_PUSH(FILE, FUNCTION, LINE)
56 GBL_CTX_SOURCE_LOC_PUSH(GBL_SOURCE_LOCATION(FILE, FUNCTION, LINE))
57
58#define GBL_CTX_SOURCE_POP()
59 GBL_CTX_STACK_FRAME_SOURCE_POP(GBL_CTX_FRAME_NAME)
60
61#define GBL_CTX_SOURCE_SCOPED(CALL, loc, ...)
64 GBL_IDENTITY(CALL)(__VA_ARGS__);
67
68// ====== BOTTOM-LEVEL ERROR HANDLING + CONTROL FLOW =====
69
70#define GBL_CTX_RECORD_SET_JMP_CND_(expr, result, label, srcLoc, ...)
73 if GBL_UNLIKELY(!(expr)) {
74 GBL_CTX_RECORD_SET(result, __VA_ARGS__);
76 label;
77 } else {
79 }
81
82#define GBL_CTX_RECORD_SET_JMP_CND(expr, result, label, ...)
83 GBL_CTX_RECORD_SET_JMP_CND_(expr, result, goto label, GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), __VA_ARGS__);
84
85//====== VERIFY =========
86
87#define GBL_CTX_VERIFY_(expr, result, srcLoc, ...)
89 result,
90 goto GBL_CTX_END_LABEL,
91 srcLoc, __VA_ARGS__)
92
93#define GBL_CTX_VERIFY_N(srcLoc, expr, result, ...)
94 GBL_CTX_VERIFY_(expr, result, srcLoc, __VA_ARGS__)
95
96#define GBL_CTX_VERIFY_3(srcLoc, expr, result)
97 GBL_CTX_VERIFY_N(srcLoc, expr, result, gblResultString(result))
98
99#define GBL_CTX_VERIFY(...)
102 GBL_VA_OVERLOAD_SELECT(GBL_CTX_VERIFY, GBL_VA_OVERLOAD_SUFFIXER_3_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
104
105//====== VERIFY_EXPRESSION =========
106
107#define GBL_CTX_VERIFY_EXPRESSION_N(srcLoc, expr, ...)
108 GBL_CTX_VERIFY_(expr, GBL_RESULT_ERROR_INVALID_EXPRESSION, srcLoc, __VA_ARGS__)
109
110#define GBL_CTX_VERIFY_EXPRESSION_2(src, expr)
111 GBL_CTX_VERIFY_EXPRESSION_N(src, expr, "Invalid Expression: "#expr)
112
113#define GBL_CTX_VERIFY_EXPRESSION(...)
118
119//====== VERIFY_POINTER =========
120#define GBL_CTX_VERIFY_POINTER_N(srcLoc, expr, ...)
121 GBL_CTX_VERIFY_(expr, GBL_RESULT_ERROR_INVALID_POINTER, srcLoc, __VA_ARGS__)
122
123#define GBL_CTX_VERIFY_POINTER_2(src, expr)
124 GBL_CTX_VERIFY_POINTER_N(src, expr, "Invalid Pointer")
125
126#define GBL_CTX_VERIFY_POINTER(...)
129 GBL_VA_OVERLOAD_SELECT(GBL_CTX_VERIFY_POINTER, GBL_VA_OVERLOAD_SUFFIXER_2_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
131
132//====== VERIFY_ARG =========
133#define GBL_CTX_VERIFY_ARG_N(srcLoc, expr, ...)
134 GBL_CTX_VERIFY_(expr, GBL_RESULT_ERROR_INVALID_ARG, srcLoc, __VA_ARGS__)
135
136#define GBL_CTX_VERIFY_ARG_2(src, expr)
137 GBL_CTX_VERIFY_ARG_N(src, expr, "Invalid Arg: "#expr);
138
139#define GBL_CTX_VERIFY_ARG(...)
142 GBL_VA_OVERLOAD_SELECT(GBL_CTX_VERIFY_ARG, GBL_VA_OVERLOAD_SUFFIXER_2_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
144
145//===== VERIFY_TYPE =======
146#define GBL_CTX_VERIFY_TYPE_N(srcLoc, actualType, expectedType, ...)
147 GBL_CTX_VERIFY_(GblType_check(actualType, expectedType), GBL_RESULT_ERROR_TYPE_MISMATCH, srcLoc, __VA_ARGS__)
148
149#define GBL_CTX_VERIFY_TYPE_3(srcLoc, actualType, expectedType)
150 GBL_CTX_VERIFY_TYPE_N(srcLoc, actualType, expectedType, "Type mismatch [Actual: %s, Expected: %s]", GblType_name(actualType), GblType_name(expectedType))
151
152#define GBL_CTX_VERIFY_TYPE_2(srcLoc, actualType)
153 GBL_CTX_VERIFY_(actualType != GBL_INVALID_TYPE, GBL_RESULT_ERROR_INVALID_TYPE, srcLoc, "Invalid Type");
154
155#define GBL_CTX_VERIFY_TYPE(...)
158 GBL_VA_OVERLOAD_SELECT(GBL_CTX_VERIFY_TYPE, GBL_VA_OVERLOAD_SUFFIXER_3_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
160
161//==== LAST RECORD =====
162#define GBL_CTX_VERIFY_LAST_RECORD()
164 const GblCallRecord* pRecord =
165 GblThd_callRecord(NULL);
166 if(pRecord && GBL_RESULT_ERROR(pRecord->result)) {
167 GBL_CTX_RESULT() = pRecord->result;
168 GBL_CTX_DONE();
169 }
171
172#define GBL_CTX_CLEAR_LAST_RECORD()
173 GblThd_setCallRecord(NULL, NULL)
174
175//===== C STD ERRNO =====
176
177#ifdef GBL_CONFIG_ERRNO_CHECKS
178#define GBL_CTX_ERRNO_CLEAR() errno = 0
179#else
180#define GBL_CTX_ERRNO_CLEAR()
181#endif
182
183#ifdef GBL_CONFIG_ERRNO_CHECKS
184# define GBL_CTX_PERROR(...)
185 GBL_STMT_START {
186 if GBL_UNLIKELY(errno) {
187 const GBL_RESULT code =
188 GBL_ERRNO_RESULT(errno);
189 GBL_CTX_VERIFY(
190 GBL_RESULT_SUCCESS(code),
191 code,
192 "ERRNO: %s", strerror(errno));
193 }
194 } GBL_STMT_END
195#else
196# define GBL_CTX_PERROR(...)
197#endif
198
199GBL_MAYBE_UNUSED GBL_INLINE GBL_RESULT GBL_ERRNO_RESULT(int ernum) {
200 switch(ernum) {
201 case 0: return GBL_RESULT_SUCCESS;
202 default: return GBL_RESULT_ERROR;
203 }
204}
205
206// ======= API ======
207#define GBL_CTX_INLINE_RETVAL() GBL_CTX_INLINE_RETURN_VALUE_NAME
208
209#define GBL_CTX_INLINE(MethodPrefix, ReturnType, ...)
210 GBL_INLINE ReturnType GBL_CTX_INLINE_##MethodPrefix##_(GBL_CTX_FRAME_DECLARE, ##__VA_ARGS__) {
211 ReturnType GBL_CTX_INLINE_RETURN_VALUE_NAME;
212
213#define GBL_CTX_INLINE_BEGIN(InitialRetValue)
214 GBL_CTX_INLINE_RETVAL() = InitialRetValue;
215
216
217#define GBL_CTX_INLINE_END()
218 goto GBL_CTX_END_LABEL;
219 GBL_CTX_END_LABEL: GBL_STMT_START {;} GBL_STMT_END;
220 }
221
222#define GBL_CTX_INLINE_RETURN()
223 return GBL_CTX_INLINE_RETVAL()
224
225
226#define GBL_CTX_INLINE_CALL_(MethodPrefix, srcLoc, ...)
227 GBL_CTX_INLINE_##MethodPrefix##_(GBL_CTX_FRAME() GBL_VA_ARGS(__VA_ARGS__))
228
229#define GBL_CTX_INLINE_CALL(MethodPrefix, ...)
231
232// ============== GBL EXT USERMETHODS ==========
233
234#define GBL_CTX_EXT(prefix, ...)
236 const GBL_RESULT localResult = GblContext_##prefix(GBL_CTX_CONTEXT(),
237 GBL_CTX_FRAME_NAME,
238 ##__VA_ARGS__);
239 GBL_ASSERT(!(GBL_CONFIG_ASSERT_ERROR_ENABLED &&
240 GBL_RESULT_ERROR(localResult)),
241 "Ext["#prefix"]: ERROR");
242 GBL_ASSERT(!(GBL_CONFIG_ASSERT_PARTIAL_ENABLED &&
243 GBL_RESULT_PARTIAL(localResult)),
244 "Ext["#prefix"]: ERROR");
245 GBL_UNUSED(localResult);
247
248
249GBL_MAYBE_UNUSED GBL_CTX_INLINE(MALLOC, void*, size_t size, size_t align, const char* pDebugStr) {
251 if(align == 0) {
252 align = GBL_ALIGNOF(GBL_MAX_ALIGN_T);
253 size = gblAlignedAllocSizeDefault(size);
254 }
255 GBL_ASSERT(size % align == 0);
256 GBL_CTX_EXT(memAlloc_, size, align, pDebugStr, &GBL_CTX_INLINE_RETVAL());
258 // modify/set return value based on result
260}
261
262#define GBL_CTX_MALLOC_4(src, size, align, dbgStr)
263 GBL_CTX_INLINE_CALL_(MALLOC, src, size, align, dbgStr)
264
265#define GBL_CTX_MALLOC_3(src, size, align)
266 GBL_CTX_MALLOC_4(src, size, align, GBL_NULL)
267
268#define GBL_CTX_MALLOC_2(src, size)
269 GBL_CTX_MALLOC_3(src, gblAlignedAllocSizeDefault(size), GBL_ALIGNOF(GBL_MAX_ALIGN_T))
270
271#define GBL_CTX_MALLOC(...)
273
274#define GBL_CTX_NEW_4(src, type, count, dbgStr)
275 (type*)GBL_CTX_INLINE_CALL_(MALLOC, src, gblAlignedAllocSizeDefault(sizeof(type)*count), 0, dbgStr)
276
277#define GBL_CTX_NEW_3(src, type, count)
278 GBL_CTX_NEW_4(src, type, count, GBL_NULL)
279
280#define GBL_CTX_NEW_2(src, type)
281 GBL_CTX_NEW_3(src, type, 1)
282
283#define GBL_CTX_NEW(...)
285
286GBL_MAYBE_UNUSED GBL_CTX_INLINE(REALLOC, void*, void* pData, size_t newSize, size_t newAlign) {
288
289 GBL_CTX_EXT(memRealloc_, pData, newSize, newAlign, &GBL_CTX_INLINE_RETVAL());
291 // modify/set return value based on result
293}
294
295#define GBL_CTX_REALLOC_4(src, pData, newSize, newAlign)
296 GBL_CTX_INLINE_CALL_(REALLOC, src, pData, newSize, newAlign)
297
298#define GBL_CTX_REALLOC_3(src, pData, newSize)
299 GBL_CTX_REALLOC_4(src, pData, newSize, 1)
300
301#define GBL_CTX_REALLOC(...)
303
304#define GBL_CTX_RENEW_5(src, ptr, type, count, dbgStr)
305 GBL_CTX_INLINE_CALL(REALLOC, src, ptr, sizeof(type)*count, dbgStr)
306
307#define GBL_CTX_RENEW_4(src, ptr, type, count)
308 GBL_CTX_RENEW_5(src, ptr, type, count, GBL_NULL)
309
310#define GBL_CTX_RENEW_3(src, ptr, type)
311 GBL_CTX_RENEW_4(src, ptr, type, 1)
312
313#define GBL_CTX_RENEW(...)
315
316#define GBL_CTX_FREE(pData)
318
319#define GBL_CTX_PUSH_(srcLoc, ...)
322 GblThd_logPush(NULL);
323 GBL_CTX_EXT(logPush_);
325 ++GBL_CTX_FRAME()->stackDepth;
327
328#define GBL_CTX_PUSH()
331 GBL_CTX_PUSH_(src_);
333
334#define GBL_CTX_PUSH_VERBOSE_N(srcLoc, pFmt, ...)
336 GBL_CTX_SOURCE_SCOPED(GBL_CTX_VERBOSE, srcLoc, pFmt, ##__VA_ARGS__);
337 GBL_CTX_PUSH_(srcLoc);
339
340#define GBL_CTX_PUSH_VERBOSE(...)
343 GBL_VA_OVERLOAD_SELECT(GBL_CTX_PUSH_VERBOSE, GBL_VA_OVERLOAD_SUFFIXER_1_N, src_, ##__VA_ARGS__)(src_, ##__VA_ARGS__);
345
346#define GBL_CTX_POP_2(srcLoc, count)
347 GblThd_logPop(NULL, count);
348 GBL_CTX_SOURCE_SCOPED(GBL_CTX_EXT, srcLoc, logPop_, count);
349 GBL_CTX_FRAME()->stackDepth -= count;
350
351#define GBL_CTX_POP_1(srcLoc)
352 GBL_CTX_POP_2(srcLoc, 1)
353
354#define GBL_CTX_POP(...)
359
360GBL_MAYBE_UNUSED GBL_CTX_INLINE(LOG, GBL_RESULT, GblFlags level, const char* pFmt, ...) {
361 GBL_CTX_INLINE_BEGIN(GBL_RESULT_SUCCESS);
362 va_list varArgs;
363 va_start(varArgs, pFmt);
364
365 GBL_CTX_EXT(logWrite_, level, pFmt, varArgs);
366 va_end(varArgs);
369}
370
371#define GBL_CTX_LOG_(src, level, pFmt, ...)
372 GBL_CTX_INLINE_CALL_(LOG, src, level, pFmt, ##__VA_ARGS__)
373#define GBL_CTX_LOG(level, pFmt, ...)
374 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), level, pFmt, ##__VA_ARGS__)
375
376#define GBL_CTX_DEBUG(pFmt, ...)
377 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), GBL_LOG_LEVEL_DEBUG, pFmt, ##__VA_ARGS__)
378
379#define GBL_CTX_VERBOSE(pFmt, ...)
380 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), GBL_LOG_LEVEL_VERBOSE, pFmt, ##__VA_ARGS__)
381
382#define GBL_CTX_INFO(pFmt, ...)
383 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), GBL_LOG_LEVEL_INFO, pFmt, ##__VA_ARGS__)
384
385#define GBL_CTX_WARN(pFmt, ...)
386 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), GBL_LOG_LEVEL_WARNING, pFmt, ##__VA_ARGS__)
387
388#define GBL_CTX_ERROR(pFmt, ...)
389 GBL_CTX_LOG_(GBL_SRC_LOC(GBL_SRC_FILE, GBL_SRC_FN, GBL_SRC_LN), GBL_LOG_LEVEL_ERROR, pFmt, ##__VA_ARGS__)
390
391#define GBL_CTX_EVENT(event)
394 GBL_UNUSED(src_);
395 GblObject_sendEvent(GBL_CTX_OBJECT(), (GblEvent*)event);
397
398
399// ===================== RECORD = > ASSERT =========================
400
401// Base Enabled Logic
402#define GBL_CTX_RECORD_ASSERT_(record, test)
404 GBL_ASSERT(!test(record->result), record->message);
406
407// Base Conditional Logic
408#define GBL_CTX_RECORD_ASSERT_CONDITIONAL_(enabled, record, test)
410
411// Partial Success
412#define GBL_CTX_RECORD_ASSERT_PARTIAL(record)
413 GBL_CTX_RECORD_ASSERT_CONDITIONAL_(GBL_CONFIG_ASSERT_PARTIAL_ENABLED,
414 record, GBL_RESULT_PARTIAL)
415// Error
416#define GBL_CTX_RECORD_ASSERT_ERROR(record)
417 GBL_CTX_RECORD_ASSERT_CONDITIONAL_(GBL_CONFIG_ASSERT_ERROR_ENABLED,
418 record, GBL_RESULT_ERROR)
419
420// Unknown
421#define GBL_CTX_RECORD_ASSERT_UNKNOWN(record)
422 GBL_CTX_RECORD_ASSERT_CONDITIONAL_(GBL_CONFIG_ASSERT_UNKNOWN_ENABLED,
423 record, GBL_RESULT_UNKNOWN)
424// Both Together
425#define GBL_CTX_RECORD_ASSERT(record)
431
432
433// ========================== RECORD = > LOG ========================
434
435// Base Enabled Logic (uses a prefix prefix for all magic)
436#define GBL_CTX_RECORD_LOG_(prefix, record)
438 if GBL_UNLIKELY(GBL_RESULT_##prefix(record->result)) {
439 GBL_CTX_LOG(GBL_CONFIG_LOG_##prefix##_LEVEL,
440 "%s: %s",
441 gblResultString(record->result), record->message);
442 }
444
445
446// Base Conditional Logic
447#define GBL_CTX_RECORD_LOG_CONDITIONAL_(prefix, record)
448 GBL_MACRO_CONDITIONAL_CALL(GBL_CONFIG_LOG_##prefix##_ENABLED,
449 GBL_CTX_RECORD_LOG_, prefix, record)
450
451// Partial Success
452#define GBL_CTX_RECORD_LOG_PARTIAL(record)
453 GBL_CTX_RECORD_LOG_CONDITIONAL_(PARTIAL, record)
454
455// Error
456#define GBL_CTX_RECORD_LOG_ERROR(record)
458
459// Unknown
460#define GBL_CTX_RECORD_LOG_UNKNOWN(record)
461 GBL_CTX_RECORD_LOG_CONDITIONAL_(UNKNOWN, record)
462
463// Combined
464#define GBL_CTX_RECORD_LOG(record)
470
471
472// ================= RECORD => HANDLE::LAST_ERROR ==============
473#define GBL_CTX_RECORD_LAST_RECORD_(prefix, record)
475 if(GBL_RESULT_##prefix(record->result)) {
476 GblContext_callRecordSet_(GBL_CTX_CONTEXT(), GBL_CTX_FRAME_NAME, record);
477 GblThd_setCallRecord(NULL, record);
478 }
480
481#define GBL_CTX_RECORD_LAST_RECORD_PARTIAL(record)
482 GBL_CTX_RECORD_LAST_RECORD_(PARTIAL, record)
483
484#define GBL_CTX_RECORD_LAST_RECORD_ERROR(record)
485 GBL_CTX_RECORD_LAST_RECORD_(ERROR, record)
486
487#define GBL_CTX_RECORD_LAST_RECORD_UNKNOWN(record)
488 GBL_CTX_RECORD_LAST_RECORD_(UNKNOWN, record)
489
490#define GBL_CTX_RECORD_LAST_RECORD(record)
496
497// ================= RECORD => TOP-LEVEL DISPATCH ==============
498#define GBL_CTX_RECORD_HANDLER(record)
500 GBL_CTX_RECORD_LOG((record));
502 GBL_CTX_RECORD_ASSERT((record));
504
505#define GBL_CTX_RECORD_SET_N(file, func, line, result, ...)
508 GblCallRecord_construct(&GBL_CTX_RECORD(), result, GBL_CTX_SOURCE(), __VA_ARGS__);
512
513#define GBL_CTX_RECORD_SET_5(file, func, line, result, pFmt)
514 GBL_CTX_RECORD_SET_N(file, func, line, result, "%s", pFmt)
515
516#define GBL_CTX_RECORD_SET_4(file, func, line, result)
517 GBL_CTX_RECORD_SET_5(file, func, line, result, gblResultString(result))
518
519#define GBL_CTX_RECORD_SET(...)
521
522#define GBL_CTX_CALL_N(src, funcCall, ...)
525 GBL_MAYBE_UNUSED const GBL_RESULT localResult = (funcCall);
526 if GBL_UNLIKELY(!GBL_RESULT_SUCCESS(localResult)) {
527 GBL_CTX_RESULT() = localResult;
528 }
531
532#define GBL_CTX_CALL_2(src, funcCall)
533 GBL_CTX_CALL_N(src, funcCall, #funcCall);
534
535#define GBL_CTX_CALL(...)
538 GBL_VA_OVERLOAD_SELECT(GBL_CTX_CALL, GBL_VA_OVERLOAD_SUFFIXER_2_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
540
541#define GBL_CTX_VERIFY_CALL(...)
544 GBL_VA_OVERLOAD_SELECT(GBL_CTX_CALL, GBL_VA_OVERLOAD_SUFFIXER_2_N, src_, __VA_ARGS__)(src_, __VA_ARGS__);
545 if(!GBL_RESULT_SUCCESS(GBL_CTX_RESULT())) goto GBL_CTX_END_LABEL;
547
548
549// ================= TOP-LEVEL API UTILITIES ==============
550
551#define GBL_CTX_BEGIN_FRAME(file, func, line, pObject, frame)
552 GBL_CTX_FRAME_DECLARE = frame;
553 GblStackFrame_construct(GBL_CTX_FRAME_NAME, (GblObject*)pObject, GBL_RESULT_SUCCESS);
554 GblThd_stackFramePush(NULL, GBL_CTX_FRAME_NAME)
555
556#define GBL_CTX_BEGIN_LOG_4(file, func, line, hHandle)
557 GBL_CTX_BEGIN_FRAME(file, func, line, hHandle, ((GblStackFrame*)GBL_ALLOCA(sizeof(GblStackFrame))))
558
559#define GBL_CTX_BEGIN_LOG_N(file, func, line, hHandle, ...)
560 GBL_CTX_BEGIN_LOG_5(file, func, line, hHandle);
561 GBL_CTX_PUSH_VERBOSE(__VA_ARGS__);
562
563#define GBL_CTX_BEGIN(...)
565
566#define GBL_CTX_DONE()
567 goto GBL_CTX_END_LABEL
568
569#define GBL_CTX_END_BLOCK()
570 goto GBL_CTX_END_LABEL;
571 GBL_LABEL_EMPTY(GBL_CTX_END_LABEL);
572 if(GBL_CTX_FRAME_NAME->stackDepth)
573 GBL_CTX_POP(GBL_CTX_FRAME_NAME->stackDepth);
574 GblThd_stackFramePop(NULL)
575
576#define GBL_CTX_END()
578 return GBL_CTX_FRAME_NAME->record.result
579
580#define GBL_CTX_END_EMPTY()
581 GBL_LABEL_EMPTY(GBL_CTX_END_LABEL)
582
583#define GBL_CTX_BLOCK_6(file, func, line, hHandle, frame, block)
584 GBL_CTX_BEGIN_FRAME(file, func, line, hHandle, frame);
585 block;
587
588#define GBL_CTX_BLOCK_5(file, func, line, hHandle, block)
589 GBL_CTX_BLOCK_7(file, func, line, hHandle, ((GblStackFrame*)GBL_ALLOCA(sizeof(GblStackFrame))), block)
590
591#define GBL_CTX_BLOCK_4(file, func, line, block)
592 GBL_CTX_BLOCK_6(file, func, line, NULL, block)
593
594#define GBL_CTX_BLOCK(...)
596
598
599#endif // GIMBAL_API_H
#define GBL_MAX_ALIGN_T
#define GBL_STMT_START
#define GBL_NULL
#define GBL_UNLIKELY(exp)
#define GBL_MAYBE_UNUSED
#define GBL_STRUCT_INIT(type,...)
#define GBL_ALLOCA
#define GBL_INLINE
#define GBL_STMT_END
#define GBL_CTX_RECORD_LAST_RECORD_(prefix, record)
Definition gimbal_ctx.h:473
#define GBL_CTX_NEW(...)
Definition gimbal_ctx.h:283
#define GBL_CTX_INLINE_RETURN()
Definition gimbal_ctx.h:222
#define GBL_CTX_SOURCE()
Definition gimbal_ctx.h:29
#define GBL_CTX_RECORD_LOG_CONDITIONAL_(prefix, record)
Definition gimbal_ctx.h:447
#define GBL_SRC_FN
Definition gimbal_ctx.h:36
#define GBL_CTX_BLOCK_6(file, func, line, hHandle, frame, block)
Definition gimbal_ctx.h:583
#define GBL_CTX_INLINE_CALL(MethodPrefix,...)
Definition gimbal_ctx.h:229
#define GBL_CTX_VERIFY_ARG(...)
Definition gimbal_ctx.h:139
#define GBL_CTX_VERIFY_POINTER(...)
Definition gimbal_ctx.h:126
#define GBL_CTX_RENEW_4(src, ptr, type, count)
Definition gimbal_ctx.h:307
#define GBL_CTX_VERIFY_(expr, result, srcLoc,...)
Definition gimbal_ctx.h:87
#define GBL_CTX_RECORD_ASSERT_PARTIAL(record)
Definition gimbal_ctx.h:412
#define GBL_CTX_RECORD_SET_JMP_CND_(expr, result, label, srcLoc,...)
Definition gimbal_ctx.h:70
#define GBL_SRC_LOC
Definition gimbal_ctx.h:38
#define GBL_CTX_VERIFY_POINTER_N(srcLoc, expr,...)
Definition gimbal_ctx.h:120
#define GBL_CTX_RESULT()
Definition gimbal_ctx.h:28
#define GBL_CTX_POP(...)
Definition gimbal_ctx.h:354
#define GBL_CTX_SOURCE_LOC_PUSH(srcLoc)
Definition gimbal_ctx.h:52
#define GBL_CTX_END_BLOCK()
Definition gimbal_ctx.h:569
#define GBL_CTX_SOURCE_POP()
Definition gimbal_ctx.h:58
#define GBL_CTX_LAST_RECORD()
Definition gimbal_ctx.h:30
#define GBL_CTX_BEGIN_FRAME(file, func, line, pObject, frame)
Definition gimbal_ctx.h:551
#define GBL_CTX_PUSH_VERBOSE(...)
Definition gimbal_ctx.h:340
#define GBL_CTX_RECORD_ASSERT_UNKNOWN(record)
Definition gimbal_ctx.h:421
#define GBL_CTX_SOURCE_SCOPED(CALL, loc,...)
Definition gimbal_ctx.h:61
#define GBL_CTX_RECORD_LOG_(prefix, record)
Definition gimbal_ctx.h:436
#define GBL_CTX_STACK_FRAME_SOURCE_PUSH(pStackFrame, current)
Definition gimbal_ctx.h:43
#define GBL_CTX_CALL(...)
Definition gimbal_ctx.h:535
#define GBL_CTX_RECORD_ASSERT(record)
Definition gimbal_ctx.h:425
#define GBL_CTX_RECORD_SET_N(file, func, line, result,...)
Definition gimbal_ctx.h:505
#define GBL_CTX_FRAME_DECLARE
Definition gimbal_ctx.h:23
#define GBL_CTX_INLINE(MethodPrefix, ReturnType,...)
Definition gimbal_ctx.h:209
#define GBL_CTX_RECORD_LOG(record)
Definition gimbal_ctx.h:464
#define GBL_CTX_RECORD_ASSERT_(record, test)
Definition gimbal_ctx.h:402
#define GBL_CTX_RECORD_LAST_RECORD_UNKNOWN(record)
Definition gimbal_ctx.h:487
#define GBL_CTX_FRAME()
Definition gimbal_ctx.h:24
#define GBL_CTX_RECORD_LAST_RECORD_ERROR(record)
Definition gimbal_ctx.h:484
#define GBL_CTX_VERIFY_TYPE(...)
Definition gimbal_ctx.h:155
#define GBL_CTX_POP_2(srcLoc, count)
Definition gimbal_ctx.h:346
#define GBL_CTX_VERBOSE(pFmt,...)
Definition gimbal_ctx.h:379
#define GBL_CTX_VERIFY_ARG_N(srcLoc, expr,...)
Definition gimbal_ctx.h:133
#define GBL_CTX_VERIFY_N(srcLoc, expr, result,...)
Definition gimbal_ctx.h:93
#define GBL_SOURCE_LOCATION(FILE, FUNCTION, LINE)
Definition gimbal_ctx.h:41
#define GBL_CTX_EXT(prefix,...)
Definition gimbal_ctx.h:234
#define GBL_CTX_VERIFY_TYPE_N(srcLoc, actualType, expectedType,...)
Definition gimbal_ctx.h:146
#define GBL_CTX_INLINE_END()
Definition gimbal_ctx.h:217
#define GBL_CTX_RECORD_LAST_RECORD_PARTIAL(record)
Definition gimbal_ctx.h:481
#define GBL_CTX_RECORD_LAST_RECORD(record)
Definition gimbal_ctx.h:490
#define GBL_CTX_STACK_FRAME_SOURCE_POP(pStackFrame)
Definition gimbal_ctx.h:46
#define GBL_CTX_REALLOC_4(src, pData, newSize, newAlign)
Definition gimbal_ctx.h:295
#define GBL_CTX_NEW_4(src, type, count, dbgStr)
Definition gimbal_ctx.h:274
#define GBL_CTX_BLOCK(...)
Definition gimbal_ctx.h:594
#define GBL_CTX_RECORD_HANDLER(record)
Definition gimbal_ctx.h:498
#define GBL_CTX_RECORD_LOG_PARTIAL(record)
Definition gimbal_ctx.h:452
#define GBL_CTX_RECORD()
Definition gimbal_ctx.h:27
#define GBL_CTX_PUSH_(srcLoc,...)
Definition gimbal_ctx.h:319
#define GBL_CTX_RECORD_SET(...)
Definition gimbal_ctx.h:519
#define GBL_CTX_CALL_N(src, funcCall,...)
Definition gimbal_ctx.h:522
#define GBL_CTX_INLINE_BEGIN(InitialRetValue)
Definition gimbal_ctx.h:213
#define GBL_CTX_RECORD_ASSERT_ERROR(record)
Definition gimbal_ctx.h:416
#define GBL_CTX_DONE()
Definition gimbal_ctx.h:566
#define GBL_CTX_VERIFY_EXPRESSION(...)
Definition gimbal_ctx.h:113
#define GBL_CTX_RECORD_LOG_ERROR(record)
Definition gimbal_ctx.h:456
#define GBL_CTX_MALLOC_3(src, size, align)
Definition gimbal_ctx.h:265
#define GBL_CTX_INLINE_CALL_(MethodPrefix, srcLoc,...)
Definition gimbal_ctx.h:226
#define GBL_CTX_LOG_(src, level, pFmt,...)
Definition gimbal_ctx.h:371
#define GBL_CTX_MALLOC_4(src, size, align, dbgStr)
Definition gimbal_ctx.h:262
#define GBL_SRC_LN
Definition gimbal_ctx.h:37
#define GBL_CTX_VERIFY(...)
Definition gimbal_ctx.h:99
#define GBL_CTX_NEW_3(src, type, count)
Definition gimbal_ctx.h:277
#define GBL_CTX_MALLOC(...)
Definition gimbal_ctx.h:271
#define GBL_CTX_REALLOC(...)
Definition gimbal_ctx.h:301
#define GBL_SRC_FILE
Definition gimbal_ctx.h:35
#define GBL_CTX_VERIFY_EXPRESSION_N(srcLoc, expr,...)
Definition gimbal_ctx.h:107
#define GBL_CTX_RENEW_5(src, ptr, type, count, dbgStr)
Definition gimbal_ctx.h:304
#define GBL_CTX_LOG(level, pFmt,...)
Definition gimbal_ctx.h:373
#define GBL_CTX_CONTEXT()
Definition gimbal_ctx.h:25
#define GblSrcLoc
Definition gimbal_ctx.h:39
#define GBL_CTX_INLINE_RETVAL()
Definition gimbal_ctx.h:207
#define GBL_CTX_RECORD_ASSERT_CONDITIONAL_(enabled, record, test)
Definition gimbal_ctx.h:408
#define GBL_CTX_RECORD_SET_5(file, func, line, result, pFmt)
Definition gimbal_ctx.h:513
#define GBL_CTX_RECORD_LOG_UNKNOWN(record)
Definition gimbal_ctx.h:460
#define GBL_CTX_OBJECT()
Definition gimbal_ctx.h:26
#define GBL_DECLS_BEGIN
#define GBL_UNUSED(...)
#define GBL_VA_OVERLOAD_CALL(BASE, SUFFIXER,...)
#define GBL_IDENTITY(A)
#define GBL_VA_OVERLOAD_SELECT(BASE, SUFFIXER,...)
#define GBL_VA_OVERLOAD_SUFFIXER_5_N(...)
#define GBL_MACRO_CONDITIONAL_CALL(enabled,...)
#define GBL_VA_OVERLOAD_SUFFIXER_3_N(...)
#define GBL_VA_OVERLOAD_SUFFIXER_4_N(...)
#define GBL_VA_OVERLOAD_SUFFIXER_1_N(...)
#define GBL_VA_OVERLOAD_SUFFIXER_2_N(...)
#define GBL_VA_OVERLOAD_SUFFIXER_ARGC(...)
#define GBL_VA_ARGS(...)
#define GBL_ASSERT(...)
#define GBL_LABEL_EMPTY(name)
#define GBL_RESULT_PARTIAL(value)
#define GBL_RESULT_ERROR(value)
#define GBL_RESULT_SUCCESS(value)
#define GBL_RESULT_UNKNOWN(value)
#define GBL_INVALID_TYPE
GblType UUID of the invalid type.
Definition gimbal_type.h:31
uint32_t GblFlags
Standard-sized flags type, 32-bits across platforms.