Skip to content

Commit 8e83dd9

Browse files
committed
Sema: Don't compute isSimpleDidSet() from getStorageImplInfo()
1 parent e76d155 commit 8e83dd9

File tree

9 files changed

+45
-42
lines changed

9 files changed

+45
-42
lines changed

include/swift/AST/StorageImpl.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,11 @@ enum class ReadWriteImplKind {
223223
/// There's a modify coroutine.
224224
Modify,
225225

226-
/// We have a didSet which doesn't use the oldValue
227-
StoredWithSimpleDidSet,
228-
229-
/// We have a didSet which doesn't use the oldValue
230-
InheritedWithSimpleDidSet,
226+
/// We have a didSet, so we're either going to use
227+
/// MaterializeOrTemporary or the "simple didSet"
228+
// access pattern.
229+
StoredWithDidSet,
230+
InheritedWithDidSet,
231231
};
232232
enum { NumReadWriteImplKindBits = 4 };
233233

@@ -273,13 +273,13 @@ class StorageImplInfo {
273273
case WriteImplKind::StoredWithObservers:
274274
assert(readImpl == ReadImplKind::Stored);
275275
assert(readWriteImpl == ReadWriteImplKind::MaterializeToTemporary ||
276-
readWriteImpl == ReadWriteImplKind::StoredWithSimpleDidSet);
276+
readWriteImpl == ReadWriteImplKind::StoredWithDidSet);
277277
return;
278278

279279
case WriteImplKind::InheritedWithObservers:
280280
assert(readImpl == ReadImplKind::Inherited);
281281
assert(readWriteImpl == ReadWriteImplKind::MaterializeToTemporary ||
282-
readWriteImpl == ReadWriteImplKind::InheritedWithSimpleDidSet);
282+
readWriteImpl == ReadWriteImplKind::InheritedWithDidSet);
283283
return;
284284

285285
case WriteImplKind::Set:

lib/AST/ASTDumper.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,10 @@ StringRef swift::getReadWriteImplKindName(ReadWriteImplKind kind) {
286286
return "materialize_to_temporary";
287287
case ReadWriteImplKind::Modify:
288288
return "modify_coroutine";
289-
case ReadWriteImplKind::StoredWithSimpleDidSet:
290-
return "stored_simple_didset";
291-
case ReadWriteImplKind::InheritedWithSimpleDidSet:
292-
return "inherited_simple_didset";
289+
case ReadWriteImplKind::StoredWithDidSet:
290+
return "stored_with_didset";
291+
case ReadWriteImplKind::InheritedWithDidSet:
292+
return "inherited_with_didset";
293293
}
294294
llvm_unreachable("bad kind");
295295
}

