@@ -2819,7 +2819,8 @@ getDirectWriteAccessStrategy(const AbstractStorageDecl *storage) {
28192819}
28202820
28212821static AccessStrategy
2822- getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch);
2822+ getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch,
2823+ bool useOldABI);
28232824static AccessStrategy
28242825getOpaqueWriteAccessStrategy (const AbstractStorageDecl *storage, bool dispatch);
28252826
@@ -2834,7 +2835,7 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28342835 // If the storage isDynamic (and not @objc) use the accessors.
28352836 if (storage->shouldUseNativeDynamicDispatch ())
28362837 return AccessStrategy::getMaterializeToTemporary (
2837- getOpaqueReadAccessStrategy (storage, false ),
2838+ getOpaqueReadAccessStrategy (storage, false , false ),
28382839 getOpaqueWriteAccessStrategy (storage, false ));
28392840 return AccessStrategy::getStorage ();
28402841 }
@@ -2872,7 +2873,13 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28722873}
28732874
28742875static 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+ }
28762883 if (storage->requiresOpaqueRead2Coroutine ())
28772884 return AccessStrategy::getAccessor (AccessorKind::Read2, dispatch);
28782885 if (storage->requiresOpaqueReadCoroutine ())
@@ -2889,35 +2896,39 @@ getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch)
28892896
28902897static AccessStrategy
28912898getOpaqueReadWriteAccessStrategy (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+ }
28932905 if (storage->requiresOpaqueModify2Coroutine ())
28942906 return AccessStrategy::getAccessor (AccessorKind::Modify2, dispatch);
28952907 if (storage->requiresOpaqueModifyCoroutine ())
28962908 return AccessStrategy::getAccessor (AccessorKind::Modify, dispatch);
28972909 return AccessStrategy::getMaterializeToTemporary (
2898- getOpaqueReadAccessStrategy (storage, dispatch),
2899- getOpaqueWriteAccessStrategy (storage, dispatch));
2910+ getOpaqueReadAccessStrategy (storage, dispatch, false ),
2911+ getOpaqueWriteAccessStrategy (storage, dispatch));
29002912}
29012913
29022914static AccessStrategy
29032915getOpaqueAccessStrategy (const AbstractStorageDecl *storage,
2904- AccessKind accessKind, bool dispatch) {
2916+ AccessKind accessKind, bool dispatch, bool useOldABI ) {
29052917 switch (accessKind) {
29062918 case AccessKind::Read:
2907- return getOpaqueReadAccessStrategy (storage, dispatch);
2919+ return getOpaqueReadAccessStrategy (storage, dispatch, useOldABI );
29082920 case AccessKind::Write:
2921+ assert (!useOldABI);
29092922 return getOpaqueWriteAccessStrategy (storage, dispatch);
29102923 case AccessKind::ReadWrite:
2911- return getOpaqueReadWriteAccessStrategy (storage, dispatch);
2924+ return getOpaqueReadWriteAccessStrategy (storage, dispatch, useOldABI );
29122925 }
29132926 llvm_unreachable (" bad access kind" );
29142927}
29152928
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 {
29212932 switch (semantics) {
29222933 case AccessSemantics::DirectToStorage:
29232934 assert (hasStorage () || getASTContext ().Diags .hadAnyError ());
@@ -2933,10 +2944,12 @@ AbstractStorageDecl::getAccessStrategy(AccessSemantics semantics,
29332944 // If the property is defined in a non-final class or a protocol, the
29342945 // accessors are dynamically dispatched, and we cannot do direct access.
29352946 if (isPolymorphic (this ))
2936- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ true );
2947+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ true ,
2948+ useOldABI);
29372949
29382950 if (shouldUseNativeDynamicDispatch ())
2939- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false );
2951+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false ,
2952+ useOldABI);
29402953
29412954 // If the storage is resilient from the given module and resilience
29422955 // expansion, we cannot use direct access.
@@ -2958,7 +2971,8 @@ AbstractStorageDecl::getAccessStrategy(AccessSemantics semantics,
29582971 resilient = isResilient ();
29592972
29602973 if (resilient)
2961- return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false );
2974+ return getOpaqueAccessStrategy (this , accessKind, /* dispatch*/ false ,
2975+ useOldABI);
29622976 }
29632977
29642978 LLVM_FALLTHROUGH;
@@ -3050,10 +3064,8 @@ bool AbstractStorageDecl::requiresOpaqueModify2Coroutine() const {
30503064 false );
30513065}
30523066
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 {
30573069 ASTContext &ctx = getASTContext ();
30583070 return evaluateOrDefault (ctx.evaluator ,
30593071 SynthesizeAccessorRequest{const_cast <AbstractStorageDecl *>(this ), kind},
@@ -7112,7 +7124,10 @@ void AbstractStorageDecl::setComputedSetter(AccessorDecl *setter) {
71127124void
71137125AbstractStorageDecl::setSynthesizedAccessor (AccessorKind kind,
71147126 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+ }
71167131 assert (accessor->getAccessorKind () == kind);
71177132
71187133 auto accessors = Accessors.getPointer ();
0 commit comments