@@ -43,34 +43,20 @@ public class ReadableStream: JSBridgedClass {
4343 }
4444}
4545
46- @propertyWrapper public struct ClosureHandler < ArgumentType: JSValueCompatible , ReturnType: JSValueCompatible > {
46+ @propertyWrapper public final class OptionalClosureHandler < ArgumentType, ReturnType>
47+ where ArgumentType: JSValueCompatible , ReturnType: JSValueCompatible {
4748
4849 let jsObject : JSObject
4950 let name : String
51+ var closure : JSClosure ?
5052
5153 public init ( jsObject: JSObject , name: String ) {
5254 self . jsObject = jsObject
5355 self . name = name
5456 }
5557
56- public var wrappedValue : ( ArgumentType ) -> ReturnType {
57- get {
58- { arg in jsObject [ name] !( arg) . fromJSValue ( ) ! }
59- }
60- set {
61- jsObject [ name] = JSClosure { newValue ( $0 [ 0 ] . fromJSValue ( ) !) . jsValue ( ) } . jsValue ( )
62- }
63- }
64- }
65-
66- @propertyWrapper public struct OptionalClosureHandler < ArgumentType: JSValueCompatible , ReturnType: JSValueCompatible > {
67-
68- let jsObject : JSObject
69- let name : String
70-
71- public init ( jsObject: JSObject , name: String ) {
72- self . jsObject = jsObject
73- self . name = name
58+ deinit {
59+ closure? . release ( )
7460 }
7561
7662 public var wrappedValue : ( ( ArgumentType ) -> ReturnType ) ? {
@@ -81,8 +67,13 @@ public class ReadableStream: JSBridgedClass {
8167 return { function ( $0. jsValue ( ) ) . fromJSValue ( ) ! }
8268 }
8369 set {
70+ if let closure = closure {
71+ closure. release ( )
72+ }
8473 if let newValue = newValue {
85- jsObject [ name] = JSClosure { newValue ( $0 [ 0 ] . fromJSValue ( ) !) . jsValue ( ) } . jsValue ( )
74+ let closure = JSClosure { newValue ( $0 [ 0 ] . fromJSValue ( ) !) . jsValue ( ) }
75+ jsObject [ name] = closure. jsValue ( )
76+ self . closure = closure
8677 } else {
8778 jsObject [ name] = . null
8879 }
0 commit comments