Add PRESERVE_NONE
This commit is contained in:
28
src/test.cpp
28
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();
|
||||
|
||||
Reference in New Issue
Block a user