9
9
// REQUIRES: concurrency_runtime
10
10
// UNSUPPORTED: back_deployment_runtime
11
11
12
- // REQUIRES: gh76538
13
-
14
12
import Swift
15
13
import _Concurrency
16
14
import Dispatch
@@ -128,6 +126,14 @@ class ClassNoOp: Probe {
128
126
129
127
let tests = TestSuite ( " Isolated Deinit " )
130
128
129
+ // Dummy global variable to suppress stack propagation
130
+ // TODO: Remove it after disabling allocation on stack for classes with isolated deinit
131
+ var x : AnyObject ? = nil
132
+ func preventAllocationOnStack( _ object: AnyObject ) {
133
+ x = object
134
+ x = nil
135
+ }
136
+
131
137
if #available( SwiftStdlib 5 . 1 , * ) {
132
138
tests. test ( " class sync fast path " ) {
133
139
let group = DispatchGroup ( )
@@ -136,7 +142,7 @@ if #available(SwiftStdlib 5.1, *) {
136
142
// FIXME: isolated deinit should be clearing task locals
137
143
await TL . $number. withValue ( 42 ) {
138
144
await AnotherActor . shared. performTesting {
139
- _ = ClassNoOp ( expectedNumber: 42 , group: group)
145
+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 42 , group: group) )
140
146
}
141
147
}
142
148
}
@@ -148,7 +154,7 @@ if #available(SwiftStdlib 5.1, *) {
148
154
group. enter ( 1 )
149
155
Task {
150
156
TL . $number. withValue ( 99 ) {
151
- _ = ClassNoOp ( expectedNumber: 0 , group: group)
157
+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 0 , group: group) )
152
158
}
153
159
}
154
160
group. wait ( )
@@ -162,7 +168,7 @@ if #available(SwiftStdlib 5.1, *) {
162
168
TL . $number. withValue ( 99 ) {
163
169
// Despite last release happening not on the actor itself,
164
170
// this is still a fast path due to optimisation for deallocating actors.
165
- _ = ActorNoOp ( expectedNumber: 99 , group: group)
171
+ preventAllocationOnStack ( ActorNoOp ( expectedNumber: 99 , group: group) )
166
172
}
167
173
}
168
174
group. wait ( )
@@ -174,7 +180,7 @@ if #available(SwiftStdlib 5.1, *) {
174
180
Task {
175
181
TL . $number. withValue ( 99 ) {
176
182
// Using ProxyActor breaks optimization
177
- _ = ProxyActor ( expectedNumber: 0 , group: group)
183
+ preventAllocationOnStack ( ProxyActor ( expectedNumber: 0 , group: group) )
178
184
}
179
185
}
180
186
group. wait ( )
@@ -184,8 +190,8 @@ if #available(SwiftStdlib 5.1, *) {
184
190
let group = DispatchGroup ( )
185
191
group. enter ( 2 )
186
192
Task {
187
- _ = ActorNoOp ( expectedNumber: 0 , group: group)
188
- _ = ClassNoOp ( expectedNumber: 0 , group: group)
193
+ preventAllocationOnStack ( ActorNoOp ( expectedNumber: 0 , group: group) )
194
+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 0 , group: group) )
189
195
}
190
196
group. wait ( )
191
197
}
0 commit comments