Skip to content

Commit 3bf63a1

Browse files
BridgeJS: Add support for JSObject in exported Swift interface
1 parent 4a3cbb1 commit 3bf63a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+208
-39
lines changed

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ struct BridgeJSLink {
134134
target.set(tmpRetBytes);
135135
tmpRetBytes = undefined;
136136
}
137+
bjs["swift_js_retain"] = function(id) {
138+
return swift.memory.retainByRef(id);
139+
}
140+
bjs["swift_js_release"] = function(id) {
141+
swift.memory.release(id);
142+
}
137143
\(importObjectBuilders.flatMap { $0.importedLines }.map { $0.indent(count: 12) }.joined(separator: "\n"))
138144
},
139145
setInstance: (i) => {

Plugins/BridgeJS/Sources/BridgeJSTool/ExportSwift.swift

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,9 @@ class ExportSwift {
221221
return nil
222222
}
223223
guard let typeDecl = typeDeclResolver.lookupType(for: identifier) else {
224-
print("Failed to lookup type \(type.trimmedDescription): not found in typeDeclResolver")
225224
return nil
226225
}
227226
guard typeDecl.is(ClassDeclSyntax.self) || typeDecl.is(ActorDeclSyntax.self) else {
228-
print("Failed to lookup type \(type.trimmedDescription): is not a class or actor")
229227
return nil
230228
}
231229
return .swiftHeapObject(typeDecl.name.text)
@@ -237,10 +235,16 @@ class ExportSwift {
237235
//
238236
// To update this file, just rebuild your project or run
239237
// `swift package bridge-js`.
238+
239+
@_spi(JSObject_id) import JavaScriptKit
240+
240241
@_extern(wasm, module: "bjs", name: "return_string")
241242
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
242243
@_extern(wasm, module: "bjs", name: "init_memory")
243244
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
245+
246+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
247+
private func _swift_js_retain(_ ptr: Int32) -> Int32
244248
"""
245249

246250
func renderSwiftGlue() -> String? {
@@ -317,11 +321,19 @@ class ExportSwift {
317321
)
318322
abiParameterSignatures.append((bytesLabel, .i32))
319323
abiParameterSignatures.append((lengthLabel, .i32))
320-
case .jsObject:
324+
case .jsObject(nil):
321325
abiParameterForwardings.append(
322326
LabeledExprSyntax(
323327
label: param.label,
324-
expression: ExprSyntax("\(raw: param.name)")
328+
expression: ExprSyntax("JSObject(id: UInt32(bitPattern: \(raw: param.name)))")
329+
)
330+
)
331+
abiParameterSignatures.append((param.name, .i32))
332+
case .jsObject(let name):
333+
abiParameterForwardings.append(
334+
LabeledExprSyntax(
335+
label: param.label,
336+
expression: ExprSyntax("\(raw: name)(takingThis: UInt32(bitPattern: \(raw: param.name)))")
325337
)
326338
)
327339
abiParameterSignatures.append((param.name, .i32))
@@ -404,10 +416,16 @@ class ExportSwift {
404416
}
405417
"""
406418
)
407-
case .jsObject:
419+
case .jsObject(nil):
420+
body.append(
421+
"""
422+
return _swift_js_retain(Int32(bitPattern: ret.id))
423+
"""
424+
)
425+
case .jsObject(_?):
408426
body.append(
409427
"""
410-
return ret.id
428+
return _swift_js_retain(Int32(bitPattern: ret.this.id))
411429
"""
412430
)
413431
case .swiftHeapObject:
@@ -566,6 +584,8 @@ extension BridgeType {
566584
self = .bool
567585
case "Void":
568586
self = .void
587+
case "JSObject":
588+
self = .jsObject(nil)
569589
default:
570590
return nil
571591
}

Plugins/BridgeJS/Sources/BridgeJSTool/ImportTS.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,6 @@ struct ImportTS {
333333
334334
@_extern(wasm, module: "bjs", name: "init_memory_with_result")
335335
private func _init_memory_with_result(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
336-
337-
@_extern(wasm, module: "bjs", name: "free_jsobject")
338-
private func _free_jsobject(_ ptr: Int32) -> Void
339336
"""
340337

341338
func renderSwiftThunk(

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/ArrayParameter.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkArray"] = function bjs_checkArray(a) {
4046
options.imports.checkArray(swift.memory.getObject(a));

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/Interface.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_returnAnimatable"] = function bjs_returnAnimatable() {
4046
let ret = options.imports.returnAnimatable();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_check"] = function bjs_check(a, b) {
4046
options.imports.check(a, b);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkNumber"] = function bjs_checkNumber() {
4046
let ret = options.imports.checkNumber();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringParameter.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringParameter.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkString"] = function bjs_checkString(a) {
4046
const aObject = swift.memory.getObject(a);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/StringReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkString"] = function bjs_checkString() {
4046
let ret = options.imports.checkString();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/SwiftClass.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/TypeAlias.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_checkSimple"] = function bjs_checkSimple(a) {
4046
options.imports.checkSimple(a);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/TypeScriptClass.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_Greeter_init"] = function bjs_Greeter_init(name) {
4046
const nameObject = swift.memory.getObject(name);

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/VoidParameterVoidReturn.Export.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844

3945
},
4046
setInstance: (i) => {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/VoidParameterVoidReturn.Import.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export async function createInstantiator(options, swift) {
3535
target.set(tmpRetBytes);
3636
tmpRetBytes = undefined;
3737
}
38+
bjs["swift_js_retain"] = function(id) {
39+
return swift.memory.retainByRef(id);
40+
}
41+
bjs["swift_js_release"] = function(id) {
42+
swift.memory.release(id);
43+
}
3844
const TestModule = importObject["TestModule"] = {};
3945
TestModule["bjs_check"] = function bjs_check() {
4046
options.imports.check();

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/PrimitiveParameters.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_check")
1218
@_cdecl("bjs_check")
1319
public func _bjs_check(a: Int32, b: Float32, c: Float64, d: Int32) -> Void {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/PrimitiveReturn.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_checkInt")
1218
@_cdecl("bjs_checkInt")
1319
public func _bjs_checkInt() -> Int32 {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/StringParameter.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_checkString")
1218
@_cdecl("bjs_checkString")
1319
public func _bjs_checkString(aBytes: Int32, aLen: Int32) -> Void {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/StringReturn.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_checkString")
1218
@_cdecl("bjs_checkString")
1319
public func _bjs_checkString() -> Void {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/SwiftClass.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
//
44
// To update this file, just rebuild your project or run
55
// `swift package bridge-js`.
6+
7+
@_spi(JSObject_id) import JavaScriptKit
8+
69
@_extern(wasm, module: "bjs", name: "return_string")
710
private func _return_string(_ ptr: UnsafePointer<UInt8>?, _ len: Int32)
811
@_extern(wasm, module: "bjs", name: "init_memory")
912
private func _init_memory(_ sourceId: Int32, _ ptr: UnsafeMutablePointer<UInt8>?)
1013
14+
@_extern(wasm, module: "bjs", name: "swift_js_retain")
15+
private func _swift_js_retain(_ ptr: Int32) -> Int32
16+
1117
@_expose(wasm, "bjs_takeGreeter")
1218
@_cdecl("bjs_takeGreeter")
1319
public func _bjs_takeGreeter(greeter: UnsafeMutableRawPointer) -> Void {

0 commit comments

Comments
 (0)