@@ -1263,27 +1263,51 @@ AssignOrInitInst::AssignOrInitInst(SILDebugLocation Loc, SILValue Src,
1263
1263
Operands(this , Src, Initializer, Setter) {
1264
1264
assert (Initializer->getType ().is <SILFunctionType>());
1265
1265
sharedUInt8 ().AssignOrInitInst .mode = uint8_t (Mode);
1266
+ Assignments.resize (getNumInitializedProperties ());
1267
+ }
1268
+
1269
+ void AssignOrInitInst::markAsInitialized (VarDecl *property) {
1270
+ auto toInitProperties = getInitializedProperties ();
1271
+ for (unsigned index : indices (toInitProperties)) {
1272
+ if (toInitProperties[index] == property) {
1273
+ Assignments.set (index);
1274
+ break ;
1275
+ }
1276
+ }
1277
+ }
1278
+
1279
+ bool AssignOrInitInst::isPropertyAlreadyInitialized (unsigned propertyIdx) {
1280
+ assert (propertyIdx < Assignments.size ());
1281
+ return Assignments.test (propertyIdx);
1266
1282
}
1267
1283
1268
1284
AccessorDecl *AssignOrInitInst::getReferencedInitAccessor () const {
1269
- auto *initRef =
1270
- cast<FunctionRefInst>(getInitializer ()->getDefiningInstruction ());
1271
- auto *accessorRef = initRef->getReferencedFunction ();
1272
- return cast<AccessorDecl>(accessorRef->getDeclContext ());
1285
+ auto *initRef = cast<FunctionRefInst>(getInitializer ());
1286
+ auto *accessorRef = initRef->getReferencedFunctionOrNull ();
1287
+ assert (accessorRef);
1288
+ return dyn_cast_or_null<AccessorDecl>(accessorRef->getDeclContext ());
1289
+ }
1290
+
1291
+ unsigned AssignOrInitInst::getNumInitializedProperties () const {
1292
+ if (auto *accessor = getReferencedInitAccessor ()) {
1293
+ auto *initAttr = accessor->getAttrs ().getAttribute <InitializesAttr>();
1294
+ return initAttr ? initAttr->getNumProperties () : 0 ;
1295
+ }
1296
+ return 0 ;
1273
1297
}
1274
1298
1275
1299
ArrayRef<VarDecl *> AssignOrInitInst::getInitializedProperties () const {
1276
- auto *accessor = getReferencedInitAccessor ();
1277
- if (auto *initAttr = accessor->getAttrs ().getAttribute <InitializesAttr>()) {
1278
- return initAttr->getPropertyDecls (accessor);
1300
+ if ( auto *accessor = getReferencedInitAccessor ()) {
1301
+ if (auto *initAttr = accessor->getAttrs ().getAttribute <InitializesAttr>())
1302
+ return initAttr->getPropertyDecls (accessor);
1279
1303
}
1280
1304
return {};
1281
1305
}
1282
1306
1283
1307
ArrayRef<VarDecl *> AssignOrInitInst::getAccessedProperties () const {
1284
- auto *accessor = getReferencedInitAccessor ();
1285
- if (auto *accessAttr = accessor->getAttrs ().getAttribute <AccessesAttr>()) {
1286
- return accessAttr->getPropertyDecls (accessor);
1308
+ if ( auto *accessor = getReferencedInitAccessor ()) {
1309
+ if (auto *accessAttr = accessor->getAttrs ().getAttribute <AccessesAttr>())
1310
+ return accessAttr->getPropertyDecls (accessor);
1287
1311
}
1288
1312
return {};
1289
1313
}
0 commit comments