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