@@ -873,39 +873,41 @@ SILIsolationInfo SILIsolationInfo::get(SILArgument *arg) {
873
873
return SILIsolationInfo::getTaskIsolated (fArg );
874
874
}
875
875
876
- void SILIsolationInfo::print (llvm::raw_ostream &os) const {
877
- auto printOptions = [&] {
878
- auto opts = getOptions ();
879
- if (!opts)
880
- return ;
876
+ void SILIsolationInfo::printOptions (llvm::raw_ostream &os) const {
877
+ auto opts = getOptions ();
878
+ if (!opts)
879
+ return ;
881
880
882
- os << " : " ;
881
+ os << " : " ;
883
882
884
- std::array<std::pair<Flag, StringLiteral>, 2 > data = {
885
- std::make_pair (Flag::UnsafeNonIsolated,
886
- StringLiteral (" nonisolated(unsafe)" )),
887
- std::make_pair (Flag::UnappliedIsolatedAnyParameter,
888
- StringLiteral (" unapplied_isolated_parameter" )),
889
- };
883
+ llvm::SmallVector<StringLiteral, unsigned (Flag::MaxNumBits)> data;
890
884
891
- llvm::interleave (
892
- data, os,
893
- [&](const std::pair<Flag, StringLiteral> &value) {
894
- opts -= value.first ;
895
- os << value.second ;
896
- },
897
- " , " );
885
+ if (opts.contains (Flag::UnsafeNonIsolated)) {
886
+ data.push_back (StringLiteral (" nonisolated(unsafe)" ));
887
+ opts -= Flag::UnsafeNonIsolated;
888
+ }
898
889
899
- assert (!opts && " Unhandled flag?!" );
900
- };
890
+ if (opts.contains (Flag::UnappliedIsolatedAnyParameter)) {
891
+ data.push_back (StringLiteral (" unapplied_isolated_any_parameter" ));
892
+ opts -= Flag::UnappliedIsolatedAnyParameter;
893
+ }
901
894
895
+ assert (!opts && " Unhandled flag?!" );
896
+ assert (data.size () < unsigned (Flag::MaxNumBits) &&
897
+ " Please update MaxNumBits so that we can avoid heap allocations in "
898
+ " this SmallVector" );
899
+
900
+ llvm::interleave (data, os, " , " );
901
+ }
902
+
903
+ void SILIsolationInfo::print (llvm::raw_ostream &os) const {
902
904
switch (Kind (*this )) {
903
905
case Unknown:
904
906
os << " unknown" ;
905
907
return ;
906
908
case Disconnected:
907
909
os << " disconnected" ;
908
- printOptions ();
910
+ printOptions (os );
909
911
return ;
910
912
case Actor:
911
913
if (ActorInstance instance = getActorInstance ()) {
@@ -914,7 +916,7 @@ void SILIsolationInfo::print(llvm::raw_ostream &os) const {
914
916
SILValue value = instance.getValue ();
915
917
if (auto name = VariableNameInferrer::inferName (value)) {
916
918
os << " '" << *name << " '-isolated" ;
917
- printOptions ();
919
+ printOptions (os );
918
920
os << " \n " ;
919
921
os << " instance: " << *value;
920
922
@@ -924,7 +926,7 @@ void SILIsolationInfo::print(llvm::raw_ostream &os) const {
924
926
}
925
927
case ActorInstance::Kind::ActorAccessorInit:
926
928
os << " 'self'-isolated" ;
927
- printOptions ();
929
+ printOptions (os );
928
930
os << ' \n ' ;
929
931
os << " instance: actor accessor init\n " ;
930
932
return ;
@@ -934,17 +936,17 @@ void SILIsolationInfo::print(llvm::raw_ostream &os) const {
934
936
if (getActorIsolation ().getKind () == ActorIsolation::ActorInstance) {
935
937
if (auto *vd = getActorIsolation ().getActorInstance ()) {
936
938
os << " '" << vd->getBaseIdentifier () << " '-isolated" ;
937
- printOptions ();
939
+ printOptions (os );
938
940
return ;
939
941
}
940
942
}
941
943
942
944
getActorIsolation ().printForDiagnostics (os);
943
- printOptions ();
945
+ printOptions (os );
944
946
return ;
945
947
case Task:
946
948
os << " task-isolated" ;
947
- printOptions ();
949
+ printOptions (os );
948
950
os << ' \n ' ;
949
951
os << " instance: " << *getIsolatedValue ();
950
952
return ;
@@ -1071,9 +1073,7 @@ void SILIsolationInfo::printForOneLineLogging(llvm::raw_ostream &os) const {
1071
1073
return ;
1072
1074
case Disconnected:
1073
1075
os << " disconnected" ;
1074
- if (getOptions ().contains (Flag::UnsafeNonIsolated)) {
1075
- os << " : nonisolated(unsafe)" ;
1076
- }
1076
+ printOptions (os);
1077
1077
return ;
1078
1078
case Actor:
1079
1079
if (auto instance = getActorInstance ()) {
@@ -1082,27 +1082,32 @@ void SILIsolationInfo::printForOneLineLogging(llvm::raw_ostream &os) const {
1082
1082
SILValue value = instance.getValue ();
1083
1083
if (auto name = VariableNameInferrer::inferName (value)) {
1084
1084
os << " '" << *name << " '-isolated" ;
1085
+ printOptions (os);
1085
1086
return ;
1086
1087
}
1087
1088
break ;
1088
1089
}
1089
1090
case ActorInstance::Kind::ActorAccessorInit:
1090
1091
os << " 'self'-isolated" ;
1092
+ printOptions (os);
1091
1093
return ;
1092
1094
}
1093
1095
}
1094
1096
1095
1097
if (getActorIsolation ().getKind () == ActorIsolation::ActorInstance) {
1096
1098
if (auto *vd = getActorIsolation ().getActorInstance ()) {
1097
1099
os << " '" << vd->getBaseIdentifier () << " '-isolated" ;
1100
+ printOptions (os);
1098
1101
return ;
1099
1102
}
1100
1103
}
1101
1104
1102
1105
getActorIsolation ().printForDiagnostics (os);
1106
+ printOptions (os);
1103
1107
return ;
1104
1108
case Task:
1105
1109
os << " task-isolated" ;
1110
+ printOptions (os);
1106
1111
return ;
1107
1112
}
1108
1113
}
0 commit comments