File tree Expand file tree Collapse file tree 2 files changed +34
-3
lines changed
IntegrationTests/JavaScriptKitExec/Sources/JavaScriptKitExec Expand file tree Collapse file tree 2 files changed +34
-3
lines changed Original file line number Diff line number Diff line change @@ -299,3 +299,27 @@ Object_Conversion: do {
299
299
} catch {
300
300
print ( error)
301
301
}
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 {
50
50
allocHeap ( value : any ) {
51
51
const isObject = typeof value == "object"
52
52
if ( isObject && value . swjs_heap_id ) {
53
+ value . swjs_heap_rc ++ ;
53
54
return value . swjs_heap_id
54
55
}
55
56
const id = this . _heapNextKey ++ ;
56
57
this . _heapValues . set ( id , value )
57
- if ( isObject )
58
+ if ( isObject ) {
58
59
Reflect . set ( value , "swjs_heap_id" , id ) ;
60
+ Reflect . set ( value , "swjs_heap_rc" , 1 ) ;
61
+ }
59
62
return id
60
63
}
61
64
62
65
freeHeap ( ref : ref ) {
63
66
const value = this . _heapValues . get ( ref ) ;
64
67
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 ;
66
71
delete value . swjs_heap_id ;
72
+ this . _heapValues . delete ( ref )
73
+ } else {
74
+ this . _heapValues . delete ( ref )
67
75
}
68
- this . _heapValues . delete ( ref )
69
76
}
70
77
71
78
referenceHeap ( ref : ref ) {
You can’t perform that action at this time.
0 commit comments