Skip to content

Commit fecb9bf

Browse files
committed
BridgeJS: Lift struct method arguments before self
1 parent 991755e commit fecb9bf

8 files changed

Lines changed: 63 additions & 6 deletions

File tree

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ public class ExportSwift {
325325
}
326326

327327
func callMethod(methodName: String, returnType: BridgeType) {
328-
let (_, selfExpr) = removeFirstLiftedParameter()
329-
generateParameterLifting()
328+
let (selfParam, selfExpr) = removeFirstLiftedParameter()
329+
generateParameterLifting(selfUsesStack: selfParam.type.isStackUsingParameter)
330330
let item = renderCallStatement(
331331
callee: "\(raw: selfExpr).\(raw: methodName)",
332332
returnType: returnType
@@ -335,7 +335,7 @@ public class ExportSwift {
335335
}
336336

337337
/// Generates intermediate variables for stack-using parameters if needed for LIFO compatibility
338-
private func generateParameterLifting() {
338+
private func generateParameterLifting(selfUsesStack: Bool = false) {
339339
let stackParamIndices = parameters.enumerated().compactMap { index, param -> Int? in
340340
param.type.isStackUsingParameter ? index : nil
341341
}
@@ -356,7 +356,7 @@ public class ExportSwift {
356356
return
357357
}
358358

359-
guard stackParamIndices.count > 1 else { return }
359+
guard selfUsesStack || stackParamIndices.count > 1 else { return }
360360

361361
for index in stackParamIndices.reversed() {
362362
let param = parameters[index]

Plugins/BridgeJS/Tests/BridgeJSToolTests/Inputs/MacroSwift/SwiftStruct.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ extension Vector2D {
7878
@JS func describe() -> String {
7979
return "Vector2D(\(dx), \(dy))"
8080
}
81+
82+
@JS func dot(_ components: [Double]) -> Double {
83+
return zip([dx, dy], components).map(*).reduce(0, +)
84+
}
8185
}
8286

8387
extension DataPoint {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/SwiftStruct.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,35 @@
701701
"returnType" : {
702702
"string" : {
703703

704+
}
705+
}
706+
},
707+
{
708+
"abiName" : "bjs_Vector2D_dot",
709+
"effects" : {
710+
"isAsync" : false,
711+
"isStatic" : false,
712+
"isThrows" : false
713+
},
714+
"name" : "dot",
715+
"parameters" : [
716+
{
717+
"label" : "_",
718+
"name" : "components",
719+
"type" : {
720+
"array" : {
721+
"_0" : {
722+
"double" : {
723+
724+
}
725+
}
726+
}
727+
}
728+
}
729+
],
730+
"returnType" : {
731+
"double" : {
732+
704733
}
705734
}
706735
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/SwiftStruct.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,18 @@ public func _bjs_Vector2D_describe() -> Void {
536536
#endif
537537
}
538538

539+
@_expose(wasm, "bjs_Vector2D_dot")
540+
@_cdecl("bjs_Vector2D_dot")
541+
public func _bjs_Vector2D_dot() -> Float64 {
542+
#if arch(wasm32)
543+
let _tmp_components = [Double].bridgeJSStackPop()
544+
let ret = Vector2D.bridgeJSLiftParameter().dot(_: _tmp_components)
545+
return ret.bridgeJSLowerReturn()
546+
#else
547+
fatalError("Only available on WebAssembly")
548+
#endif
549+
}
550+
539551
@_expose(wasm, "bjs_roundtrip")
540552
@_cdecl("bjs_roundtrip")
541553
public func _bjs_roundtrip() -> Void {

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/SwiftStruct.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export interface Vector2D {
4949
magnitude(): number;
5050
scaled(factor: number): Vector2D;
5151
describe(): string;
52+
dot(components: number[]): number;
5253
}
5354
export type PrecisionObject = typeof PrecisionValues;
5455

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/SwiftStruct.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ export async function createInstantiator(options, swift) {
385385
},
386386
};
387387
const __bjs_codec_Optional_JSObject = __bjs_optionalCodec(__bjs_codec_JSObject);
388+
const __bjs_codec_Array_Double = __bjs_arrayCodec(__bjs_primitiveCodecs.Double);
388389

389390
const __bjs_createStructHelpers_M10TestModuleT9DataPoint = () => ({
390391
lower: (value) => {
@@ -526,6 +527,12 @@ export async function createInstantiator(options, swift) {
526527
tmpRetString = undefined;
527528
return ret3;
528529
}.bind(instance1);
530+
instance1.dot = function(components) {
531+
structHelpers.M10TestModuleT8Vector2D.lower(this);
532+
__bjs_codec_Array_Double.lower(components);
533+
const ret4 = instance.exports.bjs_Vector2D_dot();
534+
return ret4;
535+
}.bind(instance1);
529536
return instance1;
530537
}
531538
});

Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8385,7 +8385,8 @@ fileprivate func _bjs_struct_lift_ArrayMembers_extern() -> Int32 {
83858385
@_cdecl("bjs_ArrayMembers_sumValues")
83868386
public func _bjs_ArrayMembers_sumValues() -> Int32 {
83878387
#if arch(wasm32)
8388-
let ret = ArrayMembers.bridgeJSLiftParameter().sumValues(_: [Int].bridgeJSStackPop())
8388+
let _tmp_values = [Int].bridgeJSStackPop()
8389+
let ret = ArrayMembers.bridgeJSLiftParameter().sumValues(_: _tmp_values)
83898390
return ret.bridgeJSLowerReturn()
83908391
#else
83918392
fatalError("Only available on WebAssembly")
@@ -8396,7 +8397,8 @@ public func _bjs_ArrayMembers_sumValues() -> Int32 {
83968397
@_cdecl("bjs_ArrayMembers_firstString")
83978398
public func _bjs_ArrayMembers_firstString() -> Void {
83988399
#if arch(wasm32)
8399-
let ret = ArrayMembers.bridgeJSLiftParameter().firstString(_: [String].bridgeJSStackPop())
8400+
let _tmp_values = [String].bridgeJSStackPop()
8401+
let ret = ArrayMembers.bridgeJSLiftParameter().firstString(_: _tmp_values)
84008402
return ret.bridgeJSLowerReturn()
84018403
#else
84028404
fatalError("Only available on WebAssembly")

Tests/prelude.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ function BridgeJSRuntimeTests_runJsWorks(instance, exports) {
301301
assert.deepEqual(arrayStructRoundTrip.optStrings, ["a", "b"]);
302302
assert.equal(exports.arrayMembersSum(arrayStruct, [10, 20]), 30);
303303
assert.equal(exports.arrayMembersFirst(arrayStruct, ["x", "y"]), "x");
304+
assert.equal(arrayStructRoundTrip.sumValues([10, 20]), 30);
305+
assert.equal(arrayStructRoundTrip.firstString(["x", "y"]), "x");
304306
const jsValueArray = [true, 42, "ok", { nested: 1 }, null, undefined];
305307
assert.deepEqual(exports.roundTripOptionalJSValueArray(jsValueArray), jsValueArray);
306308
assert.equal(exports.roundTripOptionalJSValueArray(null), null);

0 commit comments

Comments
 (0)