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