@@ -531,8 +531,8 @@ extension DistributedActorSystem {
531
531
}
532
532
533
533
// Decode the return type
534
- func allocateReturnTypeBuffer < R> ( _: R . Type ) -> UnsafeRawPointer ? {
535
- return UnsafeRawPointer ( UnsafeMutablePointer< R> . allocate( capacity: 1 ) )
534
+ func doAllocateReturnTypeBuffer < R> ( _: R . Type ) -> UnsafeMutableRawPointer ? {
535
+ return UnsafeMutableRawPointer ( UnsafeMutablePointer< R> . allocate( capacity: 1 ) )
536
536
}
537
537
538
538
let maybeReturnTypeFromTypeInfo =
@@ -549,18 +549,23 @@ extension DistributedActorSystem {
549
549
errorCode: . typeDeserializationFailure)
550
550
}
551
551
552
- guard let resultBuffer = _openExistential ( returnTypeFromTypeInfo, do: allocateReturnTypeBuffer ) else {
552
+ guard let resultBuffer = _openExistential ( returnTypeFromTypeInfo, do: doAllocateReturnTypeBuffer ) else {
553
553
throw ExecuteDistributedTargetError (
554
554
message: " Failed to allocate buffer for distributed target return type " ,
555
555
errorCode: . typeDeserializationFailure)
556
556
}
557
557
558
- func destroyReturnTypeBuffer< R> ( _: R . Type ) {
559
- resultBuffer. assumingMemoryBound ( to: R . self) . deallocate ( )
558
+ var executeDistributedTargetHasThrown = false
559
+ func doDestroyReturnTypeBuffer< R> ( _: R . Type ) {
560
+ let buf = resultBuffer. assumingMemoryBound ( to: R . self)
561
+ if !executeDistributedTargetHasThrown {
562
+ buf. deinitialize ( count: 1 )
563
+ }
564
+ buf. deallocate ( )
560
565
}
561
566
562
567
defer {
563
- _openExistential ( returnTypeFromTypeInfo, do: destroyReturnTypeBuffer )
568
+ _openExistential ( returnTypeFromTypeInfo, do: doDestroyReturnTypeBuffer )
564
569
}
565
570
566
571
do {
@@ -590,6 +595,7 @@ extension DistributedActorSystem {
590
595
)
591
596
}
592
597
} catch {
598
+ executeDistributedTargetHasThrown = true
593
599
try await handler. onThrow ( error: error)
594
600
}
595
601
}
0 commit comments