Skip to content

Commit bffab39

Browse files
authored
BridgeJS: Add UInt support (#551)
1 parent d08ab42 commit bffab39

File tree

20 files changed

+196
-33
lines changed

20 files changed

+196
-33
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ struct StackCodegen {
800800
switch type {
801801
case .string:
802802
return "String.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
803-
case .int:
803+
case .int, .uint:
804804
return "Int.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
805805
case .bool:
806806
return "Bool.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
@@ -873,7 +873,7 @@ struct StackCodegen {
873873
case .string:
874874
return
875875
"Optional<String>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
876-
case .int:
876+
case .int, .uint:
877877
return "Optional<Int>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
878878
case .bool:
879879
return "Optional<Bool>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
@@ -945,7 +945,7 @@ struct StackCodegen {
945945
"var __bjs_\(raw: varPrefix) = \(raw: accessor)",
946946
"__bjs_\(raw: varPrefix).withUTF8 { ptr in _swift_js_push_string(ptr.baseAddress, Int32(ptr.count)) }",
947947
]
948-
case .int:
948+
case .int, .uint:
949949
return ["_swift_js_push_int(Int32(\(raw: accessor)))"]
950950
case .bool:
951951
return ["_swift_js_push_int(\(raw: accessor) ? 1 : 0)"]
@@ -1052,7 +1052,7 @@ struct StackCodegen {
10521052
"var __bjs_str_\(raw: varPrefix) = \(raw: unwrappedVar)",
10531053
"__bjs_str_\(raw: varPrefix).withUTF8 { ptr in _swift_js_push_string(ptr.baseAddress, Int32(ptr.count)) }",
10541054
]
1055-
case .int:
1055+
case .int, .uint:
10561056
return ["_swift_js_push_int(Int32(\(raw: unwrappedVar)))"]
10571057
case .bool:
10581058
return ["_swift_js_push_int(\(raw: unwrappedVar) ? 1 : 0)"]
@@ -1643,6 +1643,7 @@ extension BridgeType {
16431643
switch self {
16441644
case .bool: return "Bool"
16451645
case .int: return "Int"
1646+
case .uint: return "UInt"
16461647
case .float: return "Float"
16471648
case .double: return "Double"
16481649
case .string: return "String"
@@ -1687,7 +1688,7 @@ extension BridgeType {
16871688
func liftParameterInfo() throws -> LiftingIntrinsicInfo {
16881689
switch self {
16891690
case .bool: return .bool
1690-
case .int: return .int
1691+
case .int, .uint: return .int
16911692
case .float: return .float
16921693
case .double: return .double
16931694
case .string: return .string
@@ -1739,7 +1740,7 @@ extension BridgeType {
17391740
func loweringReturnInfo() throws -> LoweringIntrinsicInfo {
17401741
switch self {
17411742
case .bool: return .bool
1742-
case .int: return .int
1743+
case .int, .uint: return .int
17431744
case .float: return .float
17441745
case .double: return .double
17451746
case .string: return .string

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -866,7 +866,7 @@ extension BridgeType {
866866
func loweringParameterInfo(context: BridgeContext = .importTS) throws -> LoweringParameterInfo {
867867
switch self {
868868
case .bool: return .bool
869-
case .int: return .int
869+
case .int, .uint: return .int
870870
case .float: return .float
871871
case .double: return .double
872872
case .string: return .string
@@ -960,7 +960,7 @@ extension BridgeType {
960960
) throws -> LiftingReturnInfo {
961961
switch self {
962962
case .bool: return .bool
963-
case .int: return .int
963+
case .int, .uint: return .int
964964
case .float: return .float
965965
case .double: return .double
966966
case .string: return .string

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3401,7 +3401,7 @@ extension BridgeType {
34013401
return "void"
34023402
case .string:
34033403
return "string"
3404-
case .int:
3404+
case .int, .uint:
34053405
return "number"
34063406
case .float:
34073407
return "number"

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,15 @@ struct IntrinsicJSFragment: Sendable {
149149
}
150150
)
151151

152+
/// Convert signed Int32 to unsigned for UInt values
153+
static let uintLiftReturn = IntrinsicJSFragment(
154+
parameters: ["value"],
155+
printCode: { arguments, scope, printer, cleanupCode in
156+
return ["\(arguments[0]) >>> 0"]
157+
}
158+
)
159+
static let uintLiftParameter = uintLiftReturn
160+
152161
static let stringLowerParameter = IntrinsicJSFragment(
153162
parameters: ["value"],
154163
printCode: { arguments, scope, printer, cleanupCode in
@@ -519,7 +528,7 @@ struct IntrinsicJSFragment: Sendable {
519528
case .bool:
520529
printer.write("const \(resultVar) = \(JSGlueVariableScope.reservedStorageToReturnOptionalBool);")
521530
printer.write("\(JSGlueVariableScope.reservedStorageToReturnOptionalBool) = undefined;")
522-
case .int:
531+
case .int, .uint:
523532
printer.write("const \(resultVar) = \(JSGlueVariableScope.reservedStorageToReturnOptionalInt);")
524533
printer.write("\(JSGlueVariableScope.reservedStorageToReturnOptionalInt) = undefined;")
525534
case .float:
@@ -651,7 +660,7 @@ struct IntrinsicJSFragment: Sendable {
651660
printer.write(
652661
"bjs[\"swift_js_return_optional_bool\"](\(isSomeVar) ? 1 : 0, \(isSomeVar) ? (\(value) ? 1 : 0) : 0);"
653662
)
654-
case .int:
663+
case .int, .uint:
655664
printer.write(
656665
"bjs[\"swift_js_return_optional_int\"](\(isSomeVar) ? 1 : 0, \(isSomeVar) ? (\(value) | 0) : 0);"
657666
)
@@ -937,7 +946,7 @@ struct IntrinsicJSFragment: Sendable {
937946
)
938947
printer.write("\(JSGlueVariableScope.reservedSwift).memory.release(\(value));")
939948
printer.write("\(targetVar) = String(\(objectLabel));")
940-
case .int:
949+
case .int, .uint:
941950
printer.write("\(targetVar) = \(value) | 0;")
942951
case .bool:
943952
printer.write("\(targetVar) = \(value) !== 0;")
@@ -1121,7 +1130,7 @@ struct IntrinsicJSFragment: Sendable {
11211130
case .string:
11221131
printer.write("\(JSGlueVariableScope.reservedStorageToReturnString) = \(result);")
11231132
printer.write("return;")
1124-
case .int:
1133+
case .int, .uint:
11251134
printer.write("\(JSGlueVariableScope.reservedStorageToReturnOptionalInt) = \(result);")
11261135
printer.write("return;")
11271136
case .bool:
@@ -1370,7 +1379,7 @@ struct IntrinsicJSFragment: Sendable {
13701379
/// Returns a fragment that lowers a JS value to Wasm core values for parameters
13711380
static func lowerParameter(type: BridgeType) throws -> IntrinsicJSFragment {
13721381
switch type {
1373-
case .int, .float, .double, .bool, .unsafePointer: return .identity
1382+
case .int, .uint, .float, .double, .bool, .unsafePointer: return .identity
13741383
case .string: return .stringLowerParameter
13751384
case .jsObject: return .jsObjectLowerParameter
13761385
case .swiftHeapObject:
@@ -1414,6 +1423,7 @@ struct IntrinsicJSFragment: Sendable {
14141423
static func liftReturn(type: BridgeType) throws -> IntrinsicJSFragment {
14151424
switch type {
14161425
case .int, .float, .double: return .identity
1426+
case .uint: return .uintLiftReturn
14171427
case .bool: return .boolLiftReturn
14181428
case .string: return .stringLiftReturn
14191429
case .jsObject: return .jsObjectLiftReturn
@@ -1460,6 +1470,7 @@ struct IntrinsicJSFragment: Sendable {
14601470
static func liftParameter(type: BridgeType, context: BridgeContext = .importTS) throws -> IntrinsicJSFragment {
14611471
switch type {
14621472
case .int, .float, .double: return .identity
1473+
case .uint: return .uintLiftParameter
14631474
case .bool: return .boolLiftParameter
14641475
case .string: return .stringLiftParameter
14651476
case .jsObject: return .jsObjectLiftParameter
@@ -1560,7 +1571,7 @@ struct IntrinsicJSFragment: Sendable {
15601571
/// Returns a fragment that lowers a JS value to Wasm core values for return values
15611572
static func lowerReturn(type: BridgeType, context: BridgeContext = .importTS) throws -> IntrinsicJSFragment {
15621573
switch type {
1563-
case .int, .float, .double: return .identity
1574+
case .int, .uint, .float, .double: return .identity
15641575
case .bool: return .boolLowerReturn
15651576
case .string: return .stringLowerReturn
15661577
case .jsObject: return .jsObjectLowerReturn
@@ -1909,7 +1920,7 @@ struct IntrinsicJSFragment: Sendable {
19091920
return []
19101921
}
19111922
)
1912-
case .int:
1923+
case .int, .uint:
19131924
return IntrinsicJSFragment(
19141925
parameters: ["value"],
19151926
printCode: { arguments, scope, printer, cleanup in
@@ -1967,7 +1978,7 @@ struct IntrinsicJSFragment: Sendable {
19671978
cleanup.write("\(JSGlueVariableScope.reservedSwift).memory.release(\(idVar));")
19681979
}
19691980
cleanup.write("}")
1970-
case .int:
1981+
case .int, .uint:
19711982
printer.write(
19721983
"\(JSGlueVariableScope.reservedTmpParamInts).push(\(isSomeVar) ? (\(value) | 0) : 0);"
19731984
)
@@ -2024,7 +2035,7 @@ struct IntrinsicJSFragment: Sendable {
20242035
return [bVar]
20252036
}
20262037
)
2027-
case .int:
2038+
case .int, .uint:
20282039
return IntrinsicJSFragment(
20292040
parameters: [],
20302041
printCode: { arguments, scope, printer, cleanup in
@@ -2214,7 +2225,7 @@ struct IntrinsicJSFragment: Sendable {
22142225
return [bVar]
22152226
}
22162227
)
2217-
case .int:
2228+
case .int, .uint:
22182229
return IntrinsicJSFragment(
22192230
parameters: [],
22202231
printCode: { arguments, scope, printer, cleanup in
@@ -2363,7 +2374,7 @@ struct IntrinsicJSFragment: Sendable {
23632374
return []
23642375
}
23652376
)
2366-
case .int:
2377+
case .int, .uint:
23672378
return IntrinsicJSFragment(
23682379
parameters: ["value"],
23692380
printCode: { arguments, scope, printer, cleanup in
@@ -2779,7 +2790,7 @@ struct IntrinsicJSFragment: Sendable {
27792790
return []
27802791
}
27812792
)
2782-
case .int:
2793+
case .int, .uint:
27832794
return IntrinsicJSFragment(
27842795
parameters: ["value"],
27852796
printCode: { arguments, scope, printer, cleanup in
@@ -3009,7 +3020,7 @@ struct IntrinsicJSFragment: Sendable {
30093020
} else {
30103021
// Handle optional primitive types using helper
30113022
switch wrappedType {
3012-
case .int:
3023+
case .int, .uint:
30133024
pushOptionalPrimitive(
30143025
value: value,
30153026
isSomeVar: isSomeVar,
@@ -3260,7 +3271,7 @@ struct IntrinsicJSFragment: Sendable {
32603271
return [bVar]
32613272
}
32623273
)
3263-
case .int:
3274+
case .int, .uint:
32643275
return IntrinsicJSFragment(
32653276
parameters: [],
32663277
printCode: { arguments, scope, printer, cleanup in

Plugins/BridgeJS/Sources/BridgeJSSkeleton/BridgeJSSkeleton.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public struct UnsafePointerType: Codable, Equatable, Hashable, Sendable {
127127
}
128128

129129
public enum BridgeType: Codable, Equatable, Hashable, Sendable {
130-
case int, float, double, string, bool, jsObject(String?), swiftHeapObject(String), void
130+
case int, uint, float, double, string, bool, jsObject(String?), swiftHeapObject(String), void
131131
case unsafePointer(UnsafePointerType)
132132
indirect case optional(BridgeType)
133133
indirect case array(BridgeType)
@@ -860,6 +860,8 @@ extension BridgeType {
860860
switch swiftType {
861861
case "Int":
862862
self = .int
863+
case "UInt":
864+
self = .uint
863865
case "Float":
864866
self = .float
865867
case "Double":
@@ -887,7 +889,7 @@ extension BridgeType {
887889
switch self {
888890
case .void: return nil
889891
case .bool: return .i32
890-
case .int: return .i32
892+
case .int, .uint: return .i32
891893
case .float: return .f32
892894
case .double: return .f64
893895
case .string: return nil
@@ -933,6 +935,7 @@ extension BridgeType {
933935
public var mangleTypeName: String {
934936
switch self {
935937
case .int: return "Si"
938+
case .uint: return "Su"
936939
case .float: return "Sf"
937940
case .double: return "Sd"
938941
case .string: return "SS"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
@JS func check(a: Int, b: Float, c: Double, d: Bool) {}
1+
@JS func check(a: Int, b: UInt, c: Float, d: Double, e: Bool) {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@JS func checkInt() -> Int { fatalError() }
2+
@JS func checkUInt() -> UInt { fatalError() }
23
@JS func checkFloat() -> Float { fatalError() }
34
@JS func checkDouble() -> Double { fatalError() }
45
@JS func checkBool() -> Bool { fatalError() }

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Export.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// `swift package bridge-js`.
66

77
export type Exports = {
8-
check(a: number, b: number, c: number, d: boolean): void;
8+
check(a: number, b: number, c: number, d: number, e: boolean): void;
99
}
1010
export type Imports = {
1111
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveParameters.Export.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,8 @@ export async function createInstantiator(options, swift) {
222222
createExports: (instance) => {
223223
const js = swift.memory.heap;
224224
const exports = {
225-
check: function bjs_check(a, b, c, d) {
226-
instance.exports.bjs_check(a, b, c, d);
225+
check: function bjs_check(a, b, c, d, e) {
226+
instance.exports.bjs_check(a, b, c, d, e);
227227
},
228228
};
229229
_exports = exports;

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/PrimitiveReturn.Export.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
export type Exports = {
88
checkInt(): number;
9+
checkUInt(): number;
910
checkFloat(): number;
1011
checkDouble(): number;
1112
checkBool(): boolean;

0 commit comments

Comments
 (0)