Skip to content

Commit 651436d

Browse files
committed
[CoroutineAccessors] Prefer for access.
If read2/modify2 exist, prefer them as part of the access strategy for reading/writing/read-writing.
1 parent c3f9cc1 commit 651436d

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

lib/AST/Decl.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2849,8 +2849,13 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28492849
/*dispatch*/ false);
28502850
case ReadWriteImplKind::StoredWithDidSet:
28512851
case ReadWriteImplKind::InheritedWithDidSet:
2852-
if (storage->requiresOpaqueModifyCoroutine() &&
2852+
if (storage->requiresOpaqueModify2Coroutine() &&
28532853
storage->getParsedAccessor(AccessorKind::DidSet)->isSimpleDidSet()) {
2854+
return AccessStrategy::getAccessor(AccessorKind::Modify2,
2855+
/*dispatch*/ false);
2856+
} else if (storage->requiresOpaqueModifyCoroutine() &&
2857+
storage->getParsedAccessor(AccessorKind::DidSet)
2858+
->isSimpleDidSet()) {
28542859
return AccessStrategy::getAccessor(AccessorKind::Modify,
28552860
/*dispatch*/ false);
28562861
} else {
@@ -2868,6 +2873,8 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28682873

28692874
static AccessStrategy
28702875
getOpaqueReadAccessStrategy(const AbstractStorageDecl *storage, bool dispatch) {
2876+
if (storage->requiresOpaqueRead2Coroutine())
2877+
return AccessStrategy::getAccessor(AccessorKind::Read2, dispatch);
28712878
if (storage->requiresOpaqueReadCoroutine())
28722879
return AccessStrategy::getAccessor(AccessorKind::Read, dispatch);
28732880
return AccessStrategy::getAccessor(AccessorKind::Get, dispatch);
@@ -2883,6 +2890,8 @@ getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch)
28832890
static AccessStrategy
28842891
getOpaqueReadWriteAccessStrategy(const AbstractStorageDecl *storage,
28852892
bool dispatch) {
2893+
if (storage->requiresOpaqueModify2Coroutine())
2894+
return AccessStrategy::getAccessor(AccessorKind::Modify2, dispatch);
28862895
if (storage->requiresOpaqueModifyCoroutine())
28872896
return AccessStrategy::getAccessor(AccessorKind::Modify, dispatch);
28882897
return AccessStrategy::getMaterializeToTemporary(

test/SILGen/coroutine_accessors.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,13 @@ class OverridableGetter : ReadableTitle {
179179
var title: String = ""
180180
}
181181
// The read witness thunk does a direct call to the concrete read accessor.
182-
// CHECK-LABEL: sil private [transparent] [thunk] [ossa] @$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvrTW
183-
// CHECK: function_ref @$s19coroutine_accessors17OverridableGetterC5titleSSvr
184-
// CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvrTW'
182+
// CHECK-LABEL: sil private [transparent] [thunk] [ossa] @$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvyTW
183+
// CHECK: function_ref @$s19coroutine_accessors17OverridableGetterC5titleSSvy
184+
// CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvyTW'
185185
// The concrete read accessor is generated on-demand and does a class dispatch to the getter.
186-
// CHECK-LABEL: sil shared [ossa] @$s19coroutine_accessors17OverridableGetterC5titleSSvr
186+
// CHECK-LABEL: sil shared [ossa] @$s19coroutine_accessors17OverridableGetterC5titleSSvy
187187
// CHECK: class_method %0 : $OverridableGetter, #OverridableGetter.title!getter
188-
// CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterC5titleSSvr'
188+
// CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterC5titleSSvy'
189189

190190
class ImplementedReader : ReadableTitle {
191191
var _title: String = ""
@@ -214,10 +214,11 @@ protocol GettableTitle {
214214
// CHECK: bb0(
215215
// CHECK-SAME: [[SELF:%[^,]+]] :
216216
// CHECK-SAME: ):
217-
// CHECK: [[READER:%[^,]+]] = class_method [[SELF]] : $OverridableReader, #OverridableReader.title!read
218-
// CHECK: ([[TITLE:%[^,]+]], [[TOKEN:%[^,]+]]) = begin_apply [[READER]]([[SELF]])
217+
// CHECK: [[READER:%[^,]+]] = class_method [[SELF]] : $OverridableReader, #OverridableReader.title!read2
218+
// CHECK: ([[TITLE:%[^,]+]], [[TOKEN:%[^,]+]], [[ALLOCATION:%[^,]]]) = begin_apply [[READER]]([[SELF]])
219219
// CHECK: [[RETVAL:%[^,]+]] = copy_value [[TITLE]]
220220
// CHECK: end_apply [[TOKEN]] as $()
221+
// CHECK: dealloc_stack [[ALLOCATION]]
221222
// CHECK: return [[RETVAL]]
222223
// CHECK-LABEL: } // end sil function '$s19coroutine_accessors17OverridableReaderC5titleSSvg'
223224

0 commit comments

Comments
 (0)