From 9b19f4ffa15fb58c860fbc5a67e3d0cee4f86d87 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Wed, 1 Apr 2015 00:00:57 +0200 Subject: Add tokenStack depth guard to Handler class --- src/core/parser/stack/Handler.cpp | 17 ++++++++++++++--- src/core/parser/stack/Handler.hpp | 5 +++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/core/parser/stack/Handler.cpp b/src/core/parser/stack/Handler.cpp index 0a6e67c..1399fef 100644 --- a/src/core/parser/stack/Handler.cpp +++ b/src/core/parser/stack/Handler.cpp @@ -16,6 +16,8 @@ along with this program. If not, see . */ +#include + #include #include #include @@ -41,11 +43,15 @@ HandlerData::HandlerData(ParserContext &ctx, HandlerCallbacks &callbacks, /* Class Handler */ Handler::Handler(const HandlerData &handlerData) - : handlerData(handlerData), internalLogger(nullptr) + : handlerData(handlerData), internalLogger(nullptr), tokenStackDepth(0) { } -Handler::~Handler() {} +Handler::~Handler() { + while (tokenStackDepth > 0) { + popTokens(); + } +} ParserContext &Handler::context() { return handlerData.ctx; } @@ -80,10 +86,15 @@ Variant Handler::readData() { return handlerData.callbacks.readData(); } void Handler::pushTokens(const std::vector &tokens) { + tokenStackDepth++; handlerData.callbacks.pushTokens(tokens); } -void Handler::popTokens() { handlerData.callbacks.popTokens(); } +void Handler::popTokens() { + assert(tokenStackDepth > 0 && "popTokens called too often"); + tokenStackDepth--; + handlerData.callbacks.popTokens(); +} TokenId Handler::registerToken(const std::string &token) { diff --git a/src/core/parser/stack/Handler.hpp b/src/core/parser/stack/Handler.hpp index d85848a..17c91d8 100644 --- a/src/core/parser/stack/Handler.hpp +++ b/src/core/parser/stack/Handler.hpp @@ -128,6 +128,11 @@ private: */ Logger *internalLogger; + /** + * Current size of the internal "token" stack. + */ + size_t tokenStackDepth; + protected: /** * Constructor of the Handler class. -- cgit v1.2.3