Skip to content

Commit 7491af9

Browse files
author
David Ungar
committed
Optimize PatternEntryDeclScope currency check by assuming entries do not get added
1 parent 7e0d96c commit 7491af9

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

lib/AST/ASTScopeCreation.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,20 +1802,29 @@ bool TopLevelCodeScope::isCurrent() const {
18021802
return bodyWhenLastExpanded == decl->getBody();
18031803
}
18041804

1805+
// Try to avoid the work of counting
1806+
static const bool assumeVarsDoNotGetAdded = true;
1807+
1808+
static unsigned countVars(const PatternBindingEntry &entry) {
1809+
unsigned varCount = 0;
1810+
entry.getPattern()->forEachVariable([&](VarDecl *) { ++varCount; });
1811+
return varCount;
1812+
}
1813+
18051814
void PatternEntryDeclScope::beCurrent() {
18061815
initWhenLastExpanded = getPatternEntry().getOriginalInit();
1807-
unsigned varCount = 0;
1808-
getPatternEntry().getPattern()->forEachVariable(
1809-
[&](VarDecl *) { ++varCount; });
1810-
varCountWhenLastExpanded = varCount;
1816+
if (assumeVarsDoNotGetAdded && varCountWhenLastExpanded)
1817+
return;
1818+
varCountWhenLastExpanded = countVars(getPatternEntry());
18111819
}
18121820
bool PatternEntryDeclScope::isCurrent() const {
18131821
if (initWhenLastExpanded != getPatternEntry().getOriginalInit())
18141822
return false;
1815-
unsigned varCount = 0;
1816-
getPatternEntry().getPattern()->forEachVariable(
1817-
[&](VarDecl *) { ++varCount; });
1818-
return varCount == varCountWhenLastExpanded;
1823+
if (assumeVarsDoNotGetAdded && varCountWhenLastExpanded) {
1824+
assert(varCountWhenLastExpanded == countVars(getPatternEntry()));
1825+
return true;
1826+
}
1827+
return countVars(getPatternEntry()) == varCountWhenLastExpanded;
18191828
}
18201829

18211830
void WholeClosureScope::beCurrent() {

0 commit comments

Comments
 (0)