From 069091eece084e7e27eb02a85fb3da14eb08beeb Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 23 Mar 2010 10:17:51 +0100 Subject: Rewind the memory pool only after parsing a toplevel expression statements. --- src/shared/cplusplus/Parser.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'src/shared/cplusplus/Parser.cpp') diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 39af8bc96b..363eb5e808 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) -- cgit v1.2.1