Skip to content

Commit 77c733c

Browse files
authored
Merge pull request #70216 from rintaro/astgen-allocatetransform
[ASTBridging] Avoid temporary SmallVector for 'InheritedEntry' list
2 parents f0594a4 + 06ba93f commit 77c733c

File tree

2 files changed

+35
-26
lines changed

2 files changed

+35
-26
lines changed

include/swift/AST/ASTContext.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,18 @@ class ASTContext final {
521521
setVector.size());
522522
}
523523

524+
template <typename Output, typename Range>
525+
ArrayRef<Output> AllocateTransform(
526+
Range &&input,
527+
llvm::function_ref<Output(typename Range::const_reference)> transform,
528+
AllocationArena arena = AllocationArena::Permanent) {
529+
auto size = std::distance(std::cbegin(input), std::cend(input));
530+
auto storage = AllocateUninitialized<Output>(size, arena);
531+
for (auto i : indices(input))
532+
new (storage.data() + i) Output(transform(input[i]));
533+
return storage;
534+
}
535+
524536
/// Set a new stats reporter.
525537
void setStatsReporter(UnifiedStatsReporter *stats);
526538

lib/AST/ASTBridging.cpp

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -573,14 +573,11 @@ void BridgedExtensionDecl_setParsedMembers(BridgedExtensionDecl bridgedDecl,
573573
setParsedMembers(bridgedDecl.unbridged(), bridgedMembers);
574574
}
575575

576-
static SmallVector<InheritedEntry>
577-
convertToInheritedEntries(BridgedArrayRef cInheritedTypes) {
578-
SmallVector<InheritedEntry> inheritedEntries;
579-
for (auto &repr : cInheritedTypes.unbridged<BridgedTypeRepr>()) {
580-
inheritedEntries.emplace_back(repr.unbridged());
581-
}
582-
583-
return inheritedEntries;
576+
static ArrayRef<InheritedEntry>
577+
convertToInheritedEntries(ASTContext &ctx, BridgedArrayRef cInheritedTypes) {
578+
return ctx.AllocateTransform<InheritedEntry>(
579+
cInheritedTypes.unbridged<BridgedTypeRepr>(),
580+
[](auto &e) { return InheritedEntry(e.unbridged()); });
584581
}
585582

586583
BridgedNominalTypeDecl BridgedEnumDecl_createParsed(
@@ -594,7 +591,7 @@ BridgedNominalTypeDecl BridgedEnumDecl_createParsed(
594591

595592
NominalTypeDecl *decl = new (context) EnumDecl(
596593
cEnumKeywordLoc.unbridged(), cName.unbridged(), cNameLoc.unbridged(),
597-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)),
594+
convertToInheritedEntries(context, cInheritedTypes),
598595
genericParamList.unbridged(), cDeclContext.unbridged());
599596
decl->setTrailingWhereClause(genericWhereClause.unbridged());
600597
decl->setBraces(cBraceRange.unbridged());
@@ -646,7 +643,7 @@ BridgedNominalTypeDecl BridgedStructDecl_createParsed(
646643

647644
NominalTypeDecl *decl = new (context) StructDecl(
648645
cStructKeywordLoc.unbridged(), cName.unbridged(), cNameLoc.unbridged(),
649-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)),
646+
convertToInheritedEntries(context, cInheritedTypes),
650647
genericParamList.unbridged(), cDeclContext.unbridged());
651648
decl->setTrailingWhereClause(genericWhereClause.unbridged());
652649
decl->setBraces(cBraceRange.unbridged());
@@ -665,7 +662,7 @@ BridgedNominalTypeDecl BridgedClassDecl_createParsed(
665662

666663
NominalTypeDecl *decl = new (context) ClassDecl(
667664
cClassKeywordLoc.unbridged(), cName.unbridged(), cNameLoc.unbridged(),
668-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)),
665+
convertToInheritedEntries(context, cInheritedTypes),
669666
genericParamList.unbridged(), cDeclContext.unbridged(), isActor);
670667
decl->setTrailingWhereClause(genericWhereClause.unbridged());
671668
decl->setBraces(cBraceRange.unbridged());
@@ -680,19 +677,20 @@ BridgedNominalTypeDecl BridgedProtocolDecl_createParsed(
680677
BridgedArrayRef cInheritedTypes,
681678
BridgedNullableTrailingWhereClause genericWhereClause,
682679
BridgedSourceRange cBraceRange) {
683-
SmallVector<PrimaryAssociatedTypeName, 2> primaryAssociatedTypeNames;
684-
for (auto &pair :
685-
cPrimaryAssociatedTypeNames.unbridged<BridgedIdentifierAndSourceLoc>()) {
686-
primaryAssociatedTypeNames.emplace_back(pair.Name.unbridged(),
687-
pair.NameLoc.unbridged());
688-
}
689-
690680
ASTContext &context = cContext.unbridged();
681+
682+
auto primaryAssociatedTypeNames =
683+
context.AllocateTransform<PrimaryAssociatedTypeName>(
684+
cPrimaryAssociatedTypeNames
685+
.unbridged<BridgedIdentifierAndSourceLoc>(),
686+
[](auto &e) -> PrimaryAssociatedTypeName {
687+
return {e.Name.unbridged(), e.NameLoc.unbridged()};
688+
});
689+
691690
NominalTypeDecl *decl = new (context) ProtocolDecl(
692691
cDeclContext.unbridged(), cProtocolKeywordLoc.unbridged(),
693-
cNameLoc.unbridged(), cName.unbridged(),
694-
context.AllocateCopy(primaryAssociatedTypeNames),
695-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)),
692+
cNameLoc.unbridged(), cName.unbridged(), primaryAssociatedTypeNames,
693+
convertToInheritedEntries(context, cInheritedTypes),
696694
genericWhereClause.unbridged());
697695
decl->setBraces(cBraceRange.unbridged());
698696

@@ -711,8 +709,7 @@ BridgedAssociatedTypeDecl BridgedAssociatedTypeDecl_createParsed(
711709
context, cDeclContext.unbridged(), cAssociatedtypeKeywordLoc.unbridged(),
712710
cName.unbridged(), cNameLoc.unbridged(), defaultType.unbridged(),
713711
genericWhereClause.unbridged());
714-
decl->setInherited(
715-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)));
712+
decl->setInherited(convertToInheritedEntries(context, cInheritedTypes));
716713

717714
return decl;
718715
}
@@ -727,7 +724,7 @@ BridgedExtensionDecl BridgedExtensionDecl_createParsed(
727724

728725
auto *decl = ExtensionDecl::create(
729726
context, cExtensionKeywordLoc.unbridged(), extendedType.unbridged(),
730-
context.AllocateCopy(convertToInheritedEntries(cInheritedTypes)),
727+
convertToInheritedEntries(context, cInheritedTypes),
731728
cDeclContext.unbridged(), genericWhereClause.unbridged());
732729
decl->setBraces(cBraceRange.unbridged());
733730
return decl;
@@ -1133,8 +1130,8 @@ BridgedBraceStmt BridgedBraceStmt_createParsed(BridgedASTContext cContext,
11331130
}
11341131

11351132
ASTContext &context = cContext.unbridged();
1136-
return BraceStmt::create(context, cLBLoc.unbridged(),
1137-
context.AllocateCopy(nodes), cRBLoc.unbridged());
1133+
return BraceStmt::create(context, cLBLoc.unbridged(), nodes,
1134+
cRBLoc.unbridged());
11381135
}
11391136

11401137
BridgedIfStmt BridgedIfStmt_createParsed(BridgedASTContext cContext,

0 commit comments

Comments
 (0)