From 98bde3dda7277b8f8832281efa119d94698c0b44 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 21 Oct 2009 17:00:20 +0200 Subject: Removed unused member _pool in LiteralTable. --- src/shared/cplusplus/LiteralTable.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/LiteralTable.h b/src/shared/cplusplus/LiteralTable.h index 29de643002..52816a5682 100644 --- a/src/shared/cplusplus/LiteralTable.h +++ b/src/shared/cplusplus/LiteralTable.h @@ -175,8 +175,6 @@ protected: } protected: - MemoryPool *_pool; - _Literal **_literals; int _allocatedLiterals; int _literalCount; -- cgit v1.2.1 From 245a2ca2b3704b557dffafa44d63d76870db5e54 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 21 Oct 2009 17:01:40 +0200 Subject: Initialize the members of List --- src/shared/cplusplus/AST.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 05a78b0832..6dced425a7 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -64,6 +64,7 @@ class List: public Managed public: List() + : value(_Tp()), next(0) { } _Tp value; -- cgit v1.2.1 From afcbb78999b16b70a3e647cb6ffcc93a92f491a0 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 21 Oct 2009 17:03:18 +0200 Subject: Initialize _isInterface of ObjCClass --- src/shared/cplusplus/Symbols.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index aa15735410..8ddaf3ef5d 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -589,6 +589,7 @@ void ObjCBaseProtocol::visitSymbol0(SymbolVisitor *visitor) ObjCClass::ObjCClass(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name): ScopedSymbol(translationUnit, sourceLocation, name), + _isInterface(false), _categoryName(0), _baseClass(0) { -- cgit v1.2.1 From 2a7fa04101bf487f4fd6dd04297573f62157d41a Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 22 Oct 2009 16:46:26 +0200 Subject: Released the memory allocated in the memory pool when backtracking from Parser::parseTemplateId(). --- src/shared/cplusplus/MemoryPool.cpp | 13 +++++++++++++ src/shared/cplusplus/MemoryPool.h | 16 ++++++++++++++++ src/shared/cplusplus/Parser.cpp | 32 ++++++++++++++++++++++++++++++++ src/shared/cplusplus/Parser.h | 3 +++ 4 files changed, 64 insertions(+) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/MemoryPool.cpp b/src/shared/cplusplus/MemoryPool.cpp index 2002a65435..1453c62cd6 100644 --- a/src/shared/cplusplus/MemoryPool.cpp +++ b/src/shared/cplusplus/MemoryPool.cpp @@ -110,6 +110,19 @@ void *MemoryPool::allocate_helper(size_t size) return addr; } +MemoryPool::State MemoryPool::state() const +{ return State(ptr, _blockCount); } + +void MemoryPool::rewind(const State &state) +{ + if (_blockCount == state.blockCount && state.ptr < ptr) { + if (_initializeAllocatedMemory) + memset(state.ptr, '\0', ptr - state.ptr); + + ptr = state.ptr; + } +} + Managed::Managed() { } diff --git a/src/shared/cplusplus/MemoryPool.h b/src/shared/cplusplus/MemoryPool.h index e0f1ff8701..5b6fae925f 100644 --- a/src/shared/cplusplus/MemoryPool.h +++ b/src/shared/cplusplus/MemoryPool.h @@ -79,6 +79,22 @@ public: return allocate_helper(size); } + struct State + { + char *ptr; + char *end; + int blockCount; + + inline bool isValid() const + { return ptr != 0; } + + inline State(char *ptr = 0, int blockCount = 0) + : ptr(ptr), blockCount(blockCount) {} + }; + + State state() const; + void rewind(const State &state); + private: void *allocate_helper(size_t size); diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 8f3bd549ce..24851c991d 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -88,6 +88,30 @@ int DebugRule::depth = 0; # define DEBUG_THIS_RULE() do {} while (0) #endif +class Parser::Rewind +{ + Parser *_parser; + MemoryPool::State _state; + +public: + inline Rewind(Parser *parser) + : _parser(parser) {} + + inline void operator()(unsigned tokenIndex) + { rewind(tokenIndex); } + + inline void mark() + { _state = _parser->_pool->state(); } + + inline void rewind(unsigned tokenIndex) + { + _parser->rewind(tokenIndex); + + if (_state.isValid()) + _parser->_pool->rewind(_state); + } +}; + Parser::Parser(TranslationUnit *unit) : _translationUnit(unit), _control(_translationUnit->control()), @@ -302,6 +326,11 @@ bool Parser::parseClassOrNamespaceName(NameAST *&node) bool Parser::parseTemplateId(NameAST *&node) { DEBUG_THIS_RULE(); + + const unsigned start = cursor(); + Rewind rewind(this); + rewind.mark(); + if (LA() == T_IDENTIFIER && LA(2) == T_LESS) { TemplateIdAST *ast = new (_pool) TemplateIdAST; ast->identifier_token = consumeToken(); @@ -315,6 +344,9 @@ bool Parser::parseTemplateId(NameAST *&node) } } } + + rewind(start); + return false; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 3ca3371d81..2a7c15dfa3 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -298,6 +298,9 @@ private: bool _inFunctionBody: 1; bool _inObjCImplementationContext: 1; + class Rewind; + friend class Rewind; + private: Parser(const Parser& source); void operator =(const Parser& source); -- cgit v1.2.1 From 07c2451abd28dd2598f0570622b4324288cbaccc Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 23 Oct 2009 11:21:36 +0200 Subject: Use memoization to reduce the backtracking when parsing template arguments. --- src/shared/cplusplus/Parser.cpp | 25 +++++++++++++++++++++++-- src/shared/cplusplus/Parser.h | 14 +++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 24851c991d..67e260230c 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -328,8 +328,6 @@ bool Parser::parseTemplateId(NameAST *&node) DEBUG_THIS_RULE(); const unsigned start = cursor(); - Rewind rewind(this); - rewind.mark(); if (LA() == T_IDENTIFIER && LA(2) == T_LESS) { TemplateIdAST *ast = new (_pool) TemplateIdAST; @@ -692,8 +690,26 @@ bool Parser::parseOperatorFunctionId(NameAST *&node) return true; } +Parser::TemplateArgumentListEntry *Parser::templateArgumentListEntry(unsigned tokenIndex) +{ + for (unsigned i = 0; i < _templateArgumentList.size(); ++i) { + TemplateArgumentListEntry *entry = &_templateArgumentList[i]; + if (entry->index == tokenIndex) + return entry; + } + + return 0; +} + bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node) { + if (TemplateArgumentListEntry *entry = templateArgumentListEntry(cursor())) { + rewind(entry->cursor); + return entry->ast; + } + + unsigned start = cursor(); + DEBUG_THIS_RULE(); TemplateArgumentListAST **template_argument_ptr = &node; ExpressionAST *template_argument = 0; @@ -711,8 +727,13 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node) template_argument_ptr = &(*template_argument_ptr)->next; } } + + _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), node)); return true; } + + _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), 0)); + return false; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 2a7c15dfa3..d9ccf6ab49 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -54,7 +54,6 @@ #include "Token.h" #include "TranslationUnit.h" - namespace CPlusPlus { class CPLUSPLUS_EXPORT Parser @@ -287,6 +286,17 @@ private: inline void rewind(unsigned cursor) { _tokenIndex = cursor; } + struct TemplateArgumentListEntry { + unsigned index; + unsigned cursor; + TemplateArgumentListAST *ast; + + TemplateArgumentListEntry(unsigned index = 0, unsigned cursor = 0, TemplateArgumentListAST *ast = 0) + : index(index), cursor(cursor), ast(ast) {} + }; + + TemplateArgumentListEntry *templateArgumentListEntry(unsigned tokenIndex); + private: TranslationUnit *_translationUnit; Control *_control; @@ -298,6 +308,8 @@ private: bool _inFunctionBody: 1; bool _inObjCImplementationContext: 1; + Array _templateArgumentList; + class Rewind; friend class Rewind; -- cgit v1.2.1 From 935642b1bcb68f5bb3edd22a28f4bbbdf23f3347 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 23 Oct 2009 14:31:55 +0200 Subject: Return the cached AST node. --- src/shared/cplusplus/Parser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 67e260230c..4fffd4818d 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -705,7 +705,8 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node) { if (TemplateArgumentListEntry *entry = templateArgumentListEntry(cursor())) { rewind(entry->cursor); - return entry->ast; + node = entry->ast; + return entry->ast != 0; } unsigned start = cursor(); -- cgit v1.2.1 From f4047ac8bf3d9d6f8fab4110412532e724fe9422 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 26 Oct 2009 10:19:44 +0100 Subject: Fixed use of uninitialized/unallocated object. --- src/shared/cplusplus/Parser.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 4fffd4818d..835b2c11c8 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -4595,6 +4595,7 @@ bool Parser::parseObjCMethodDefinitionList(DeclarationListAST *&node) last->next = new (_pool) ObjCSynthesizedPropertyListAST; last = last->next; + last->synthesized_property = new (_pool) ObjCSynthesizedPropertyAST; match(T_IDENTIFIER, &(last->synthesized_property->property_identifier)); if (LA() == T_EQUAL) { -- cgit v1.2.1