From 6b5eb508d121ab40d3c54841f18b4a4cbb0bb68d Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 13 May 2025 10:59:48 -0400 Subject: [PATCH] Move all pops to top of table functions --- src/test.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index b230401..ace8298 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -522,21 +522,26 @@ private: assert(self->currentToken == T_EOF); return true; } - MUSTTAIL return table[*(self->stackPtr - 1)][self->currentToken](self); + auto top = *(self->stackPtr - 1); + MUSTTAIL return table[top][self->currentToken](self); } - PRESERVE_NONE static bool reject(Parser2 *) { return false; } + PRESERVE_NONE static bool reject(Parser2 *self) { + self->pop(); + return false; + } PRESERVE_NONE static bool object(Parser2 *self) { + self->pop(); assert(self->currentToken == T_LBRACE); self->callbacks->on_begin_object(self->data); self->nextToken(); - self->pop(); if (!self->push({T_STRING, T_COLON, N_VALUE, N_OBJECT_MAYBE_CONTINUE})) { return false; } MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool atom(Parser2 *self) { + self->pop(); if (*self->bufBefore == 't') { self->callbacks->on_true_literal(self->data); } else if (*self->bufBefore == 'f') { @@ -550,55 +555,54 @@ private: self->callbacks->on_end_number(self->data); } self->nextToken(); - self->pop(); MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool string(Parser2 *self) { + self->pop(); assert(self->currentToken == T_STRING); self->nextToken(); - self->pop(); MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool array(Parser2 *self) { + self->pop(); assert(self->currentToken == T_LBRACKET); self->callbacks->on_begin_array(self->data); self->nextToken(); - self->pop(); if (!self->push({N_VALUE, N_ARRAY_MAYBE_CONTINUE})) { return false; } MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool continueArray(Parser2 *self) { + self->pop(); assert(self->currentToken == T_COMMA); self->nextToken(); - self->pop(); if (!self->push({N_VALUE, N_ARRAY_MAYBE_CONTINUE})) { return false; } MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool continueObject(Parser2 *self) { + self->pop(); assert(self->currentToken == T_COMMA); self->nextToken(); - self->pop(); if (!self->push({T_STRING, T_COLON, N_VALUE, N_OBJECT_MAYBE_CONTINUE})) { return false; } MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool finishArray(Parser2 *self) { + self->pop(); assert(self->currentToken == T_RBRACKET); self->callbacks->on_end_array(self->data); self->nextToken(); - self->pop(); MUSTTAIL return keepGoing(self); } PRESERVE_NONE static bool finishObject(Parser2 *self) { + self->pop(); assert(self->currentToken == T_RBRACE); self->callbacks->on_end_object(self->data); self->nextToken(); - self->pop(); MUSTTAIL return keepGoing(self); }