lib/AST/Decl.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2019,9 +2019,10 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
20192019
case ReadWriteImplKind::Modify:
20202020
return AccessStrategy::getAccessor(AccessorKind::Modify,
20212021
/*dispatch*/ false);
2022-
case ReadWriteImplKind::StoredWithSimpleDidSet:
2023-
case ReadWriteImplKind::InheritedWithSimpleDidSet:
2024-
if (storage->requiresOpaqueModifyCoroutine()) {
2022+
case ReadWriteImplKind::StoredWithDidSet:
2023+
case ReadWriteImplKind::InheritedWithDidSet:
2024+
if (storage->requiresOpaqueModifyCoroutine() &&
2025+
storage->getParsedAccessor(AccessorKind::DidSet)->isSimpleDidSet()) {
20252026
return AccessStrategy::getAccessor(AccessorKind::Modify,
20262027
/*dispatch*/ false);
20272028
} else {

lib/SIL/IR/TypeLowering.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2684,10 +2684,13 @@ TypeConverter::getLoweredLocalCaptures(SILDeclRef fn) {
26842684
collectAccessorCaptures(AccessorKind::MutableAddress);
26852685
break;
26862686
case ReadWriteImplKind::Modify:
2687-
case ReadWriteImplKind::StoredWithSimpleDidSet:
2688-
case ReadWriteImplKind::InheritedWithSimpleDidSet:
26892687
collectAccessorCaptures(AccessorKind::Modify);
26902688
break;
2689+
case ReadWriteImplKind::StoredWithDidSet:
2690+
// We've already processed the didSet operation.
2691+
break;
2692+
case ReadWriteImplKind::InheritedWithDidSet:
2693+
llvm_unreachable("inherited local variable");
26912694
}
26922695
}
26932696

lib/Sema/TypeCheckStorage.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,9 +1761,10 @@ synthesizeCoroutineAccessorBody(AccessorDecl *accessor, ASTContext &ctx) {
17611761
// serialized, which prevents them from being able to directly reference
17621762
// didSet/willSet accessors, which are private.
17631763
if (isModify &&
1764-
(storageReadWriteImpl == ReadWriteImplKind::StoredWithSimpleDidSet ||
1765-
storageReadWriteImpl == ReadWriteImplKind::InheritedWithSimpleDidSet) &&
1766-
!accessor->hasForcedStaticDispatch()) {
1764+
!accessor->hasForcedStaticDispatch() &&
1765+
(storageReadWriteImpl == ReadWriteImplKind::StoredWithDidSet ||
1766+
storageReadWriteImpl == ReadWriteImplKind::InheritedWithDidSet) &&
1767+
storage->getParsedAccessor(AccessorKind::DidSet)->isSimpleDidSet()) {
17671768
return synthesizeModifyCoroutineBodyWithSimpleDidSet(accessor, ctx);
17681769
}
17691770

@@ -2321,9 +2322,11 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
23212322
}
23222323

23232324
switch (storage->getReadWriteImpl()) {
2324-
case ReadWriteImplKind::StoredWithSimpleDidSet:
2325-
case ReadWriteImplKind::InheritedWithSimpleDidSet:
2326-
return false;
2325+
case ReadWriteImplKind::StoredWithDidSet:
2326+
case ReadWriteImplKind::InheritedWithDidSet:
2327+
if (storage->getAccessor(AccessorKind::DidSet)->isSimpleDidSet())
2328+
return false;
2329+
break;
23272330
default:
23282331
break;
23292332
}
@@ -3078,10 +3081,6 @@ StorageImplInfoRequest::evaluate(Evaluator &evaluator,
30783081
bool hasSetter = storage->getParsedAccessor(AccessorKind::Set);
30793082
bool hasModify = storage->getParsedAccessor(AccessorKind::Modify);
30803083
bool hasMutableAddress = storage->getParsedAccessor(AccessorKind::MutableAddress);
3081-
bool hasSimpleDidSet =
3082-
hasDidSet && const_cast<AccessorDecl *>(
3083-
storage->getParsedAccessor(AccessorKind::DidSet))
3084-
->isSimpleDidSet();
30853084

30863085
// 'get', 'read', and a non-mutable addressor are all exclusive.
30873086
ReadImplKind readImpl;
@@ -3143,22 +3142,22 @@ StorageImplInfoRequest::evaluate(Evaluator &evaluator,
31433142
// Check if we have observers.
31443143
} else if (readImpl == ReadImplKind::Inherited) {
31453144
writeImpl = WriteImplKind::InheritedWithObservers;
3146-
readWriteImpl = ReadWriteImplKind::MaterializeToTemporary;
31473145

3148-
if (!hasWillSet && hasSimpleDidSet) {
3149-
readWriteImpl = ReadWriteImplKind::InheritedWithSimpleDidSet;
3150-
}
3146+
if (hasWillSet)
3147+
readWriteImpl = ReadWriteImplKind::MaterializeToTemporary;
3148+
else
3149+
readWriteImpl = ReadWriteImplKind::InheritedWithDidSet;
31513150

31523151
// Otherwise, it's stored.
31533152
} else if (readImpl == ReadImplKind::Stored &&
31543153
!cast<VarDecl>(storage)->isLet()) {
31553154
if (hasWillSet || hasDidSet) {
31563155
writeImpl = WriteImplKind::StoredWithObservers;
3157-
readWriteImpl = ReadWriteImplKind::MaterializeToTemporary;
31583156

3159-
if (!hasWillSet && hasSimpleDidSet) {
3160-
readWriteImpl = ReadWriteImplKind::StoredWithSimpleDidSet;
3161-
}
3157+
if (hasWillSet)
3158+
readWriteImpl = ReadWriteImplKind::MaterializeToTemporary;
3159+
else
3160+
readWriteImpl = ReadWriteImplKind::StoredWithDidSet;
31623161
} else {
31633162
writeImpl = WriteImplKind::Stored;
31643163
readWriteImpl = ReadWriteImplKind::Stored;

lib/Serialization/Deserialization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2199,8 +2199,8 @@ getActualReadWriteImplKind(unsigned rawKind) {
21992199
CASE(MutableAddress)
22002200
CASE(MaterializeToTemporary)
22012201
CASE(Modify)
2202-
CASE(StoredWithSimpleDidSet)
2203-
CASE(InheritedWithSimpleDidSet)
2202+
CASE(StoredWithDidSet)
2203+
CASE(InheritedWithDidSet)
22042204
#undef CASE
22052205
}
22062206
return None;

lib/Serialization/ModuleFormat.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5555
/// describe what change you made. The content of this comment isn't important;
5656
/// it just ensures a conflict if two people change the module format.
5757
/// Don't worry about adhering to the 80-column limit for this line.
58-
const uint16_t SWIFTMODULE_VERSION_MINOR = 576; // hasCReferences
58+
const uint16_t SWIFTMODULE_VERSION_MINOR = 577; // isSimpleDidSet() change
5959

6060
/// A standard hash seed used for all string hashes in a serialized module.
6161
///
@@ -208,8 +208,8 @@ enum class ReadWriteImplKind : uint8_t {
208208
MutableAddress,
209209
MaterializeToTemporary,
210210
Modify,
211-
StoredWithSimpleDidSet,
212-
InheritedWithSimpleDidSet,
211+
StoredWithDidSet,
212+
InheritedWithDidSet,
213213
};
214214
using ReadWriteImplKindField = BCFixed<3>;
215215

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,8 @@ static unsigned getRawReadWriteImplKind(swift::ReadWriteImplKind kind) {
514514
CASE(MutableAddress)
515515
CASE(MaterializeToTemporary)
516516
CASE(Modify)
517-
CASE(StoredWithSimpleDidSet)
518-
CASE(InheritedWithSimpleDidSet)
517+
CASE(StoredWithDidSet)
518+
CASE(InheritedWithDidSet)
519519
#undef CASE
520520
}
521521
llvm_unreachable("bad kind");

test/attr/attr_native_dynamic.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ struct Strukt {
7070
}
7171
}
7272

73-
// CHECK: (var_decl {{.*}} "storedWithObserver" type='Int' interface type='Int' access=internal dynamic readImpl=stored writeImpl=stored_with_observers readWriteImpl=stored_simple_didset
73+
// CHECK: (var_decl {{.*}} "storedWithObserver" type='Int' interface type='Int' access=internal dynamic readImpl=stored writeImpl=stored_with_observers readWriteImpl=stored_with_didset
7474
// CHECK: (accessor_decl {{.*}}access=private dynamic didSet_for=storedWithObserver
7575
// CHECK: (accessor_decl {{.*}}access=internal dynamic get_for=storedWithObserver
7676
// CHECK: (accessor_decl {{.*}}access=internal set_for=storedWithObserver

0 commit comments

Comments
 (0)