Skip to content

Commit e0daf8c

Browse files
Test roundtrip of Swift heap objects
1 parent c983d84 commit e0daf8c

File tree

5 files changed

+35
-2
lines changed

5 files changed

+35
-2
lines changed

Diff for: Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ struct BridgeJSLink {
322322
var dtsTypeLines: [String] = []
323323
var dtsExportEntryLines: [String] = []
324324

325-
dtsTypeLines.append("export interface \(klass.name) {")
325+
dtsTypeLines.append("export interface \(klass.name) extends SwiftHeapObject {")
326326
dtsExportEntryLines.append("\(klass.name): {")
327327
jsLines.append("class \(klass.name) extends SwiftHeapObject {")
328328

Diff for: Tests/BridgeJSRuntimeTests/ExportAPITests.swift

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ func runJsWorks() -> Void
2020
@JS func roundTripString(v: String) -> String {
2121
return v
2222
}
23+
@JS func roundTripSwiftHeapObject(v: Greeter) -> Greeter {
24+
return v
25+
}
2326

2427
@JS class Greeter {
2528
var name: String

Diff for: Tests/BridgeJSRuntimeTests/Generated/ExportSwift.swift

+7
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ public func _bjs_roundTripString(vBytes: Int32, vLen: Int32) -> Void {
4444
}
4545
}
4646
47+
@_expose(wasm, "bjs_roundTripSwiftHeapObject")
48+
@_cdecl("bjs_roundTripSwiftHeapObject")
49+
public func _bjs_roundTripSwiftHeapObject(v: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer {
50+
let ret = roundTripSwiftHeapObject(v: Unmanaged<Greeter>.fromOpaque(v).takeUnretainedValue())
51+
return Unmanaged.passRetained(ret).toOpaque()
52+
}
53+
4754
@_expose(wasm, "bjs_takeGreeter")
4855
@_cdecl("bjs_takeGreeter")
4956
public func _bjs_takeGreeter(g: UnsafeMutableRawPointer, nameBytes: Int32, nameLen: Int32) -> Void {

Diff for: Tests/BridgeJSRuntimeTests/Generated/JavaScript/ExportSwift.json

+20
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,26 @@
153153
}
154154
}
155155
},
156+
{
157+
"abiName" : "bjs_roundTripSwiftHeapObject",
158+
"name" : "roundTripSwiftHeapObject",
159+
"parameters" : [
160+
{
161+
"label" : "v",
162+
"name" : "v",
163+
"type" : {
164+
"swiftHeapObject" : {
165+
"_0" : "Greeter"
166+
}
167+
}
168+
}
169+
],
170+
"returnType" : {
171+
"swiftHeapObject" : {
172+
"_0" : "Greeter"
173+
}
174+
}
175+
},
156176
{
157177
"abiName" : "bjs_takeGreeter",
158178
"name" : "takeGreeter",

Diff for: Tests/prelude.mjs

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function setupOptions(options, context) {
2020

2121
import assert from "node:assert";
2222

23-
/** @param {import('./../.build/plugins/PackageToJS/outputs/PackageTests/bridge.d.ts').Export} exports */
23+
/** @param {import('./../.build/plugins/PackageToJS/outputs/PackageTests/bridge.d.ts').Exports} exports */
2424
function BridgeJSRuntimeTests_runJsWorks(instance, exports) {
2525
for (const v of [0, 1, -1, 2147483647, -2147483648]) {
2626
assert.equal(exports.roundTripInt(v), v);
@@ -58,6 +58,9 @@ function BridgeJSRuntimeTests_runJsWorks(instance, exports) {
5858
}
5959

6060
const g = new exports.Greeter("John");
61+
const g2 = exports.roundTripSwiftHeapObject(g)
62+
g2.release();
63+
6164
assert.equal(g.greet(), "Hello, John!");
6265
g.changeName("Jane");
6366
assert.equal(g.greet(), "Hello, Jane!");

0 commit comments

Comments
 (0)