@@ -2819,7 +2819,8 @@ getDirectWriteAccessStrategy(const AbstractStorageDecl *storage) {
2819
2819
}
2820
2820
2821
2821
static AccessStrategy
2822
- getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch);
2822
+ getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch,
2823
+ bool useOldABI);
2823
2824
static AccessStrategy
2824
2825
getOpaqueWriteAccessStrategy (const AbstractStorageDecl *storage, bool dispatch);
2825
2826
@@ -2834,7 +2835,7 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
2834
2835
// If the storage isDynamic (and not @objc) use the accessors.
2835
2836
if (storage->shouldUseNativeDynamicDispatch ())
2836
2837
return AccessStrategy::getMaterializeToTemporary (
2837
- getOpaqueReadAccessStrategy (storage, false ),
2838
+ getOpaqueReadAccessStrategy (storage, false , false ),
2838
2839
getOpaqueWriteAccessStrategy (storage, false ));
2839
2840
return AccessStrategy::getStorage ();
2840
2841
}
@@ -2872,7 +2873,13 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
2872
2873
}
2873
2874
2874
2875
static AccessStrategy
2875
- getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch) {
2876
+ getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch,
2877
+ bool useOldABI) {
2878
+ if (useOldABI) {
2879
+ assert (storage->requiresOpaqueRead2Coroutine ());
2880
+ assert (storage->requiresOpaqueReadCoroutine ());
2881
+ return AccessStrategy::getAccessor (AccessorKind::Read, dispatch);
2882
+ }
2876
2883
if (storage->requiresOpaqueRead2Coroutine ())
2877
2884
return AccessStrategy::getAccessor (AccessorKind::Read2, dispatch);
2878
2885
if (storage->requiresOpaqueReadCoroutine ())
@@ -2889,35 +2896,39 @@ getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch)
2889
2896
2890
2897
static AccessStrategy
2891
2898
getOpaqueReadWriteAccessStrategy (const AbstractStorageDecl *storage,
2892
- bool dispatch) {
2899
+ bool dispatch, bool useOldABI) {
2900
+ if (useOldABI) {
2901
+ assert (storage->requiresOpaqueModify2Coroutine ());
2902
+ assert (storage->requiresOpaqueModifyCoroutine ());
2903
+ return AccessStrategy::getAccessor (AccessorKind::Modify, dispatch);
2904
+ }
2893
2905
if (storage->requiresOpaqueModify2Coroutine ())
2894
2906
return AccessStrategy::getAccessor (AccessorKind::Modify2, dispatch);
2895
2907
if (storage->requiresOpaqueModifyCoroutine ())
2896
2908
return AccessStrategy::getAccessor (AccessorKind::Modify, dispatch);
2897
2909
return AccessStrategy::getMaterializeToTemporary (
2898
- getOpaqueReadAccessStrategy (storage, dispatch),
2899
- getOpaqueWriteAccessStrategy (storage, dispatch));
2910
+ getOpaqueReadAccessStrategy (storage, dispatch, false ),
2911
+ getOpaqueWriteAccessStrategy (storage, dispatch));
2900
2912
}
2901
2913
2902
2914
static AccessStrategy
2903
2915
getOpaqueAccessStrategy (const AbstractStorageDecl *storage,
2904
- AccessKind accessKind, bool dispatch) {
2916
+ AccessKind accessKind, bool dispatch, bool useOldABI ) {
2905
2917
switch (accessKind) {
2906
2918
case AccessKind::Read:
2907
- return getOpaqueReadAccessStrategy (storage, dispatch);
2919
+ return getOpaqueReadAccessStrategy (storage, dispatch, useOldABI );
2908
2920
case AccessKind::Write:
2921
+ assert (!useOldABI);
2909
2922
return getOpaqueWriteAccessStrategy (storage, dispatch);
2910
2923
case AccessKind::ReadWrite:
2911
- return getOpaqueReadWriteAccessStrategy (storage, dispatch);
2924
+ return getOpaqueReadWriteAccessStrategy (storage, dispatch, useOldABI );
2912
2925
}
2913
2926
llvm_unreachable (" bad access kind" );
2914
2927
}
2915
2928
2916
- AccessStrategy
2917
- AbstractStorageDecl::getAccessStrategy (AccessSemantics semantics,
2918
- AccessKind accessKind,
2919
- ModuleDecl *module ,
2920
- ResilienceExpansion expansion) const {
2929
+ AccessStrategy AbstractStorageDecl::getAccessStrategy (
2930
+ AccessSemantics semantics, AccessKind accessKind, ModuleDecl *module ,
2931
+ ResilienceExpansion expansion, bool useOldABI) const {
2921
2932
switch (semantics) {
2922
2933
case AccessSemantics::DirectToStorage:
2923
2934
assert (hasStorage () || getASTContext ().Diags .hadAnyError ());
@@ -2933,10 +2944,12 @@ AbstractStorageDecl::getAccessStrategy(AccessSemantics semantics,
2933
2944
// If the property is defined in a non-final class or a protocol, the
2934
2945
// accessors are dynamically dispatched, and we cannot do direct access.
2935
2946
if (isPolymorphic (this ))
2936
- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ true );
2947
+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ true ,
2948
+ useOldABI);
2937
2949
2938
2950
if (shouldUseNativeDynamicDispatch ())
2939
- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false );
2951
+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false ,
2952
+ useOldABI);
2940
2953
2941
2954
// If the storage is resilient from the given module and resilience
2942
2955
// expansion, we cannot use direct access.
@@ -2958,7 +2971,8 @@ AbstractStorageDecl::getAccessStrategy(AccessSemantics semantics,
2958
2971
resilient = isResilient ();
2959
2972
2960
2973
if (resilient)
2961
- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false );
2974
+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false ,
2975
+ useOldABI);
2962
2976
}
2963
2977
2964
2978
LLVM_FALLTHROUGH;
@@ -3050,10 +3064,8 @@ bool AbstractStorageDecl::requiresOpaqueModify2Coroutine() const {
3050
3064
false );
3051
3065
}
3052
3066
3053
- AccessorDecl *AbstractStorageDecl::getSynthesizedAccessor (AccessorKind kind) const {
3054
- if (auto *accessor = getAccessor (kind))
3055
- return accessor;
3056
-
3067
+ AccessorDecl *
3068
+ AbstractStorageDecl::getSynthesizedAccessor (AccessorKind kind) const {
3057
3069
ASTContext &ctx = getASTContext ();
3058
3070
return evaluateOrDefault (ctx.evaluator ,
3059
3071
SynthesizeAccessorRequest{const_cast <AbstractStorageDecl *>(this ), kind},
@@ -7112,7 +7124,10 @@ void AbstractStorageDecl::setComputedSetter(AccessorDecl *setter) {
7112
7124
void
7113
7125
AbstractStorageDecl::setSynthesizedAccessor (AccessorKind kind,
7114
7126
AccessorDecl *accessor) {
7115
- assert (!getAccessor (kind) && " accessor already exists" );
7127
+ if (auto *current = getAccessor (kind)) {
7128
+ assert (current == accessor && " different accessor of this kind exists" );
7129
+ return ;
7130
+ }
7116
7131
assert (accessor->getAccessorKind () == kind);
7117
7132
7118
7133
auto accessors = Accessors.getPointer ();
0 commit comments