File tree Expand file tree Collapse file tree
IntegrationTests/JavaScriptKitExec/Sources/JavaScriptKitExec Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -299,3 +299,27 @@ Object_Conversion: do {
299299} catch {
300300 print ( error)
301301}
302+
303+ ObjectRef_Lifetime: do {
304+ // ```js
305+ // global.globalObject1 = {
306+ // "prop_1": {
307+ // "nested_prop": 1,
308+ // },
309+ // "prop_2": 2,
310+ // "prop_3": true,
311+ // "prop_4": [
312+ // 3, 4, "str_elm_1", 5,
313+ // ],
314+ // ...
315+ // }
316+ // ```
317+
318+ let identity = JSClosure { $0 [ 0 ] }
319+ let ref1 = getJSValue ( this: . global, name: " globalObject1 " ) . object!
320+ let ref2 = identity ( ref1) . object!
321+ try expectEqual ( ref1. prop_2, . number( 2 ) )
322+ try expectEqual ( ref2. prop_2, . number( 2 ) )
323+ } catch {
324+ print ( error)
325+ }
Original file line number Diff line number Diff line change @@ -50,22 +50,29 @@ class SwiftRuntimeHeap {
5050 allocHeap ( value : any ) {
5151 const isObject = typeof value == "object"
5252 if ( isObject && value . swjs_heap_id ) {
53+ value . swjs_heap_rc ++ ;
5354 return value . swjs_heap_id
5455 }
5556 const id = this . _heapNextKey ++ ;
5657 this . _heapValues . set ( id , value )
57- if ( isObject )
58+ if ( isObject ) {
5859 Reflect . set ( value , "swjs_heap_id" , id ) ;
60+ Reflect . set ( value , "swjs_heap_rc" , 1 ) ;
61+ }
5962 return id
6063 }
6164
6265 freeHeap ( ref : ref ) {
6366 const value = this . _heapValues . get ( ref ) ;
6467 const isObject = typeof value == "object"
65- if ( isObject && value . swjs_heap_id ) {
68+ if ( isObject ) {
69+ const rc = -- value . swjs_heap_rc ;
70+ if ( rc != 0 ) return ;
6671 delete value . swjs_heap_id ;
72+ this . _heapValues . delete ( ref )
73+ } else {
74+ this . _heapValues . delete ( ref )
6775 }
68- this . _heapValues . delete ( ref )
6976 }
7077
7178 referenceHeap ( ref : ref ) {
You can’t perform that action at this time.
0 commit comments