зеркало из https://github.com/microsoft/clang.git
Make parser scope cache be a member of the parser instead of a global,
which makes it multithread clean. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39863 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
25c9648909
Коммит
9e344c65b1
|
@ -20,7 +20,7 @@ Parser::Parser(Preprocessor &pp, Action &actions)
|
|||
: PP(pp), Actions(actions), Diags(PP.getDiagnostics()) {
|
||||
Tok.setKind(tok::eof);
|
||||
CurScope = 0;
|
||||
|
||||
NumCachedScopes = 0;
|
||||
ParenCount = BracketCount = BraceCount = 0;
|
||||
}
|
||||
|
||||
|
@ -172,15 +172,10 @@ bool Parser::SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
|
|||
// Scope manipulation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ScopeCache - Cache scopes to avoid malloc traffic.
|
||||
/// FIXME: eliminate this static ctor
|
||||
static llvm::SmallVector<Scope*, 16> ScopeCache;
|
||||
|
||||
/// EnterScope - Start a new scope.
|
||||
void Parser::EnterScope(unsigned ScopeFlags) {
|
||||
if (!ScopeCache.empty()) {
|
||||
Scope *N = ScopeCache.back();
|
||||
ScopeCache.pop_back();
|
||||
if (NumCachedScopes) {
|
||||
Scope *N = ScopeCache[--NumCachedScopes];
|
||||
N->Init(CurScope, ScopeFlags);
|
||||
CurScope = N;
|
||||
} else {
|
||||
|
@ -195,13 +190,13 @@ void Parser::ExitScope() {
|
|||
// Inform the actions module that this scope is going away.
|
||||
Actions.PopScope(Tok.getLocation(), CurScope);
|
||||
|
||||
Scope *Old = CurScope;
|
||||
CurScope = Old->getParent();
|
||||
Scope *OldScope = CurScope;
|
||||
CurScope = OldScope->getParent();
|
||||
|
||||
if (ScopeCache.size() == 16)
|
||||
delete Old;
|
||||
if (NumCachedScopes == ScopeCacheSize)
|
||||
delete OldScope;
|
||||
else
|
||||
ScopeCache.push_back(Old);
|
||||
ScopeCache[NumCachedScopes++] = OldScope;
|
||||
}
|
||||
|
||||
|
||||
|
@ -216,10 +211,8 @@ Parser::~Parser() {
|
|||
delete CurScope;
|
||||
|
||||
// Free the scope cache.
|
||||
while (!ScopeCache.empty()) {
|
||||
delete ScopeCache.back();
|
||||
ScopeCache.pop_back();
|
||||
}
|
||||
for (unsigned i = 0, e = NumCachedScopes; i != e; ++i)
|
||||
delete ScopeCache[i];
|
||||
}
|
||||
|
||||
/// Initialize - Warm up the parser.
|
||||
|
|
|
@ -43,6 +43,11 @@ class Parser {
|
|||
|
||||
Scope *CurScope;
|
||||
Diagnostic &Diags;
|
||||
|
||||
/// ScopeCache - Cache scopes to reduce malloc traffic.
|
||||
enum { ScopeCacheSize = 16 };
|
||||
unsigned NumCachedScopes;
|
||||
Scope *ScopeCache[ScopeCacheSize];
|
||||
public:
|
||||
Parser(Preprocessor &PP, Action &Actions);
|
||||
~Parser();
|
||||
|
|
Загрузка…
Ссылка в новой задаче