@@ -88,21 +88,74 @@ class ActorIsolation {
8888 // / Set to true if this was parsed from SIL.
8989 unsigned silParsed : 1 ;
9090
91- unsigned parameterIndex : 27 ;
91+ // / The opaque value of an EncodedParameterIndex.
92+ // / Only meaningful for ActorInstance.
93+ unsigned encodedParameterIndex : 27 ;
94+
95+ class EncodedParameterIndex {
96+ enum : unsigned {
97+ SpecialIndex_Capture,
98+ SpecialIndex_Self,
99+ NumSpecialIndexes
100+ };
101+
102+ // / Either a special index or (parameter index + NumSpecialIndexes).
103+ unsigned value;
104+
105+ constexpr EncodedParameterIndex (unsigned value) : value(value) {}
106+
107+ public:
108+ static constexpr EncodedParameterIndex parameter (unsigned index) {
109+ return EncodedParameterIndex (NumSpecialIndexes + index);
110+ }
111+ static constexpr EncodedParameterIndex self () {
112+ return EncodedParameterIndex (SpecialIndex_Self);
113+ }
114+ static constexpr EncodedParameterIndex capture () {
115+ return EncodedParameterIndex (SpecialIndex_Capture);
116+ }
117+
118+ unsigned getParameterIndex () const {
119+ assert (value >= NumSpecialIndexes);
120+ return value - NumSpecialIndexes;
121+ }
122+ bool isSelf () const {
123+ return value == SpecialIndex_Self;
124+ }
125+ bool isCapture () const {
126+ return value == SpecialIndex_Capture;
127+ }
92128
93- ActorIsolation (Kind kind, NominalTypeDecl *actor, unsigned parameterIndex);
129+ static EncodedParameterIndex fromOpaqueValue (unsigned value) {
130+ return EncodedParameterIndex (value);
131+ }
132+ unsigned getOpaqueValue () const {
133+ return value;
134+ }
135+ };
94136
95- ActorIsolation (Kind kind, VarDecl *actor, unsigned parameterIndex);
137+ ActorIsolation (Kind kind, NominalTypeDecl *actor,
138+ EncodedParameterIndex parameterIndex);
96139
97- ActorIsolation (Kind kind, Expr *actor, unsigned parameterIndex);
140+ ActorIsolation (Kind kind, VarDecl *actor,
141+ EncodedParameterIndex parameterIndex);
142+
143+ ActorIsolation (Kind kind, Expr *actor,
144+ EncodedParameterIndex parameterIndex);
98145
99146 ActorIsolation (Kind kind, Type globalActor);
100147
148+ EncodedParameterIndex getEncodedParameterIndex () const {
149+ return EncodedParameterIndex::fromOpaqueValue (encodedParameterIndex);
150+ }
151+
101152public:
102153 // No-argument constructor needed for DenseMap use in PostfixCompletion.cpp
103154 explicit ActorIsolation (Kind kind = Unspecified, bool isSILParsed = false )
104155 : pointer(nullptr ), kind(kind), isolatedByPreconcurrency(false ),
105- silParsed(isSILParsed), parameterIndex(0 ) {}
156+ silParsed(isSILParsed), encodedParameterIndex(0 ) {
157+ assert (kind != ActorInstance);
158+ }
106159
107160 static ActorIsolation forUnspecified () {
108161 return ActorIsolation (Unspecified);
@@ -125,19 +178,22 @@ class ActorIsolation {
125178
126179 static ActorIsolation forActorInstanceParameter (NominalTypeDecl *actor,
127180 unsigned parameterIndex) {
128- return ActorIsolation (ActorInstance, actor, parameterIndex + 1 );
181+ return ActorIsolation (ActorInstance, actor,
182+ EncodedParameterIndex::parameter (parameterIndex));
129183 }
130184
131185 static ActorIsolation forActorInstanceParameter (VarDecl *actor,
132186 unsigned parameterIndex) {
133- return ActorIsolation (ActorInstance, actor, parameterIndex + 1 );
187+ return ActorIsolation (ActorInstance, actor,
188+ EncodedParameterIndex::parameter (parameterIndex));
134189 }
135190
136191 static ActorIsolation forActorInstanceParameter (Expr *actor,
137192 unsigned parameterIndex);
138193
139194 static ActorIsolation forActorInstanceCapture (VarDecl *capturedActor) {
140- return ActorIsolation (ActorInstance, capturedActor, 0 );
195+ return ActorIsolation (ActorInstance, capturedActor,
196+ EncodedParameterIndex::capture ());
141197 }
142198
143199 static ActorIsolation forGlobalActor (Type globalActor) {
@@ -187,17 +243,22 @@ class ActorIsolation {
187243 bool isNonisolatedUnsafe () const { return kind == NonisolatedUnsafe; }
188244
189245 // / Retrieve the parameter to which actor-instance isolation applies.
190- // /
191- // / Parameter 0 is `self`.
192- unsigned getActorInstanceParameter () const {
246+ unsigned getActorInstanceParameterIndex () const {
193247 assert (getKind () == ActorInstance);
194- return parameterIndex;
248+ return getEncodedParameterIndex ().getParameterIndex ();
249+ }
250+
251+ // / Given that this is actor instance isolation, is it a capture?
252+ bool isActorInstanceForCapture () const {
253+ assert (getKind () == ActorInstance);
254+ return getEncodedParameterIndex ().isCapture ();
195255 }
196256
197257 // / Returns true if this is an actor-instance isolation that additionally
198258 // / applies to the self parameter of a method.
199259 bool isActorInstanceForSelfParameter () const {
200- return getActorInstanceParameter () == 0 ;
260+ assert (getKind () == ActorInstance);
261+ return getEncodedParameterIndex ().isSelf ();
201262 }
202263
203264 bool isSILParsed () const { return silParsed; }
@@ -285,13 +346,13 @@ class ActorIsolation {
285346 id.AddPointer (pointer);
286347 id.AddBoolean (isolatedByPreconcurrency);
287348 id.AddBoolean (silParsed);
288- id.AddInteger (parameterIndex );
349+ id.AddInteger (encodedParameterIndex );
289350 }
290351
291352 friend llvm::hash_code hash_value (const ActorIsolation &state) {
292353 return llvm::hash_combine (state.kind , state.pointer ,
293354 state.isolatedByPreconcurrency , state.silParsed ,
294- state.parameterIndex );
355+ state.encodedParameterIndex );
295356 }
296357
297358 void print (llvm::raw_ostream &os) const ;
0 commit comments