From 069091eece084e7e27eb02a85fb3da14eb08beeb Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 23 Mar 2010 10:17:51 +0100 Subject: [PATCH] Rewind the memory pool only after parsing a toplevel expression statements. --- src/shared/cplusplus/Parser.cpp | 32 +++++++++++++++++++++++--------- src/shared/cplusplus/Parser.h | 3 ++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 39af8bc96bc..363eb5e8080 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -200,6 +200,7 @@ Parser::Parser(TranslationUnit *unit) _objCEnabled(false), _inFunctionBody(false), _inObjCImplementationContext(false), + _inExpressionStatement(false), _expressionDepth(0) { } @@ -2450,21 +2451,34 @@ bool Parser::parseExpressionStatement(StatementAST *&node) return true; } + const bool wasInExpressionStatement = _inExpressionStatement; + _inExpressionStatement = true; + + // switch to the temp pool + MemoryPool *previousPool = _pool; + _pool = &_expressionStatementTempPool; + + bool parsed = false; + ExpressionAST *expression = 0; - MemoryPool *oldPool = _pool; - _pool = &_tempPool; - RecursiveMemoryPool rec(&_tempPool); if (parseExpression(expression)) { - ExpressionStatementAST *ast = new (oldPool) ExpressionStatementAST; - ast->expression = expression->clone(oldPool); + ExpressionStatementAST *ast = new (previousPool) ExpressionStatementAST; + ast->expression = expression->clone(previousPool); match(T_SEMICOLON, &ast->semicolon_token); node = ast; - _pool = oldPool; - return true; + parsed = true; } - _pool = oldPool; - return false; + _inExpressionStatement = wasInExpressionStatement; + + if (! _inExpressionStatement) { + // rewind the memory pool after parsing a toplevel expression statement. + _expressionStatementTempPool.reset(); + } + + // restore the pool + _pool = previousPool; + return parsed; } bool Parser::parseStatement(StatementAST *&node) diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index d817d4566ec..18bc98f82b7 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -315,9 +315,10 @@ private: bool _objCEnabled: 1; bool _inFunctionBody: 1; bool _inObjCImplementationContext: 1; + bool _inExpressionStatement: 1; int _expressionDepth; - MemoryPool _tempPool; + MemoryPool _expressionStatementTempPool; std::map<unsigned, TemplateArgumentListEntry> _templateArgumentList; class Rewind; -- GitLab