Skip to content

Commit 3c174a9

Browse files
committed
Sema: Simpler and faster handleSILGenericParams()
If we're given multiple parameter lists, we don't have to build a generic signature and environment for each one. Instead, we can just use a single GenericSignatureBuilder and add all of them in one shot. On my iMac Pro, this speeds up the parse_stdlib test from 169 seconds to 133.
1 parent bc4aa75 commit 3c174a9

File tree

1 file changed

+6
-11
lines changed

1 file changed

+6
-11
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,8 @@ static void setBoundVarsTypeError(Pattern *pattern, ASTContext &ctx) {
634634
GenericEnvironment *
635635
TypeChecker::handleSILGenericParams(GenericParamList *genericParams,
636636
DeclContext *DC) {
637+
if (genericParams == nullptr)
638+
return nullptr;
637639

638640
SmallVector<GenericParamList *, 2> nestedList;
639641
for (; genericParams; genericParams = genericParams->getOuterParameters()) {
@@ -642,22 +644,15 @@ TypeChecker::handleSILGenericParams(GenericParamList *genericParams,
642644

643645
std::reverse(nestedList.begin(), nestedList.end());
644646

645-
// Since the innermost GenericParamList is in the beginning of the vector,
646-
// we process in reverse order to handle the outermost list first.
647-
GenericSignature *parentSig = nullptr;
648-
GenericEnvironment *parentEnv = nullptr;
649-
650647
for (unsigned i = 0, e = nestedList.size(); i < e; ++i) {
651648
auto genericParams = nestedList[i];
652649
genericParams->setDepth(i);
653-
654-
parentEnv = checkGenericEnvironment(genericParams, DC, parentSig,
655-
/*allowConcreteGenericParams=*/true,
656-
/*ext=*/nullptr);
657-
parentSig = parentEnv->getGenericSignature();
658650
}
659651

660-
return parentEnv;
652+
return checkGenericEnvironment(nestedList.back(), DC,
653+
/*parentSig=*/nullptr,
654+
/*allowConcreteGenericParams=*/true,
655+
/*ext=*/nullptr);
661656
}
662657

663658
/// Build a default initializer for the given type.

0 commit comments

Comments
 (0)