Skip to content

Commit d547ef6

Browse files
committed
Add swjs_retain and an JSObject(cloning:) initializer
1 parent bd878f4 commit d547ef6

File tree

5 files changed

+23
-4
lines changed

5 files changed

+23
-4
lines changed

Diff for: Runtime/src/index.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,9 @@ export class SwiftRuntime {
177177
},
178178

179179
swjs_decode_string: (bytes_ptr: pointer, length: number) => {
180-
const bytes = this.memory.bytes().subarray(
181-
bytes_ptr,
182-
bytes_ptr + length
183-
);
180+
const bytes = this.memory
181+
.bytes()
182+
.subarray(bytes_ptr, bytes_ptr + length);
184183
const string = this.textDecoder.decode(bytes);
185184
return this.memory.retain(string);
186185
},
@@ -347,6 +346,9 @@ export class SwiftRuntime {
347346
this.memory.writeBytes(buffer, bytes);
348347
},
349348

349+
swjs_retain: (ref: ref) => {
350+
this.memory.retain(this.memory.getObject(ref));
351+
},
350352
swjs_release: (ref: ref) => {
351353
this.memory.release(ref);
352354
},

Diff for: Runtime/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export interface ImportedFunctions {
8484
length: number
8585
): number;
8686
swjs_load_typed_array(ref: ref, buffer: pointer): void;
87+
swjs_retain(ref: number): void;
8788
swjs_release(ref: number): void;
8889
}
8990

Diff for: Sources/JavaScriptKit/FundamentalObjects/JSObject.swift

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public open class JSObject: Equatable {
2121
self.id = id
2222
}
2323

24+
public init(cloning object: JSObject) {
25+
_retain(object.id)
26+
self.id = object.id
27+
}
28+
2429
/// Returns the `name` member method binding this object as `this` context.
2530
///
2631
/// e.g.

Diff for: Sources/JavaScriptKit/XcodeSupport.swift

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import _CJavaScriptKit
8686
_: JavaScriptObjectRef,
8787
_: UnsafeMutablePointer<UInt8>!
8888
) { fatalError() }
89+
func _retain(_: JavaScriptObjectRef) { fatalError() }
8990
func _release(_: JavaScriptObjectRef) { fatalError() }
9091

9192
#endif

Diff for: Sources/_CJavaScriptKit/include/_CJavaScriptKit.h

+10
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,16 @@ __attribute__((__import_module__("javascript_kit"),
255255
__import_name__("swjs_load_typed_array")))
256256
extern void _load_typed_array(const JavaScriptObjectRef ref, unsigned char *buffer);
257257

258+
/// Increments reference count of `ref` retained by `SwiftRuntimeHeap` in JavaScript side.
259+
///
260+
/// This is only necessary when copying a JavaScript object to a new JSObject.
261+
/// All swjs_* APIs return already-retained objects.
262+
///
263+
/// @param ref The target JavaScript object.
264+
__attribute__((__import_module__("javascript_kit"),
265+
__import_name__("swjs_retain")))
266+
extern void _retain(const JavaScriptObjectRef ref);
267+
258268
/// Decrements reference count of `ref` retained by `SwiftRuntimeHeap` in JavaScript side.
259269
///
260270
/// @param ref The target JavaScript object.

0 commit comments

Comments
 (0)