Skip to content

Commit b5d873c

Browse files
committed
Merge branch 'main' into extensions
2 parents f0b8652 + 6aebd3b commit b5d873c

File tree

69 files changed

+1173
-885
lines changed

Some content is hidden

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

69 files changed

+1173
-885
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: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,19 @@ public class ExportSwift {
319319
func render(abiName: String) -> DeclSyntax {
320320
let body: CodeBlockItemListSyntax
321321
if effects.isAsync {
322+
// Explicit closure type annotation needed when throws is present
323+
// so Swift infers throws(JSException) instead of throws(any Error)
324+
// See: https://github.com/swiftlang/swift/issues/76165
325+
let closureHead: String
326+
if effects.isThrows {
327+
let hasReturn = self.body.contains { $0.description.contains("return ") }
328+
let ret = hasReturn ? " -> JSValue" : ""
329+
closureHead = " () async throws(JSException)\(ret) in"
330+
} else {
331+
closureHead = ""
332+
}
322333
body = """
323-
let ret = JSPromise.async {
334+
let ret = JSPromise.async {\(raw: closureHead)
324335
\(CodeBlockItemListSyntax(self.body))
325336
}.jsObject
326337
return ret.bridgeJSLowerReturn()
@@ -1166,17 +1177,18 @@ struct ProtocolCodegen {
11661177
var externDecls: [DeclSyntax] = []
11671178

11681179
for method in proto.methods {
1169-
let builder = ImportTS.CallJSEmission(
1180+
let builder = try ImportTS.CallJSEmission(
11701181
moduleName: moduleName,
11711182
abiName: "_extern_\(method.name)",
1183+
returnType: method.returnType,
11721184
context: .exportSwift
11731185
)
11741186
try builder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
11751187
for param in method.parameters {
11761188
try builder.lowerParameter(param: param)
11771189
}
1178-
try builder.call(returnType: method.returnType)
1179-
try builder.liftReturnValue(returnType: method.returnType)
1190+
try builder.call()
1191+
try builder.liftReturnValue()
11801192

11811193
// Build function signature using SwiftSignatureBuilder
11821194
let signature = SwiftSignatureBuilder.buildFunctionSignature(
@@ -1264,14 +1276,15 @@ struct ProtocolCodegen {
12641276
className: protocolName
12651277
)
12661278

1267-
let getterBuilder = ImportTS.CallJSEmission(
1279+
let getterBuilder = try ImportTS.CallJSEmission(
12681280
moduleName: moduleName,
12691281
abiName: getterAbiName,
1282+
returnType: property.type,
12701283
context: .exportSwift
12711284
)
12721285
try getterBuilder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
1273-
try getterBuilder.call(returnType: property.type)
1274-
try getterBuilder.liftReturnValue(returnType: property.type)
1286+
try getterBuilder.call()
1287+
try getterBuilder.liftReturnValue()
12751288

12761289
// Build getter extern declaration using helper function
12771290
let getterExternDeclPrinter = CodeFragmentPrinter()
@@ -1296,14 +1309,15 @@ struct ProtocolCodegen {
12961309

12971310
if property.isReadonly { return }
12981311

1299-
let setterBuilder = ImportTS.CallJSEmission(
1312+
let setterBuilder = try ImportTS.CallJSEmission(
13001313
moduleName: moduleName,
13011314
abiName: setterAbiName,
1315+
returnType: .void,
13021316
context: .exportSwift
13031317
)
13041318
try setterBuilder.lowerParameter(param: Parameter(label: nil, name: "jsObject", type: .jsObject(nil)))
13051319
try setterBuilder.lowerParameter(param: Parameter(label: nil, name: "newValue", type: property.type))
1306-
try setterBuilder.call(returnType: .void)
1320+
try setterBuilder.call()
13071321

13081322
// Build setter extern declaration using helper function
13091323
let setterExternDeclPrinter = CodeFragmentPrinter()

0 commit comments

Comments
 (0)