Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 110 additions & 44 deletions Benchmarks/Sources/Generated/BridgeJS.swift

Large diffs are not rendered by default.

63 changes: 45 additions & 18 deletions Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/BridgeJS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,27 @@ extension PlayBridgeJSOutput: _BridgedSwiftStruct {

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lower_PlayBridgeJSOutput")
fileprivate func _bjs_struct_lower_PlayBridgeJSOutput(_ objectId: Int32) -> Void
fileprivate func _bjs_struct_lower_PlayBridgeJSOutput_extern(_ objectId: Int32) -> Void
#else
fileprivate func _bjs_struct_lower_PlayBridgeJSOutput(_ objectId: Int32) -> Void {
fileprivate func _bjs_struct_lower_PlayBridgeJSOutput_extern(_ objectId: Int32) -> Void {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lower_PlayBridgeJSOutput(_ objectId: Int32) -> Void {
return _bjs_struct_lower_PlayBridgeJSOutput_extern(objectId)
}

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lift_PlayBridgeJSOutput")
fileprivate func _bjs_struct_lift_PlayBridgeJSOutput() -> Int32
fileprivate func _bjs_struct_lift_PlayBridgeJSOutput_extern() -> Int32
#else
fileprivate func _bjs_struct_lift_PlayBridgeJSOutput() -> Int32 {
fileprivate func _bjs_struct_lift_PlayBridgeJSOutput_extern() -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lift_PlayBridgeJSOutput() -> Int32 {
return _bjs_struct_lift_PlayBridgeJSOutput_extern()
}

extension PlayBridgeJSDiagnostic: _BridgedSwiftStruct {
@_spi(BridgeJS) @_transparent public static func bridgeJSStackPop() -> PlayBridgeJSDiagnostic {
Expand Down Expand Up @@ -87,21 +93,27 @@ extension PlayBridgeJSDiagnostic: _BridgedSwiftStruct {

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lower_PlayBridgeJSDiagnostic")
fileprivate func _bjs_struct_lower_PlayBridgeJSDiagnostic(_ objectId: Int32) -> Void
fileprivate func _bjs_struct_lower_PlayBridgeJSDiagnostic_extern(_ objectId: Int32) -> Void
#else
fileprivate func _bjs_struct_lower_PlayBridgeJSDiagnostic(_ objectId: Int32) -> Void {
fileprivate func _bjs_struct_lower_PlayBridgeJSDiagnostic_extern(_ objectId: Int32) -> Void {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lower_PlayBridgeJSDiagnostic(_ objectId: Int32) -> Void {
return _bjs_struct_lower_PlayBridgeJSDiagnostic_extern(objectId)
}

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lift_PlayBridgeJSDiagnostic")
fileprivate func _bjs_struct_lift_PlayBridgeJSDiagnostic() -> Int32
fileprivate func _bjs_struct_lift_PlayBridgeJSDiagnostic_extern() -> Int32
#else
fileprivate func _bjs_struct_lift_PlayBridgeJSDiagnostic() -> Int32 {
fileprivate func _bjs_struct_lift_PlayBridgeJSDiagnostic_extern() -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lift_PlayBridgeJSDiagnostic() -> Int32 {
return _bjs_struct_lift_PlayBridgeJSDiagnostic_extern()
}

extension PlayBridgeJSResult: _BridgedSwiftStruct {
@_spi(BridgeJS) @_transparent public static func bridgeJSStackPop() -> PlayBridgeJSResult {
Expand Down Expand Up @@ -129,21 +141,27 @@ extension PlayBridgeJSResult: _BridgedSwiftStruct {

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lower_PlayBridgeJSResult")
fileprivate func _bjs_struct_lower_PlayBridgeJSResult(_ objectId: Int32) -> Void
fileprivate func _bjs_struct_lower_PlayBridgeJSResult_extern(_ objectId: Int32) -> Void
#else
fileprivate func _bjs_struct_lower_PlayBridgeJSResult(_ objectId: Int32) -> Void {
fileprivate func _bjs_struct_lower_PlayBridgeJSResult_extern(_ objectId: Int32) -> Void {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lower_PlayBridgeJSResult(_ objectId: Int32) -> Void {
return _bjs_struct_lower_PlayBridgeJSResult_extern(objectId)
}

#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "swift_js_struct_lift_PlayBridgeJSResult")
fileprivate func _bjs_struct_lift_PlayBridgeJSResult() -> Int32
fileprivate func _bjs_struct_lift_PlayBridgeJSResult_extern() -> Int32
#else
fileprivate func _bjs_struct_lift_PlayBridgeJSResult() -> Int32 {
fileprivate func _bjs_struct_lift_PlayBridgeJSResult_extern() -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_struct_lift_PlayBridgeJSResult() -> Int32 {
return _bjs_struct_lift_PlayBridgeJSResult_extern()
}

@_expose(wasm, "bjs_PlayBridgeJS_init")
@_cdecl("bjs_PlayBridgeJS_init")
Expand Down Expand Up @@ -199,21 +217,27 @@ extension PlayBridgeJS: ConvertibleToJSValue, _BridgedSwiftHeapObject {

#if arch(wasm32)
@_extern(wasm, module: "PlayBridgeJS", name: "bjs_PlayBridgeJS_wrap")
fileprivate func _bjs_PlayBridgeJS_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32
fileprivate func _bjs_PlayBridgeJS_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32
#else
fileprivate func _bjs_PlayBridgeJS_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32 {
fileprivate func _bjs_PlayBridgeJS_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func _bjs_PlayBridgeJS_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32 {
return _bjs_PlayBridgeJS_wrap_extern(pointer)
}

#if arch(wasm32)
@_extern(wasm, module: "PlayBridgeJS", name: "bjs_createTS2Swift")
fileprivate func bjs_createTS2Swift() -> Int32
fileprivate func bjs_createTS2Swift_extern() -> Int32
#else
fileprivate func bjs_createTS2Swift() -> Int32 {
fileprivate func bjs_createTS2Swift_extern() -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func bjs_createTS2Swift() -> Int32 {
return bjs_createTS2Swift_extern()
}

func _$createTS2Swift() throws(JSException) -> TS2Swift {
let ret = bjs_createTS2Swift()
Expand All @@ -225,12 +249,15 @@ func _$createTS2Swift() throws(JSException) -> TS2Swift {

#if arch(wasm32)
@_extern(wasm, module: "PlayBridgeJS", name: "bjs_TS2Swift_convert")
fileprivate func bjs_TS2Swift_convert(_ self: Int32, _ ts: Int32) -> Int32
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ ts: Int32) -> Int32
#else
fileprivate func bjs_TS2Swift_convert(_ self: Int32, _ ts: Int32) -> Int32 {
fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ ts: Int32) -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
@inline(never) fileprivate func bjs_TS2Swift_convert(_ self: Int32, _ ts: Int32) -> Int32 {
return bjs_TS2Swift_convert_extern(self, ts)
}

func _$TS2Swift_convert(_ self: JSObject, _ ts: String) throws(JSException) -> String {
let selfValue = self.bridgeJSLowerParameter()
Expand Down
24 changes: 12 additions & 12 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,17 @@ public struct ClosureCodegen {

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

let makeClosureExternDecl: DeclSyntax = """
#if arch(wasm32)
@_extern(wasm, module: "bjs", name: "make_swift_closure_\(raw: signature.moduleName)_\(raw: signature.mangleName)")
fileprivate func make_swift_closure_\(raw: signature.moduleName)_\(raw: signature.mangleName)(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32
#else
fileprivate func make_swift_closure_\(raw: signature.moduleName)_\(raw: signature.mangleName)(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32 {
fatalError("Only available on WebAssembly")
}
#endif
"""
let externABIName = "make_swift_closure_\(signature.moduleName)_\(signature.mangleName)"
let externDeclPrinter = CodeFragmentPrinter()
SwiftCodePattern.buildExternFunctionDecl(
printer: externDeclPrinter,
moduleName: "bjs",
abiName: externABIName,
functionName: externABIName,
signature: "(_ boxPtr: UnsafeMutableRawPointer, _ file: UnsafePointer<UInt8>, _ line: UInt32) -> Int32",
parameterNames: ["boxPtr", "file", "line"]
)
let makeClosureExternDecl: DeclSyntax = "\(raw: externDeclPrinter.lines.joined(separator: "\n"))"

let helperEnumDeclPrinter = CodeFragmentPrinter()
helperEnumDeclPrinter.write("private enum \(helperName) {")
Expand Down Expand Up @@ -98,7 +98,7 @@ public struct ClosureCodegen {
extension JSTypedClosure where Signature == \(raw: swiftClosureType) {
init(fileID: StaticString = #fileID, line: UInt32 = #line, _ body: @escaping \(raw: swiftClosureType)) {
self.init(
makeClosure: make_swift_closure_\(raw: signature.moduleName)_\(raw: signature.mangleName),
makeClosure: \(raw: externABIName),
body: body,
fileID: fileID,
line: line
Expand Down
102 changes: 22 additions & 80 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -695,32 +695,14 @@ public class ExportSwift {
}
"""
// Build common function signature
let funcSignature = SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: [("pointer", .pointer)],
returnType: .i32
)

let externDeclPrinter = CodeFragmentPrinter()
SwiftCodePattern.buildWasmConditionalCompilationDecls(
SwiftCodePattern.buildExternFunctionDecl(
printer: externDeclPrinter,
wasmDecl: { printer in
SwiftCodePattern.buildExternFunctionDecl(
printer: printer,
moduleName: moduleName,
abiName: externFunctionName,
functionName: wrapFunctionName,
signature: funcSignature
)
},
elseDecl: { printer in
printer.write(
multilineString: """
fileprivate func \(wrapFunctionName)\(funcSignature) {
fatalError("Only available on WebAssembly")
}
"""
)
}
moduleName: moduleName,
abiName: externFunctionName,
functionName: wrapFunctionName,
abiParameters: [("pointer", .pointer)],
returnType: .i32
)
let externDecl: DeclSyntax = "\(raw: externDeclPrinter.lines.joined(separator: "\n"))"
return [extensionDecl, externDecl]
Expand Down Expand Up @@ -1265,24 +1247,22 @@ struct StructCodegen {
let bridgedStructExtension: DeclSyntax = "\(raw: printer.lines.joined(separator: "\n"))"

let lowerExternDeclPrinter = CodeFragmentPrinter()
Self.renderStructExtern(
SwiftCodePattern.buildExternFunctionDecl(
printer: lowerExternDeclPrinter,
externName: lowerExternName,
moduleName: "bjs",
abiName: lowerExternName,
functionName: lowerFunctionName,
signature: SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: [("objectId", .i32)],
returnType: nil
)
abiParameters: [("objectId", .i32)],
returnType: nil
)
let liftExternDeclPrinter = CodeFragmentPrinter()
Self.renderStructExtern(
SwiftCodePattern.buildExternFunctionDecl(
printer: liftExternDeclPrinter,
externName: liftExternName,
moduleName: "bjs",
abiName: liftExternName,
functionName: liftFunctionName,
signature: SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: [],
returnType: .i32
)
abiParameters: [],
returnType: .i32
)

return [
Expand All @@ -1291,35 +1271,6 @@ struct StructCodegen {
]
}

private static func renderStructExtern(
printer: CodeFragmentPrinter,
externName: String,
functionName: String,
signature: String
) {
SwiftCodePattern.buildWasmConditionalCompilationDecls(
printer: printer,
wasmDecl: { printer in
SwiftCodePattern.buildExternFunctionDecl(
printer: printer,
moduleName: "bjs",
abiName: externName,
functionName: functionName,
signature: signature
)
},
elseDecl: { printer in
printer.write(
multilineString: """
fileprivate func \(functionName)\(signature) {
fatalError("Only available on WebAssembly")
}
"""
)
}
)
}

private func generateStructLiftCode(structDef: ExportedStruct) -> [String] {
var lines: [String] = []
let instanceProps = structDef.properties.filter { !$0.isStatic }
Expand Down Expand Up @@ -1385,17 +1336,14 @@ struct ProtocolCodegen {
)

// Build extern declaration using helper function
let externSignature = SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: builder.abiParameterSignatures,
returnType: builder.abiReturnType
)
let externDeclPrinter = CodeFragmentPrinter()
SwiftCodePattern.buildExternFunctionDecl(
printer: externDeclPrinter,
moduleName: moduleName,
abiName: method.abiName,
functionName: "_extern_\(method.name)",
signature: externSignature
abiParameters: builder.abiParameterSignatures,
returnType: builder.abiReturnType
)
externDecls.append(DeclSyntax("\(raw: externDeclPrinter.lines.joined(separator: "\n"))"))
let methodImplPrinter = CodeFragmentPrinter()
Expand Down Expand Up @@ -1476,17 +1424,14 @@ struct ProtocolCodegen {
try getterBuilder.liftReturnValue(returnType: property.type)

// Build getter extern declaration using helper function
let getterExternSignature = SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: getterBuilder.abiParameterSignatures,
returnType: getterBuilder.abiReturnType
)
let getterExternDeclPrinter = CodeFragmentPrinter()
SwiftCodePattern.buildExternFunctionDecl(
printer: getterExternDeclPrinter,
moduleName: moduleName,
abiName: getterAbiName,
functionName: getterAbiName,
signature: getterExternSignature
abiParameters: getterBuilder.abiParameterSignatures,
returnType: getterBuilder.abiReturnType
)
let getterExternDecl = DeclSyntax("\(raw: getterExternDeclPrinter.lines.joined(separator: "\n"))")
var externDecls: [DeclSyntax] = [getterExternDecl]
Expand All @@ -1511,17 +1456,14 @@ struct ProtocolCodegen {
try setterBuilder.call(returnType: .void)

// Build setter extern declaration using helper function
let setterExternSignature = SwiftSignatureBuilder.buildABIFunctionSignature(
abiParameters: setterBuilder.abiParameterSignatures,
returnType: setterBuilder.abiReturnType
)
let setterExternDeclPrinter = CodeFragmentPrinter()
SwiftCodePattern.buildExternFunctionDecl(
printer: setterExternDeclPrinter,
moduleName: moduleName,
abiName: setterAbiName,
functionName: setterAbiName,
signature: setterExternSignature
abiParameters: setterBuilder.abiParameterSignatures,
returnType: setterBuilder.abiReturnType
)
let setterExternDecl = DeclSyntax("\(raw: setterExternDeclPrinter.lines.joined(separator: "\n"))")
externDecls.append(setterExternDecl)
Expand Down
Loading