Skip to content

Commit 963bb20

Browse files
committed
BridgeJS: Delete dead code and fix nullable descriptor transparency in catch blocks
1 parent a3ef1e9 commit 963bb20

File tree

5 files changed

+23
-173
lines changed

5 files changed

+23
-173
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public struct ClosureCodegen {
148148
let abiReturnWasmType: WasmCoreType?
149149
if signature.returnType == .void {
150150
abiReturnWasmType = nil
151-
} else if let wasmType = try signature.returnType.loweringReturnInfo().returnType {
151+
} else if let wasmType = try signature.returnType.loweringReturnInfo() {
152152
abiReturnWasmType = wasmType
153153
} else {
154154
abiReturnWasmType = nil

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,7 @@ public class ExportSwift {
339339
}
340340

341341
private func _lowerReturnValue(returnType: BridgeType) throws {
342-
let loweringInfo = try returnType.loweringReturnInfo()
343-
abiReturnType = loweringInfo.returnType
342+
abiReturnType = try returnType.loweringReturnInfo()
344343
if returnType == .void {
345344
return
346345
}
@@ -1682,20 +1681,7 @@ extension BridgeType {
16821681
struct LiftingIntrinsicInfo: Sendable {
16831682
let parameters: [(name: String, type: WasmCoreType)]
16841683

1685-
static let bool = LiftingIntrinsicInfo(parameters: [("value", .i32)])
1686-
static let int = LiftingIntrinsicInfo(parameters: [("value", .i32)])
1687-
static let float = LiftingIntrinsicInfo(parameters: [("value", .f32)])
1688-
static let double = LiftingIntrinsicInfo(parameters: [("value", .f64)])
1689-
static let string = LiftingIntrinsicInfo(parameters: [("bytes", .i32), ("length", .i32)])
1690-
static let jsObject = LiftingIntrinsicInfo(parameters: [("value", .i32)])
1691-
static let jsValue = LiftingIntrinsicInfo(parameters: [("kind", .i32), ("payload1", .i32), ("payload2", .f64)])
1692-
static let swiftHeapObject = LiftingIntrinsicInfo(parameters: [("value", .pointer)])
1693-
static let unsafePointer = LiftingIntrinsicInfo(parameters: [("pointer", .pointer)])
1694-
static let void = LiftingIntrinsicInfo(parameters: [])
1695-
static let caseEnum = LiftingIntrinsicInfo(parameters: [("value", .i32)])
1696-
static let associatedValueEnum = LiftingIntrinsicInfo(parameters: [
1697-
("caseId", .i32)
1698-
])
1684+
16991685
}
17001686

17011687
func liftParameterInfo() throws -> LiftingIntrinsicInfo {
@@ -1715,18 +1701,14 @@ extension BridgeType {
17151701
}
17161702
}
17171703

1718-
struct LoweringIntrinsicInfo: Sendable {
1719-
let returnType: WasmCoreType?
1720-
}
1721-
1722-
func loweringReturnInfo() throws -> LoweringIntrinsicInfo {
1704+
func loweringReturnInfo() throws -> WasmCoreType? {
17231705
switch self {
17241706
case .nullable:
1725-
return LoweringIntrinsicInfo(returnType: nil)
1707+
return nil
17261708
case .namespaceEnum:
17271709
throw BridgeJSCoreError("Namespace enums are not supported to pass as parameters")
17281710
default:
1729-
return LoweringIntrinsicInfo(returnType: descriptor.wasmReturnType)
1711+
return descriptor.wasmReturnType
17301712
}
17311713
}
17321714
}

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,7 @@ public struct BridgeJSLink {
15431543
throw BridgeJSLinkError(message: "Raw value enum \(enumDefinition.name) is missing rawType")
15441544
}
15451545

1546-
let fragment = IntrinsicJSFragment.rawValueEnumHelper(enumDefinition: enumDefinition)
1546+
let fragment = IntrinsicJSFragment.simpleEnumHelper(enumDefinition: enumDefinition)
15471547
_ = try fragment.printCode([enumValuesName], context)
15481548
jsTopLevelLines.append(contentsOf: printer.lines)
15491549
case .associatedValue:
@@ -2172,7 +2172,7 @@ extension BridgeJSLink {
21722172
printer.write("} catch (error) {")
21732173
printer.indent {
21742174
printer.write("setException(error);")
2175-
if let abiReturnType = returnType.abiReturnType {
2175+
if !returnType.isOptional, let abiReturnType = returnType.descriptor.wasmReturnType {
21762176
printer.write("return \(abiReturnType.placeholderValue)")
21772177
}
21782178
}

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 15 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,7 @@ extension JSGlueVariableScope {
109109
printer.write("\(JSGlueVariableScope.reservedPointerStack).push(\(value));")
110110
}
111111

112-
// MARK: Return
113-
114-
func emitPushI32Return(_ value: String, printer: CodeFragmentPrinter) {
115-
printer.write("\(JSGlueVariableScope.reservedI32Stack).push(\(value));")
116-
}
117-
func emitPushF64Return(_ value: String, printer: CodeFragmentPrinter) {
118-
printer.write("\(JSGlueVariableScope.reservedF64Stack).push(\(value));")
119-
}
120-
func emitPushPointerReturn(_ value: String, printer: CodeFragmentPrinter) {
121-
printer.write("\(JSGlueVariableScope.reservedPointerStack).push(\(value));")
122-
}
112+
// MARK: Pop
123113
func popString() -> String {
124114
return "\(JSGlueVariableScope.reservedStringStack).pop()"
125115
}
@@ -204,37 +194,6 @@ struct IntrinsicJSFragment: Sendable {
204194
}
205195
)
206196

207-
/// NOTE: JavaScript engine itself converts booleans to integers when passing them to
208-
/// Wasm functions, so we don't need to do anything here
209-
static let boolLowerParameter = identity
210-
static let boolLiftReturn = IntrinsicJSFragment(
211-
parameters: ["value"],
212-
printCode: { arguments, _ in
213-
return ["\(arguments[0]) !== 0"]
214-
}
215-
)
216-
static let boolLiftParameter = IntrinsicJSFragment(
217-
parameters: ["value"],
218-
printCode: { arguments, _ in
219-
return ["\(arguments[0]) !== 0"]
220-
}
221-
)
222-
static let boolLowerReturn = IntrinsicJSFragment(
223-
parameters: ["value"],
224-
printCode: { arguments, _ in
225-
return ["\(arguments[0]) ? 1 : 0"]
226-
}
227-
)
228-
229-
/// Convert signed Int32 to unsigned for UInt values
230-
static let uintLiftReturn = IntrinsicJSFragment(
231-
parameters: ["value"],
232-
printCode: { arguments, _ in
233-
return ["\(arguments[0]) >>> 0"]
234-
}
235-
)
236-
static let uintLiftParameter = uintLiftReturn
237-
238197
static let stringLowerParameter = IntrinsicJSFragment(
239198
parameters: ["value"],
240199
printCode: { arguments, context in
@@ -529,45 +488,20 @@ struct IntrinsicJSFragment: Sendable {
529488
}
530489

531490
static func jsValueLowerReturn(context: BridgeContext) -> IntrinsicJSFragment {
532-
switch context {
533-
case .importTS:
534-
// Return values from imported JS functions should be delivered to the Swift side
535-
// via the parameter stacks that `_swift_js_pop_*` read from.
536-
return IntrinsicJSFragment(
537-
parameters: ["value"],
538-
printCode: { arguments, context in
539-
let (scope, printer) = (context.scope, context.printer)
540-
let lowered = try jsValueLower.printCode(arguments, context)
541-
let kindVar = lowered[0]
542-
let payload1Var = lowered[1]
543-
let payload2Var = lowered[2]
544-
scope.emitPushI32Parameter(kindVar, printer: printer)
545-
scope.emitPushI32Parameter(payload1Var, printer: printer)
546-
scope.emitPushF64Parameter(payload2Var, printer: printer)
547-
return []
548-
}
549-
)
550-
case .exportSwift:
551-
// Kept for symmetry, though JSValue return for export currently relies on Swift pushing
552-
// to tmpRet stacks directly.
553-
return IntrinsicJSFragment(
554-
parameters: ["value"],
555-
printCode: { arguments, context in
556-
let (scope, printer) = (context.scope, context.printer)
557-
let lowered = try jsValueLower.printCode(
558-
arguments,
559-
context
560-
)
561-
let kindVar = lowered[0]
562-
let payload1Var = lowered[1]
563-
let payload2Var = lowered[2]
564-
scope.emitPushI32Parameter(kindVar, printer: printer)
565-
scope.emitPushI32Parameter(payload1Var, printer: printer)
566-
scope.emitPushF64Parameter(payload2Var, printer: printer)
567-
return []
568-
}
569-
)
570-
}
491+
return IntrinsicJSFragment(
492+
parameters: ["value"],
493+
printCode: { arguments, context in
494+
let (scope, printer) = (context.scope, context.printer)
495+
let lowered = try jsValueLower.printCode(arguments, context)
496+
let kindVar = lowered[0]
497+
let payload1Var = lowered[1]
498+
let payload2Var = lowered[2]
499+
scope.emitPushI32Parameter(kindVar, printer: printer)
500+
scope.emitPushI32Parameter(payload1Var, printer: printer)
501+
scope.emitPushF64Parameter(payload2Var, printer: printer)
502+
return []
503+
}
504+
)
571505
}
572506

573507
static let jsValueLift = IntrinsicJSFragment(
@@ -1814,30 +1748,7 @@ struct IntrinsicJSFragment: Sendable {
18141748
)
18151749
}
18161750

1817-
static func rawValueEnumHelper(enumDefinition: ExportedEnum) -> IntrinsicJSFragment {
1818-
return IntrinsicJSFragment(
1819-
parameters: ["enumName"],
1820-
printCode: { arguments, context in
1821-
let printer = context.printer
1822-
let enumName = arguments[0]
1823-
printer.write("const \(enumName) = {")
1824-
printer.indent {
1825-
for (index, enumCase) in enumDefinition.cases.enumerated() {
1826-
let caseName = enumCase.name.capitalizedFirstLetter
1827-
let value = enumCase.jsValue(
1828-
rawType: enumDefinition.rawType,
1829-
index: index
1830-
)
1831-
printer.write("\(caseName): \(value),")
1832-
}
1833-
}
1834-
printer.write("};")
1835-
printer.nextLine()
18361751

1837-
return []
1838-
}
1839-
)
1840-
}
18411752

18421753
private static func associatedValuePushPayload(enumCase: EnumCase) -> IntrinsicJSFragment {
18431754
return IntrinsicJSFragment(

Plugins/BridgeJS/Sources/BridgeJSSkeleton/BridgeJSSkeleton.swift

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,49 +1415,6 @@ extension BridgeType {
14151415
}
14161416
}
14171417

1418-
public var abiReturnType: WasmCoreType? {
1419-
switch self {
1420-
case .void: return nil
1421-
case .bool: return .i32
1422-
case .int, .uint: return .i32
1423-
case .float: return .f32
1424-
case .double: return .f64
1425-
case .string: return nil
1426-
case .jsObject: return .i32
1427-
case .jsValue: return nil
1428-
case .swiftHeapObject:
1429-
// UnsafeMutableRawPointer is returned as an i32 pointer
1430-
return .pointer
1431-
case .unsafePointer:
1432-
return .pointer
1433-
case .nullable:
1434-
return nil
1435-
case .caseEnum:
1436-
return .i32
1437-
case .rawValueEnum(_, let rawType):
1438-
return rawType.wasmCoreType
1439-
case .associatedValueEnum:
1440-
return nil
1441-
case .namespaceEnum:
1442-
return nil
1443-
case .swiftProtocol:
1444-
// Protocols pass JSObject IDs as Int32
1445-
return .i32
1446-
case .swiftStruct:
1447-
// Structs use stack-based return (no direct WASM return type)
1448-
return nil
1449-
case .closure:
1450-
// Closures pass callback ID as Int32
1451-
return .i32
1452-
case .array:
1453-
// Arrays use stack-based return with length prefix (no direct WASM return type)
1454-
return nil
1455-
case .dictionary:
1456-
// Dictionaries use stack-based return with entry count (no direct WASM return type)
1457-
return nil
1458-
}
1459-
}
1460-
14611418
/// Returns true if this type is optional (nullable with null or undefined).
14621419
public var isOptional: Bool {
14631420
if case .nullable = self { return true }

0 commit comments

Comments
 (0)