@@ -749,6 +749,7 @@ struct IntrinsicJSFragment: Sendable {
749749
750750 private static let jsValueLowerHelperName = " __bjs_jsValueLower "
751751 private static let jsValueLiftHelperName = " __bjs_jsValueLift "
752+ private static let jsValueTakeHelperName = " __bjs_jsValueTake "
752753
753754 private static func registerJSValueHelpers ( scope : JSGlueVariableScope ) {
754755 scope . registerIntrinsic ( " jsValueHelpers " ) { helperPrinter in
@@ -777,6 +778,17 @@ struct IntrinsicJSFragment: Sendable {
777778 helperPrinter . write ( " return \( resultVar ) ; " )
778779 }
779780 helperPrinter . write ( " } " )
781+ helperPrinter . write ( " function \( jsValueTakeHelperName ) (kind, payload1, payload2) { " )
782+ helperPrinter . indent {
783+ helperPrinter . write ( " const value = \( jsValueLiftHelperName ) (kind, payload1, payload2); " )
784+ helperPrinter . write ( " if (kind === 1 || kind === 3 || kind === 7 || kind === 8) { " )
785+ helperPrinter . indent {
786+ helperPrinter . write ( " \( JSGlueVariableScope . reservedSwift ) .memory.release(payload1); " )
787+ }
788+ helperPrinter . write ( " } " )
789+ helperPrinter . write ( " return value; " )
790+ }
791+ helperPrinter . write ( " } " )
780792 }
781793 }
782794
@@ -961,11 +973,12 @@ struct IntrinsicJSFragment: Sendable {
961973 let resultVar = scope . variable ( " jsValue " )
962974 registerJSValueHelpers ( scope : scope )
963975 printer . write (
964- " const \( resultVar ) = \( jsValueLiftHelperName ) ( \( kind ) , \( payload1 ) , \( payload2 ) ); "
976+ " const \( resultVar ) = \( jsValueTakeHelperName ) ( \( kind ) , \( payload1 ) , \( payload2 ) ); "
965977 )
966978 return [ resultVar ]
967979 }
968980 )
981+ /// Swift lends the payload reference for the duration of the call, so it is not released here.
969982 static let jsValueLiftParameter = IntrinsicJSFragment (
970983 parameters : [ " kind " , " payload1 " , " payload2 " ] ,
971984 printCode : { arguments , context in
@@ -2232,7 +2245,7 @@ struct IntrinsicJSFragment: Sendable {
22322245 let resultVar = scope . variable ( " jsValue " )
22332246 registerJSValueHelpers ( scope : scope )
22342247 printer . write (
2235- " const \( resultVar ) = \( jsValueLiftHelperName ) ( \( kindVar ) , \( payload1Var ) , \( payload2Var ) ); "
2248+ " const \( resultVar ) = \( jsValueTakeHelperName ) ( \( kindVar ) , \( payload1Var ) , \( payload2Var ) ); "
22362249 )
22372250 return [ resultVar ]
22382251 }
0 commit comments