File tree Expand file tree Collapse file tree 4 files changed +41
-8
lines changed
stdlib/public/Concurrency Expand file tree Collapse file tree 4 files changed +41
-8
lines changed Original file line number Diff line number Diff line change @@ -642,7 +642,7 @@ SILValue SILGenFunction::emitLoadGlobalActorExecutor(Type globalActor) {
642
642
actorType->getTypeOfMember (SGM.SwiftModule , sharedInstanceDecl);
643
643
644
644
auto metaRepr =
645
- nominal->isResilient (SGM.SwiftModule , ResilienceExpansion::Maximal )
645
+ nominal->isResilient (SGM.SwiftModule , F. getResilienceExpansion () )
646
646
? MetatypeRepresentation::Thick
647
647
: MetatypeRepresentation::Thin;
648
648
Original file line number Diff line number Diff line change @@ -45,15 +45,24 @@ import Swift
45
45
@available ( SwiftStdlib 5 . 5 , * )
46
46
extension MainActor {
47
47
/// Execute the given body closure on the main actor.
48
- @_silgen_name ( " $sScM3run10resultType4bodyxxm_xyYbKScMYcXEtYaKlFZ " )
49
- public static func run< T: Sendable > (
48
+ ///
49
+ /// Historical ABI entry point, superceded by the Sendable version that is
50
+ /// also inlined to back-deploy a semantic fix where this operation would
51
+ /// not hop back at the end.
52
+ @usableFromInline
53
+ static func run< T> (
50
54
resultType: T . Type = T . self,
51
55
body: @MainActor @Sendable ( ) throws -> T
52
56
) async rethrows -> T {
53
- @MainActor func runOnMain( body: @MainActor @Sendable ( ) throws -> T ) async rethrows -> T {
54
- return try body ( )
55
- }
57
+ return try await body ( )
58
+ }
56
59
57
- return try await runOnMain ( body: body)
60
+ /// Execute the given body closure on the main actor.
61
+ @_alwaysEmitIntoClient
62
+ public static func run< T: Sendable > (
63
+ resultType: T . Type = T . self,
64
+ body: @MainActor @Sendable ( ) throws -> T
65
+ ) async rethrows -> T {
66
+ return try await body ( )
58
67
}
59
68
}
Original file line number Diff line number Diff line change @@ -81,6 +81,10 @@ actor A {
81
81
// CHECK-NOT: ERROR
82
82
// CHECK: finished with return counter = 4
83
83
84
+ // CHECK: detached task not on main queue
85
+ // CHECK: on main queue again
86
+ // CHECK: detached task hopped back
87
+
84
88
@main struct RunIt {
85
89
static func main( ) async {
86
90
print ( " starting " )
@@ -91,5 +95,25 @@ actor A {
91
95
}
92
96
let result = await someFunc ( )
93
97
print ( " finished with return counter = \( result) " )
98
+
99
+ // Check actor hopping with MainActor.run.
100
+ let task = Task . detached {
101
+ if checkIfMainQueue ( expectedAnswer: false ) {
102
+ print ( " detached task not on main queue " )
103
+ } else {
104
+ print ( " ERROR: detached task is on the main queue? " )
105
+ }
106
+
107
+ _ = await MainActor . run {
108
+ checkAnotherFn ( 1 )
109
+ }
110
+
111
+ if checkIfMainQueue ( expectedAnswer: false ) {
112
+ print ( " detached task hopped back " )
113
+ } else {
114
+ print ( " ERROR: detached task is on the main queue? " )
115
+ }
116
+ }
117
+ _ = await task. value
94
118
}
95
119
}
Original file line number Diff line number Diff line change 50
50
// UNSUPPORTED: swift_evolve
51
51
52
52
// *** DO NOT DISABLE OR XFAIL THIS TEST. *** (See comment above.)
53
-
53
+ Func MainActor.run(resultType:body:) has generic signature change from <T where T : Swift.Sendable> to <T>
54
54
// *** DO NOT DISABLE OR XFAIL THIS TEST. *** (See comment above.)
You can’t perform that action at this time.
0 commit comments