From 1197117258e720aab8d599f8ea9f26ba00f95dd3 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Mon, 12 May 2025 23:15:46 -0400 Subject: [PATCH] Add PRESERVE_NONE --- src/test.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index d00a7c3..ab16594 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -415,6 +415,12 @@ private: #define MUSTTAIL #endif +#if __has_attribute(preserve_none) +#define PRESERVE_NONE __attribute__((preserve_none)) +#else +#define PRESERVE_NONE +#endif + struct Parser2 { Parser2(char *buf, int len, const Callbacks *callbacks, void *data) : buf(buf), len(len), callbacks(callbacks), data(data) {} @@ -489,7 +495,7 @@ private: return true; } - typedef bool (*continuation)(Parser2 *); + typedef PRESERVE_NONE bool (*continuation)(Parser2 *); void printStack() { printf("token: %s\n", symbolNames[currentToken]); @@ -499,7 +505,7 @@ private: printf("\n"); } - static bool keepGoing(Parser2 *self) { + PRESERVE_NONE static bool keepGoing(Parser2 *self) { // self->printStack(); if (self->stack.empty()) { assert(self->currentToken == T_EOF); @@ -518,8 +524,8 @@ private: self); } - static bool reject(Parser2 *) { return false; } - static bool object(Parser2 *self) { + PRESERVE_NONE static bool reject(Parser2 *) { return false; } + PRESERVE_NONE static bool object(Parser2 *self) { assert(self->currentToken == T_LBRACE); self->callbacks->on_begin_object(self->data); self->nextToken(); @@ -530,7 +536,7 @@ private: self->stack.push_back(T_STRING); MUSTTAIL return keepGoing(self); } - static bool atom(Parser2 *self) { + PRESERVE_NONE static bool atom(Parser2 *self) { if (*self->bufBefore == 't') { self->callbacks->on_true_literal(self->data); } else if (*self->bufBefore == 'f') { @@ -547,13 +553,13 @@ private: self->stack.pop_back(); MUSTTAIL return keepGoing(self); } - static bool string(Parser2 *self) { + PRESERVE_NONE static bool string(Parser2 *self) { assert(self->currentToken == T_STRING); self->nextToken(); self->stack.pop_back(); MUSTTAIL return keepGoing(self); } - static bool array(Parser2 *self) { + PRESERVE_NONE static bool array(Parser2 *self) { assert(self->currentToken == T_LBRACKET); self->callbacks->on_begin_array(self->data); self->nextToken(); @@ -562,7 +568,7 @@ private: self->stack.push_back(N_VALUE); MUSTTAIL return keepGoing(self); } - static bool continueArray(Parser2 *self) { + PRESERVE_NONE static bool continueArray(Parser2 *self) { assert(self->currentToken == T_COMMA); self->nextToken(); self->stack.pop_back(); @@ -570,7 +576,7 @@ private: self->stack.push_back(N_VALUE); MUSTTAIL return keepGoing(self); } - static bool continueObject(Parser2 *self) { + PRESERVE_NONE static bool continueObject(Parser2 *self) { assert(self->currentToken == T_COMMA); self->nextToken(); self->stack.pop_back(); @@ -580,14 +586,14 @@ private: self->stack.push_back(T_STRING); MUSTTAIL return keepGoing(self); } - static bool finishArray(Parser2 *self) { + PRESERVE_NONE static bool finishArray(Parser2 *self) { assert(self->currentToken == T_RBRACKET); self->callbacks->on_end_array(self->data); self->nextToken(); self->stack.pop_back(); MUSTTAIL return keepGoing(self); } - static bool finishObject(Parser2 *self) { + PRESERVE_NONE static bool finishObject(Parser2 *self) { assert(self->currentToken == T_RBRACE); self->callbacks->on_end_object(self->data); self->nextToken();