Skip to content

Commit d8b0e17

Browse files
authored
Merge pull request #553 from swiftwasm/yt/reduce-intrinsics
[BridgeJS] Formalizing ABI Part 1
2 parents 8004473 + e604fa6 commit d8b0e17

File tree

66 files changed

+1050
-1486
lines changed

Some content is hidden

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

66 files changed

+1050
-1486
lines changed

Benchmarks/Sources/Generated/BridgeJS.swift

Lines changed: 133 additions & 133 deletions
Large diffs are not rendered by default.

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -799,41 +799,41 @@ struct StackCodegen {
799799
func liftExpression(for type: BridgeType) -> ExprSyntax {
800800
switch type {
801801
case .string:
802-
return "String.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
802+
return "String.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
803803
case .int, .uint:
804-
return "Int.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
804+
return "Int.bridgeJSLiftParameter(_swift_js_pop_i32())"
805805
case .bool:
806-
return "Bool.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
806+
return "Bool.bridgeJSLiftParameter(_swift_js_pop_i32())"
807807
case .float:
808-
return "Float.bridgeJSLiftParameter(_swift_js_pop_param_f32())"
808+
return "Float.bridgeJSLiftParameter(_swift_js_pop_f32())"
809809
case .double:
810-
return "Double.bridgeJSLiftParameter(_swift_js_pop_param_f64())"
810+
return "Double.bridgeJSLiftParameter(_swift_js_pop_f64())"
811811
case .jsObject:
812-
return "JSObject.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
812+
return "JSObject.bridgeJSLiftParameter(_swift_js_pop_i32())"
813813
case .swiftHeapObject(let className):
814-
return "\(raw: className).bridgeJSLiftParameter(_swift_js_pop_param_pointer())"
814+
return "\(raw: className).bridgeJSLiftParameter(_swift_js_pop_pointer())"
815815
case .unsafePointer:
816-
return "\(raw: type.swiftType).bridgeJSLiftParameter(_swift_js_pop_param_pointer())"
816+
return "\(raw: type.swiftType).bridgeJSLiftParameter(_swift_js_pop_pointer())"
817817
case .swiftProtocol(let protocolName):
818818
// Protocols use their Any wrapper type for lifting
819819
let wrapperName = "Any\(protocolName)"
820-
return "\(raw: wrapperName).bridgeJSLiftParameter(_swift_js_pop_param_int32())"
820+
return "\(raw: wrapperName).bridgeJSLiftParameter(_swift_js_pop_i32())"
821821
case .caseEnum(let enumName):
822-
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_int32())"
822+
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_i32())"
823823
case .rawValueEnum(let enumName, let rawType):
824824
switch rawType {
825825
case .string:
826826
return
827-
"\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
827+
"\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
828828
case .float:
829-
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_f32())"
829+
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_f32())"
830830
case .double:
831-
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_f64())"
831+
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_f64())"
832832
case .bool, .int, .int32, .int64, .uint, .uint32, .uint64:
833-
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_int32())"
833+
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_i32())"
834834
}
835835
case .associatedValueEnum(let enumName):
836-
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_param_int32())"
836+
return "\(raw: enumName).bridgeJSLiftParameter(_swift_js_pop_i32())"
837837
case .swiftStruct(let structName):
838838
return "\(raw: structName).bridgeJSLiftParameter()"
839839
case .optional(let wrappedType):
@@ -845,7 +845,7 @@ struct StackCodegen {
845845
// Namespace enums are not passed as values
846846
return "()"
847847
case .closure:
848-
return "JSObject.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
848+
return "JSObject.bridgeJSLiftParameter(_swift_js_pop_i32())"
849849
case .array(let elementType):
850850
return liftArrayExpression(elementType: elementType)
851851
}
@@ -856,7 +856,7 @@ struct StackCodegen {
856856
let swiftTypeName = elementType.swiftType
857857
return """
858858
{
859-
let __count = Int(_swift_js_pop_param_array_length())
859+
let __count = Int(_swift_js_pop_i32())
860860
var __result: [\(raw: swiftTypeName)] = []
861861
__result.reserveCapacity(__count)
862862
for _ in 0..<__count {
@@ -872,49 +872,49 @@ struct StackCodegen {
872872
switch wrappedType {
873873
case .string:
874874
return
875-
"Optional<String>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
875+
"Optional<String>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32(), _swift_js_pop_i32())"
876876
case .int, .uint:
877-
return "Optional<Int>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
877+
return "Optional<Int>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
878878
case .bool:
879-
return "Optional<Bool>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
879+
return "Optional<Bool>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
880880
case .float:
881-
return "Optional<Float>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_f32())"
881+
return "Optional<Float>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_f32())"
882882
case .double:
883-
return "Optional<Double>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_f64())"
883+
return "Optional<Double>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_f64())"
884884
case .caseEnum(let enumName):
885885
return
886-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
886+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
887887
case .rawValueEnum(let enumName, let rawType):
888888
switch rawType {
889889
case .string:
890890
return
891-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
891+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32(), _swift_js_pop_i32())"
892892
case .float:
893893
return
894-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_f32())"
894+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_f32())"
895895
case .double:
896896
return
897-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_f64())"
897+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_f64())"
898898
case .bool, .int, .int32, .int64, .uint, .uint32, .uint64:
899899
return
900-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
900+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
901901
}
902902
case .swiftStruct(let nestedName):
903-
return "Optional<\(raw: nestedName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
903+
return "Optional<\(raw: nestedName)>.bridgeJSLiftParameter(_swift_js_pop_i32())"
904904
case .swiftHeapObject(let className):
905905
return
906-
"Optional<\(raw: className)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_pointer())"
906+
"Optional<\(raw: className)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_pointer())"
907907
case .associatedValueEnum(let enumName):
908908
return
909-
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
909+
"Optional<\(raw: enumName)>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
910910
case .jsObject:
911-
return "Optional<JSObject>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
911+
return "Optional<JSObject>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
912912
case .array(let elementType):
913913
let arrayLift = liftArrayExpression(elementType: elementType)
914914
let swiftTypeName = elementType.swiftType
915915
return """
916916
{
917-
let __isSome = _swift_js_pop_param_int32()
917+
let __isSome = _swift_js_pop_i32()
918918
if __isSome == 0 {
919919
return Optional<[\(raw: swiftTypeName)]>.none
920920
} else {
@@ -924,7 +924,7 @@ struct StackCodegen {
924924
"""
925925
default:
926926
// Fallback for other optional types
927-
return "Optional<Int>.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
927+
return "Optional<Int>.bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32())"
928928
}
929929
}
930930

@@ -946,24 +946,24 @@ struct StackCodegen {
946946
"__bjs_\(raw: varPrefix).withUTF8 { ptr in _swift_js_push_string(ptr.baseAddress, Int32(ptr.count)) }",
947947
]
948948
case .int, .uint:
949-
return ["_swift_js_push_int(Int32(\(raw: accessor)))"]
949+
return ["_swift_js_push_i32(Int32(\(raw: accessor)))"]
950950
case .bool:
951-
return ["_swift_js_push_int(\(raw: accessor) ? 1 : 0)"]
951+
return ["_swift_js_push_i32(\(raw: accessor) ? 1 : 0)"]
952952
case .float:
953953
return ["_swift_js_push_f32(\(raw: accessor))"]
954954
case .double:
955955
return ["_swift_js_push_f64(\(raw: accessor))"]
956956
case .jsObject:
957-
return ["_swift_js_push_int(\(raw: accessor).bridgeJSLowerReturn())"]
957+
return ["_swift_js_push_i32(\(raw: accessor).bridgeJSLowerReturn())"]
958958
case .swiftHeapObject:
959959
return ["_swift_js_push_pointer(\(raw: accessor).bridgeJSLowerReturn())"]
960960
case .unsafePointer:
961961
return ["_swift_js_push_pointer(\(raw: accessor).bridgeJSLowerReturn())"]
962962
case .swiftProtocol(let protocolName):
963963
let wrapperName = "Any\(protocolName)"
964-
return ["_swift_js_push_int((\(raw: accessor) as! \(raw: wrapperName)).bridgeJSLowerReturn())"]
964+
return ["_swift_js_push_i32((\(raw: accessor) as! \(raw: wrapperName)).bridgeJSLowerReturn())"]
965965
case .caseEnum:
966-
return ["_swift_js_push_int(Int32(\(raw: accessor).bridgeJSLowerParameter()))"]
966+
return ["_swift_js_push_i32(Int32(\(raw: accessor).bridgeJSLowerParameter()))"]
967967
case .rawValueEnum(_, let rawType):
968968
switch rawType {
969969
case .string:
@@ -976,7 +976,7 @@ struct StackCodegen {
976976
case .double:
977977
return ["_swift_js_push_f64(\(raw: accessor).bridgeJSLowerParameter())"]
978978
default:
979-
return ["_swift_js_push_int(Int32(\(raw: accessor).bridgeJSLowerParameter()))"]
979+
return ["_swift_js_push_i32(Int32(\(raw: accessor).bridgeJSLowerParameter()))"]
980980
}
981981
case .associatedValueEnum:
982982
return ["\(raw: accessor).bridgeJSLowerReturn()"]
@@ -1014,7 +1014,7 @@ struct StackCodegen {
10141014
}
10151015

10161016
statements.append("}")
1017-
statements.append("_swift_js_push_array_length(Int32(\(raw: accessor).count))")
1017+
statements.append("_swift_js_push_i32(Int32(\(raw: accessor).count))")
10181018
return statements
10191019
}
10201020

@@ -1037,7 +1037,7 @@ struct StackCodegen {
10371037
}
10381038

10391039
statements.append("}")
1040-
statements.append("_swift_js_push_int(__bjs_isSome_\(raw: varPrefix) ? 1 : 0)")
1040+
statements.append("_swift_js_push_i32(__bjs_isSome_\(raw: varPrefix) ? 1 : 0)")
10411041
return statements
10421042
}
10431043

@@ -1053,15 +1053,15 @@ struct StackCodegen {
10531053
"__bjs_str_\(raw: varPrefix).withUTF8 { ptr in _swift_js_push_string(ptr.baseAddress, Int32(ptr.count)) }",
10541054
]
10551055
case .int, .uint:
1056-
return ["_swift_js_push_int(Int32(\(raw: unwrappedVar)))"]
1056+
return ["_swift_js_push_i32(Int32(\(raw: unwrappedVar)))"]
10571057
case .bool:
1058-
return ["_swift_js_push_int(\(raw: unwrappedVar) ? 1 : 0)"]
1058+
return ["_swift_js_push_i32(\(raw: unwrappedVar) ? 1 : 0)"]
10591059
case .float:
10601060
return ["_swift_js_push_f32(\(raw: unwrappedVar))"]
10611061
case .double:
10621062
return ["_swift_js_push_f64(\(raw: unwrappedVar))"]
10631063
case .caseEnum:
1064-
return ["_swift_js_push_int(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1064+
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
10651065
case .rawValueEnum(_, let rawType):
10661066
switch rawType {
10671067
case .string:
@@ -1074,16 +1074,16 @@ struct StackCodegen {
10741074
case .double:
10751075
return ["_swift_js_push_f64(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
10761076
default:
1077-
return ["_swift_js_push_int(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1077+
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
10781078
}
10791079
case .swiftStruct:
10801080
return ["\(raw: unwrappedVar).bridgeJSLowerReturn()"]
10811081
case .swiftHeapObject:
10821082
return ["_swift_js_push_pointer(\(raw: unwrappedVar).bridgeJSLowerReturn())"]
10831083
case .associatedValueEnum:
1084-
return ["_swift_js_push_int(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1084+
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
10851085
case .jsObject:
1086-
return ["_swift_js_push_int(\(raw: unwrappedVar).bridgeJSLowerReturn())"]
1086+
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerReturn())"]
10871087
case .array(let elementType):
10881088
return lowerArrayStatements(elementType: elementType, accessor: unwrappedVar, varPrefix: varPrefix)
10891089
default:

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,6 @@ public struct BridgeJSLink {
256256
"let \(JSGlueVariableScope.reservedTmpRetPointers) = [];",
257257
"let \(JSGlueVariableScope.reservedTmpParamPointers) = [];",
258258
"let \(JSGlueVariableScope.reservedTmpStructCleanups) = [];",
259-
"let \(JSGlueVariableScope.reservedTmpRetArrayLengths) = [];",
260-
"let \(JSGlueVariableScope.reservedTmpParamArrayLengths) = [];",
261259
"const \(JSGlueVariableScope.reservedEnumHelpers) = {};",
262260
"const \(JSGlueVariableScope.reservedStructHelpers) = {};",
263261
"",
@@ -392,7 +390,7 @@ public struct BridgeJSLink {
392390
printer.write("\(JSGlueVariableScope.reservedTmpRetTag) = tag;")
393391
}
394392
printer.write("}")
395-
printer.write("bjs[\"swift_js_push_int\"] = function(v) {")
393+
printer.write("bjs[\"swift_js_push_i32\"] = function(v) {")
396394
printer.indent {
397395
printer.write("\(JSGlueVariableScope.reservedTmpRetInts).push(v | 0);")
398396
}
@@ -416,17 +414,17 @@ public struct BridgeJSLink {
416414
printer.write("\(JSGlueVariableScope.reservedTmpRetStrings).push(value);")
417415
}
418416
printer.write("}")
419-
printer.write("bjs[\"swift_js_pop_param_int32\"] = function() {")
417+
printer.write("bjs[\"swift_js_pop_i32\"] = function() {")
420418
printer.indent {
421419
printer.write("return \(JSGlueVariableScope.reservedTmpParamInts).pop();")
422420
}
423421
printer.write("}")
424-
printer.write("bjs[\"swift_js_pop_param_f32\"] = function() {")
422+
printer.write("bjs[\"swift_js_pop_f32\"] = function() {")
425423
printer.indent {
426424
printer.write("return \(JSGlueVariableScope.reservedTmpParamF32s).pop();")
427425
}
428426
printer.write("}")
429-
printer.write("bjs[\"swift_js_pop_param_f64\"] = function() {")
427+
printer.write("bjs[\"swift_js_pop_f64\"] = function() {")
430428
printer.indent {
431429
printer.write("return \(JSGlueVariableScope.reservedTmpParamF64s).pop();")
432430
}
@@ -436,21 +434,11 @@ public struct BridgeJSLink {
436434
printer.write("\(JSGlueVariableScope.reservedTmpRetPointers).push(pointer);")
437435
}
438436
printer.write("}")
439-
printer.write("bjs[\"swift_js_pop_param_pointer\"] = function() {")
437+
printer.write("bjs[\"swift_js_pop_pointer\"] = function() {")
440438
printer.indent {
441439
printer.write("return \(JSGlueVariableScope.reservedTmpParamPointers).pop();")
442440
}
443441
printer.write("}")
444-
printer.write("bjs[\"swift_js_push_array_length\"] = function(len) {")
445-
printer.indent {
446-
printer.write("\(JSGlueVariableScope.reservedTmpRetArrayLengths).push(len | 0);")
447-
}
448-
printer.write("}")
449-
printer.write("bjs[\"swift_js_pop_param_array_length\"] = function() {")
450-
printer.indent {
451-
printer.write("return \(JSGlueVariableScope.reservedTmpParamArrayLengths).pop();")
452-
}
453-
printer.write("}")
454442
printer.write("bjs[\"swift_js_struct_cleanup\"] = function(cleanupId) {")
455443
printer.indent {
456444
printer.write("if (cleanupId === 0) { return; }")

Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ final class JSGlueVariableScope {
3131
static let reservedTmpRetPointers = "tmpRetPointers"
3232
static let reservedTmpParamPointers = "tmpParamPointers"
3333
static let reservedTmpStructCleanups = "tmpStructCleanups"
34-
static let reservedTmpRetArrayLengths = "tmpRetArrayLengths"
35-
static let reservedTmpParamArrayLengths = "tmpParamArrayLengths"
3634
static let reservedEnumHelpers = "enumHelpers"
3735
static let reservedStructHelpers = "structHelpers"
3836

@@ -62,8 +60,6 @@ final class JSGlueVariableScope {
6260
reservedTmpRetPointers,
6361
reservedTmpParamPointers,
6462
reservedTmpStructCleanups,
65-
reservedTmpRetArrayLengths,
66-
reservedTmpParamArrayLengths,
6763
reservedEnumHelpers,
6864
reservedStructHelpers,
6965
]
@@ -2172,7 +2168,7 @@ struct IntrinsicJSFragment: Sendable {
21722168
}
21732169
}
21742170
printer.write("}")
2175-
printer.write("\(JSGlueVariableScope.reservedTmpParamArrayLengths).push(\(arr).length);")
2171+
printer.write("\(JSGlueVariableScope.reservedTmpParamInts).push(\(arr).length);")
21762172
cleanupCode.write("for (const cleanup of \(cleanupArrayVar)) { cleanup(); }")
21772173
return []
21782174
}
@@ -2188,7 +2184,7 @@ struct IntrinsicJSFragment: Sendable {
21882184
let lenVar = scope.variable("arrayLen")
21892185
let iVar = scope.variable("i")
21902186

2191-
printer.write("const \(lenVar) = \(JSGlueVariableScope.reservedTmpRetArrayLengths).pop();")
2187+
printer.write("const \(lenVar) = \(JSGlueVariableScope.reservedTmpRetInts).pop();")
21922188
printer.write("const \(resultVar) = [];")
21932189
printer.write("for (let \(iVar) = 0; \(iVar) < \(lenVar); \(iVar)++) {")
21942190
printer.indent {

0 commit comments

Comments
 (0)