@@ -88,21 +88,74 @@ class ActorIsolation {
88
88
// / Set to true if this was parsed from SIL.
89
89
unsigned silParsed : 1 ;
90
90
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
+ }
92
128
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
+ };
94
136
95
- ActorIsolation (Kind kind, VarDecl *actor, unsigned parameterIndex);
137
+ ActorIsolation (Kind kind, NominalTypeDecl *actor,
138
+ EncodedParameterIndex parameterIndex);
96
139
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);
98
145
99
146
ActorIsolation (Kind kind, Type globalActor);
100
147
148
+ EncodedParameterIndex getEncodedParameterIndex () const {
149
+ return EncodedParameterIndex::fromOpaqueValue (encodedParameterIndex);
150
+ }
151
+
101
152
public:
102
153
// No-argument constructor needed for DenseMap use in PostfixCompletion.cpp
103
154
explicit ActorIsolation (Kind kind = Unspecified, bool isSILParsed = false )
104
155
: pointer(nullptr ), kind(kind), isolatedByPreconcurrency(false ),
105
- silParsed(isSILParsed), parameterIndex(0 ) {}
156
+ silParsed(isSILParsed), encodedParameterIndex(0 ) {
157
+ assert (kind != ActorInstance);
158
+ }
106
159
107
160
static ActorIsolation forUnspecified () {
108
161
return ActorIsolation (Unspecified);
@@ -125,19 +178,22 @@ class ActorIsolation {
125
178
126
179
static ActorIsolation forActorInstanceParameter (NominalTypeDecl *actor,
127
180
unsigned parameterIndex) {
128
- return ActorIsolation (ActorInstance, actor, parameterIndex + 1 );
181
+ return ActorIsolation (ActorInstance, actor,
182
+ EncodedParameterIndex::parameter (parameterIndex));
129
183
}
130
184
131
185
static ActorIsolation forActorInstanceParameter (VarDecl *actor,
132
186
unsigned parameterIndex) {
133
- return ActorIsolation (ActorInstance, actor, parameterIndex + 1 );
187
+ return ActorIsolation (ActorInstance, actor,
188
+ EncodedParameterIndex::parameter (parameterIndex));
134
189
}
135
190
136
191
static ActorIsolation forActorInstanceParameter (Expr *actor,
137
192
unsigned parameterIndex);
138
193
139
194
static ActorIsolation forActorInstanceCapture (VarDecl *capturedActor) {
140
- return ActorIsolation (ActorInstance, capturedActor, 0 );
195
+ return ActorIsolation (ActorInstance, capturedActor,
196
+ EncodedParameterIndex::capture ());
141
197
}
142
198
143
199
static ActorIsolation forGlobalActor (Type globalActor) {
@@ -187,17 +243,22 @@ class ActorIsolation {
187
243
bool isNonisolatedUnsafe () const { return kind == NonisolatedUnsafe; }
188
244
189
245
// / Retrieve the parameter to which actor-instance isolation applies.
190
- // /
191
- // / Parameter 0 is `self`.
192
- unsigned getActorInstanceParameter () const {
246
+ unsigned getActorInstanceParameterIndex () const {
193
247
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 ();
195
255
}
196
256
197
257
// / Returns true if this is an actor-instance isolation that additionally
198
258
// / applies to the self parameter of a method.
199
259
bool isActorInstanceForSelfParameter () const {
200
- return getActorInstanceParameter () == 0 ;
260
+ assert (getKind () == ActorInstance);
261
+ return getEncodedParameterIndex ().isSelf ();
201
262
}
202
263
203
264
bool isSILParsed () const { return silParsed; }
@@ -285,13 +346,13 @@ class ActorIsolation {
285
346
id.AddPointer (pointer);
286
347
id.AddBoolean (isolatedByPreconcurrency);
287
348
id.AddBoolean (silParsed);
288
- id.AddInteger (parameterIndex );
349
+ id.AddInteger (encodedParameterIndex );
289
350
}
290
351
291
352
friend llvm::hash_code hash_value (const ActorIsolation &state) {
292
353
return llvm::hash_combine (state.kind , state.pointer ,
293
354
state.isolatedByPreconcurrency , state.silParsed ,
294
- state.parameterIndex );
355
+ state.encodedParameterIndex );
295
356
}
296
357
297
358
void print (llvm::raw_ostream &os) const ;
0 commit comments