Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7408cec

Browse files
Merge pull request swiftwasm#14 from kateinoigakukun/katei/refine-rc
Refine reference count system
2 parents cba6775 + eab7eb8 commit 7408cec

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

IntegrationTests/JavaScriptKitExec/Sources/JavaScriptKitExec/main.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
}

Runtime/src/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff 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) {

0 commit comments

Comments
 (0)