Skip to content

Commit 3d25cd9

Browse files
[BridgeJS] Pass String parameters unretained as (address, length) (#688)
* pass unretained strings as tuple * Generalize lowering parameters with borrowing scope * factored out decodeString global * formatting * format (with Swift 6.2) --------- Co-authored-by: Yuta Saito <yuta@goodnotes.com>
1 parent bc05d2a commit 3d25cd9

Some content is hidden

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

59 files changed

+1000
-880
lines changed

Benchmarks/Sources/Generated/BridgeJS.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,20 +1750,21 @@ func _$benchmarkHelperNoopWithNumber(_ n: Double) throws(JSException) -> Void {
17501750

17511751
#if arch(wasm32)
17521752
@_extern(wasm, module: "Benchmarks", name: "bjs_benchmarkRunner")
1753-
fileprivate func bjs_benchmarkRunner_extern(_ name: Int32, _ body: Int32) -> Void
1753+
fileprivate func bjs_benchmarkRunner_extern(_ nameBytes: Int32, _ nameLength: Int32, _ body: Int32) -> Void
17541754
#else
1755-
fileprivate func bjs_benchmarkRunner_extern(_ name: Int32, _ body: Int32) -> Void {
1755+
fileprivate func bjs_benchmarkRunner_extern(_ nameBytes: Int32, _ nameLength: Int32, _ body: Int32) -> Void {
17561756
fatalError("Only available on WebAssembly")
17571757
}
17581758
#endif
1759-
@inline(never) fileprivate func bjs_benchmarkRunner(_ name: Int32, _ body: Int32) -> Void {
1760-
return bjs_benchmarkRunner_extern(name, body)
1759+
@inline(never) fileprivate func bjs_benchmarkRunner(_ nameBytes: Int32, _ nameLength: Int32, _ body: Int32) -> Void {
1760+
return bjs_benchmarkRunner_extern(nameBytes, nameLength, body)
17611761
}
17621762

17631763
func _$benchmarkRunner(_ name: String, _ body: JSObject) throws(JSException) -> Void {
1764-
let nameValue = name.bridgeJSLowerParameter()
1765-
let bodyValue = body.bridgeJSLowerParameter()
1766-
bjs_benchmarkRunner(nameValue, bodyValue)
1764+
name.bridgeJSWithLoweredParameter { (nameBytes, nameLength) in
1765+
let bodyValue = body.bridgeJSLowerParameter()
1766+
bjs_benchmarkRunner(nameBytes, nameLength, bodyValue)
1767+
}
17671768
if let error = _swift_js_take_exception() {
17681769
throw error
17691770
}

Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/BridgeJS.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -249,20 +249,23 @@ func _$createTS2Swift() throws(JSException) -> TS2Swift {
249249

250250
#if arch(wasm32)
251251
@_extern(wasm, module: "PlayBridgeJS", name: "bjs_TS2Swift_convert")
252-
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ ts: Int32) -> Int32
252+
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ tsBytes: Int32, _ tsLength: Int32) -> Int32
253253
#else
254-
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ ts: Int32) -> Int32 {
254+
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ tsBytes: Int32, _ tsLength: Int32) -> Int32 {
255255
fatalError("Only available on WebAssembly")
256256
}
257257
#endif
258-
@inline(never) fileprivate func bjs_TS2Swift_convert(_ self: Int32, _ ts: Int32) -> Int32 {
259-
return bjs_TS2Swift_convert_extern(self, ts)
258+
@inline(never) fileprivate func bjs_TS2Swift_convert(_ self: Int32, _ tsBytes: Int32, _ tsLength: Int32) -> Int32 {
259+
return bjs_TS2Swift_convert_extern(self, tsBytes, tsLength)
260260
}
261261

262262
func _$TS2Swift_convert(_ self: JSObject, _ ts: String) throws(JSException) -> String {
263263
let selfValue = self.bridgeJSLowerParameter()
264-
let tsValue = ts.bridgeJSLowerParameter()
265-
let ret = bjs_TS2Swift_convert(selfValue, tsValue)
264+
let ret0 = ts.bridgeJSWithLoweredParameter { (tsBytes, tsLength) in
265+
let ret = bjs_TS2Swift_convert(selfValue, tsBytes, tsLength)
266+
return ret
267+
}
268+
let ret = ret0
266269
if let error = _swift_js_take_exception() {
267270
throw error
268271
}

Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ public struct ClosureCodegen {
2626
let externName = "invoke_js_callback_\(signature.moduleName)_\(mangledName)"
2727

2828
// Use CallJSEmission to generate the callback invocation
29-
let builder = ImportTS.CallJSEmission(
29+
let builder = try ImportTS.CallJSEmission(
3030
moduleName: "bjs",
3131
abiName: externName,
32+
returnType: signature.returnType,
3233
context: .exportSwift
3334
)
3435

@@ -41,8 +42,8 @@ public struct ClosureCodegen {
4142
}
4243

4344
// Generate the call and return value lifting
44-
try builder.call(returnType: signature.returnType)
45-
try builder.liftReturnValue(returnType: signature.returnType)
45+
try builder.call()
46+
try builder.liftReturnValue()
4647

4748
// Generate extern declaration using CallJSEmission
4849
let externDecl = builder.renderImportDecl()

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,17 +1177,18 @@ struct ProtocolCodegen {
11771177
var externDecls: [DeclSyntax] = []
11781178

11791179
for method in proto.methods {
1180-
let builder = ImportTS.CallJSEmission(
1180+
let builder = try ImportTS.CallJSEmission(
11811181
moduleName: moduleName,
11821182
abiName: "_extern_\(method.name)",
1183+
returnType: method.returnType,
11831184
context: .exportSwift
11841185
)
11851186
try builder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
11861187
for param in method.parameters {
11871188
try builder.lowerParameter(param: param)
11881189
}
1189-
try builder.call(returnType: method.returnType)
1190-
try builder.liftReturnValue(returnType: method.returnType)
1190+
try builder.call()
1191+
try builder.liftReturnValue()
11911192

11921193
// Build function signature using SwiftSignatureBuilder
11931194
let signature = SwiftSignatureBuilder.buildFunctionSignature(
@@ -1275,14 +1276,15 @@ struct ProtocolCodegen {
12751276
className: protocolName
12761277
)
12771278

1278-
let getterBuilder = ImportTS.CallJSEmission(
1279+
let getterBuilder = try ImportTS.CallJSEmission(
12791280
moduleName: moduleName,
12801281
abiName: getterAbiName,
1282+
returnType: property.type,
12811283
context: .exportSwift
12821284
)
12831285
try getterBuilder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
1284-
try getterBuilder.call(returnType: property.type)
1285-
try getterBuilder.liftReturnValue(returnType: property.type)
1286+
try getterBuilder.call()
1287+
try getterBuilder.liftReturnValue()
12861288

12871289
// Build getter extern declaration using helper function
12881290
let getterExternDeclPrinter = CodeFragmentPrinter()
@@ -1307,14 +1309,15 @@ struct ProtocolCodegen {
13071309

13081310
if property.isReadonly { return }
13091311

1310-
let setterBuilder = ImportTS.CallJSEmission(
1312+
let setterBuilder = try ImportTS.CallJSEmission(
13111313
moduleName: moduleName,
13121314
abiName: setterAbiName,
1315+
returnType: .void,
13131316
context: .exportSwift
13141317
)
13151318
try setterBuilder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
13161319
try setterBuilder.lowerParameter(param: Parameter(label: nil, name: "newValue", type: property.type))
1317-
try setterBuilder.call(returnType: .void)
1320+
try setterBuilder.call()
13181321

13191322
// Build setter extern declaration using helper function
13201323
let setterExternDeclPrinter = CodeFragmentPrinter()

0 commit comments

Comments
 (0)