Skip to content

Commit c983d84

Browse files
Test passing Swift heap object to exported function
1 parent d8d7f7e commit c983d84

File tree

5 files changed

+57
-11
lines changed

5 files changed

+57
-11
lines changed

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

+13-8
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,11 @@ struct BridgeJSLink {
212212
var cleanupLines: [String] = []
213213
var parameterForwardings: [String] = []
214214

215-
func liftParameter(param: Parameter) {
215+
func lowerParameter(param: Parameter) {
216216
switch param.type {
217+
case .void: return
218+
case .int, .float, .double, .bool:
219+
parameterForwardings.append(param.name)
217220
case .string:
218221
let bytesLabel = "\(param.name)Bytes"
219222
let bytesIdLabel = "\(param.name)Id"
@@ -222,12 +225,14 @@ struct BridgeJSLink {
222225
cleanupLines.append("swift.memory.release(\(bytesIdLabel));")
223226
parameterForwardings.append(bytesIdLabel)
224227
parameterForwardings.append("\(bytesLabel).length")
225-
default:
226-
parameterForwardings.append(param.name)
228+
case .jsObject:
229+
parameterForwardings.append("swift.memory.retain(\(param.name))")
230+
case .swiftHeapObject:
231+
parameterForwardings.append("\(param.name).pointer")
227232
}
228233
}
229234

230-
func liftSelf() {
235+
func lowerSelf() {
231236
parameterForwardings.append("this.pointer")
232237
}
233238

@@ -294,7 +299,7 @@ struct BridgeJSLink {
294299
func renderExportedFunction(function: ExportedFunction) -> (js: [String], dts: [String]) {
295300
let thunkBuilder = ExportedThunkBuilder()
296301
for param in function.parameters {
297-
thunkBuilder.liftParameter(param: param)
302+
thunkBuilder.lowerParameter(param: param)
298303
}
299304
let returnExpr = thunkBuilder.call(abiName: function.abiName, returnType: function.returnType)
300305
let funcLines = thunkBuilder.renderFunction(
@@ -324,7 +329,7 @@ struct BridgeJSLink {
324329
if let constructor: ExportedConstructor = klass.constructor {
325330
let thunkBuilder = ExportedThunkBuilder()
326331
for param in constructor.parameters {
327-
thunkBuilder.liftParameter(param: param)
332+
thunkBuilder.lowerParameter(param: param)
328333
}
329334
let returnExpr = thunkBuilder.callConstructor(abiName: constructor.abiName)
330335
var funcLines: [String] = []
@@ -343,9 +348,9 @@ struct BridgeJSLink {
343348

344349
for method in klass.methods {
345350
let thunkBuilder = ExportedThunkBuilder()
346-
thunkBuilder.liftSelf()
351+
thunkBuilder.lowerSelf()
347352
for param in method.parameters {
348-
thunkBuilder.liftParameter(param: param)
353+
thunkBuilder.lowerParameter(param: param)
349354
}
350355
let returnExpr = thunkBuilder.call(abiName: method.abiName, returnType: method.returnType)
351356
jsLines.append(

Diff for: Tests/BridgeJSRuntimeTests/ExportAPITests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ func runJsWorks() -> Void
4242
}
4343
}
4444

45-
// @JS func takeGreeter(g: Greeter) {
46-
// g.changeName(name: "World")
47-
// }
45+
@JS func takeGreeter(g: Greeter, name: String) {
46+
g.changeName(name: name)
47+
}
4848

4949
class ExportAPITests: XCTestCase {
5050
func testAll() {

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

+10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ public func _bjs_roundTripString(vBytes: Int32, vLen: Int32) -> Void {
4444
}
4545
}
4646
47+
@_expose(wasm, "bjs_takeGreeter")
48+
@_cdecl("bjs_takeGreeter")
49+
public func _bjs_takeGreeter(g: UnsafeMutableRawPointer, nameBytes: Int32, nameLen: Int32) -> Void {
50+
let name = String(unsafeUninitializedCapacity: Int(nameLen)) { b in
51+
_init_memory(nameBytes, b.baseAddress.unsafelyUnwrapped)
52+
return Int(nameLen)
53+
}
54+
takeGreeter(g: Unmanaged<Greeter>.fromOpaque(g).takeUnretainedValue(), name: name)
55+
}
56+
4757
@_expose(wasm, "bjs_Greeter_init")
4858
@_cdecl("bjs_Greeter_init")
4959
public func _bjs_Greeter_init(nameBytes: Int32, nameLen: Int32) -> UnsafeMutableRawPointer {

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

+29
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,35 @@
150150
"returnType" : {
151151
"string" : {
152152

153+
}
154+
}
155+
},
156+
{
157+
"abiName" : "bjs_takeGreeter",
158+
"name" : "takeGreeter",
159+
"parameters" : [
160+
{
161+
"label" : "g",
162+
"name" : "g",
163+
"type" : {
164+
"swiftHeapObject" : {
165+
"_0" : "Greeter"
166+
}
167+
}
168+
},
169+
{
170+
"label" : "name",
171+
"name" : "name",
172+
"type" : {
173+
"string" : {
174+
175+
}
176+
}
177+
}
178+
],
179+
"returnType" : {
180+
"void" : {
181+
153182
}
154183
}
155184
}

Diff for: Tests/prelude.mjs

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ function BridgeJSRuntimeTests_runJsWorks(instance, exports) {
6161
assert.equal(g.greet(), "Hello, John!");
6262
g.changeName("Jane");
6363
assert.equal(g.greet(), "Hello, Jane!");
64+
exports.takeGreeter(g, "Jay");
65+
assert.equal(g.greet(), "Hello, Jay!");
6466
g.release();
6567
}
6668

0 commit comments

Comments
 (0)