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
50 changes: 9 additions & 41 deletions Benchmarks/Sources/Generated/BridgeJS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1762,11 +1762,7 @@ public func _bjs_ArrayRoundtrip_makeOptionalPointArray(_ _self: UnsafeMutableRaw
#if arch(wasm32)
let ret = ArrayRoundtrip.bridgeJSLiftParameter(_self).makeOptionalPointArray()
for __bjs_elem_ret in ret {
let __bjs_isSome_ret_elem = __bjs_elem_ret != nil
if let __bjs_unwrapped_ret_elem = __bjs_elem_ret {
__bjs_unwrapped_ret_elem.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret_elem ? 1 : 0)
__bjs_elem_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(Int32(ret.count))
#else
Expand All @@ -1789,11 +1785,7 @@ public func _bjs_ArrayRoundtrip_roundtripOptionalPointArray(_ _self: UnsafeMutab
return __result
}())
for __bjs_elem_ret in ret {
let __bjs_isSome_ret_elem = __bjs_elem_ret != nil
if let __bjs_unwrapped_ret_elem = __bjs_elem_ret {
__bjs_unwrapped_ret_elem.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret_elem ? 1 : 0)
__bjs_elem_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(Int32(ret.count))
#else
Expand All @@ -1803,15 +1795,9 @@ public func _bjs_ArrayRoundtrip_roundtripOptionalPointArray(_ _self: UnsafeMutab

@_expose(wasm, "bjs_ArrayRoundtrip_takeOptionalArray")
@_cdecl("bjs_ArrayRoundtrip_takeOptionalArray")
public func _bjs_ArrayRoundtrip_takeOptionalArray(_ _self: UnsafeMutableRawPointer, _ values: Int32) -> Void {
public func _bjs_ArrayRoundtrip_takeOptionalArray(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
ArrayRoundtrip.bridgeJSLiftParameter(_self).takeOptionalArray(_: {
if values == 0 {
return Optional<[Int]>.none
} else {
return [Int].bridgeJSLiftParameter()
}
}())
ArrayRoundtrip.bridgeJSLiftParameter(_self).takeOptionalArray(_: Optional<[Int]>.bridgeJSLiftParameter())
#else
fatalError("Only available on WebAssembly")
#endif
Expand All @@ -1822,11 +1808,7 @@ public func _bjs_ArrayRoundtrip_takeOptionalArray(_ _self: UnsafeMutableRawPoint
public func _bjs_ArrayRoundtrip_makeOptionalArraySome(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
let ret = ArrayRoundtrip.bridgeJSLiftParameter(_self).makeOptionalArraySome()
let __bjs_isSome_ret = ret != nil
if let __bjs_unwrapped_ret = ret {
__bjs_unwrapped_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret ? 1 : 0)
ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
Expand All @@ -1837,32 +1819,18 @@ public func _bjs_ArrayRoundtrip_makeOptionalArraySome(_ _self: UnsafeMutableRawP
public func _bjs_ArrayRoundtrip_makeOptionalArrayNone(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
let ret = ArrayRoundtrip.bridgeJSLiftParameter(_self).makeOptionalArrayNone()
let __bjs_isSome_ret = ret != nil
if let __bjs_unwrapped_ret = ret {
__bjs_unwrapped_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret ? 1 : 0)
ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_ArrayRoundtrip_roundtripOptionalArray")
@_cdecl("bjs_ArrayRoundtrip_roundtripOptionalArray")
public func _bjs_ArrayRoundtrip_roundtripOptionalArray(_ _self: UnsafeMutableRawPointer, _ values: Int32) -> Void {
public func _bjs_ArrayRoundtrip_roundtripOptionalArray(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
let ret = ArrayRoundtrip.bridgeJSLiftParameter(_self).roundtripOptionalArray(_: {
if values == 0 {
return Optional<[Int]>.none
} else {
return [Int].bridgeJSLiftParameter()
}
}())
let __bjs_isSome_ret = ret != nil
if let __bjs_unwrapped_ret = ret {
__bjs_unwrapped_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret ? 1 : 0)
let ret = ArrayRoundtrip.bridgeJSLiftParameter(_self).roundtripOptionalArray(_: Optional<[Int]>.bridgeJSLiftParameter())
ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
Expand Down
79 changes: 15 additions & 64 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,27 +147,7 @@ public class ExportSwift {
} else {
optionalSwiftType = "JSUndefinedOr"
}
if case .array(let elementType) = wrappedType {
let arrayLift = StackCodegen().liftArrayExpression(elementType: elementType)
let isSomeParam = argumentsToLift[0]
let swiftTypeName = elementType.swiftType
typeNameForIntrinsic = "\(optionalSwiftType)<[\(swiftTypeName)]>"
let absentExpr =
kind == .null
? "\(optionalSwiftType)<[\(swiftTypeName)]>.none"
: "\(optionalSwiftType)<[\(swiftTypeName)]>.undefined"
liftingExpr = ExprSyntax(
"""
{
if \(raw: isSomeParam) == 0 {
return \(raw: absentExpr)
} else {
return \(arrayLift)
}
}()
"""
)
} else if case .swiftProtocol(let protocolName) = wrappedType {
if case .swiftProtocol(let protocolName) = wrappedType {
let wrapperName = "Any\(protocolName)"
typeNameForIntrinsic = "\(optionalSwiftType)<\(wrapperName)>"
liftingExpr = ExprSyntax(
Expand Down Expand Up @@ -919,43 +899,11 @@ struct StackCodegen {
let typeName = kind == .null ? "Optional" : "JSUndefinedOr"
switch wrappedType {
case .string, .int, .uint, .bool, .float, .double, .jsObject(nil), .jsValue,
.swiftStruct, .swiftHeapObject, .caseEnum, .associatedValueEnum, .rawValueEnum:
.swiftStruct, .swiftHeapObject, .caseEnum, .associatedValueEnum, .rawValueEnum,
.array, .dictionary:
return "\(raw: typeName)<\(raw: wrappedType.swiftType)>.bridgeJSLiftParameter()"
case .jsObject(let className?):
return "\(raw: typeName)<JSObject>.bridgeJSLiftParameter().map { \(raw: className)(unsafelyWrapping: $0) }"
case .array(let elementType):
let arrayLift = liftArrayExpression(elementType: elementType)
let swiftTypeName = elementType.swiftType
let absentExpr =
kind == .null
? "\(typeName)<[\(swiftTypeName)]>.none" : "\(typeName)<[\(swiftTypeName)]>.undefined"
return """
{
let __isSome = _swift_js_pop_i32()
if __isSome == 0 {
return \(raw: absentExpr)
} else {
return \(arrayLift)
}
}()
"""
case .dictionary(let valueType):
let dictionaryLift = liftDictionaryExpression(valueType: valueType)
let swiftTypeName = valueType.swiftType
let absentExpr =
kind == .null
? "\(typeName)<[String: \(swiftTypeName)]>.none"
: "\(typeName)<[String: \(swiftTypeName)]>.undefined"
return """
{
let __isSome = _swift_js_pop_i32()
if __isSome == 0 {
return \(raw: absentExpr)
} else {
return \(dictionaryLift)
}
}()
"""
case .nullable, .void, .namespaceEnum, .closure, .unsafePointer, .swiftProtocol:
fatalError("Invalid nullable wrapped type: \(wrappedType)")
}
Expand Down Expand Up @@ -1112,6 +1060,13 @@ struct StackCodegen {
accessor: String,
varPrefix: String
) -> [CodeBlockItemSyntax] {
switch wrappedType {
case .array, .dictionary, .swiftStruct:
return ["\(raw: accessor).bridgeJSLowerReturn()"]
default:
break
}

var statements: [String] = []
statements.append("let __bjs_isSome_\(varPrefix) = \(accessor) != nil")
statements.append("if let __bjs_unwrapped_\(varPrefix) = \(accessor) {")
Expand Down Expand Up @@ -1140,23 +1095,15 @@ struct StackCodegen {
case .string, .int, .uint, .bool, .float, .double, .jsValue:
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
case .caseEnum, .rawValueEnum:
// Enums conform to _BridgedSwiftStackType
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
case .swiftStruct:
return ["\(raw: unwrappedVar).bridgeJSLowerReturn()"]
case .swiftHeapObject:
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
case .associatedValueEnum:
// Push payloads via bridgeJSLowerParameter(), then push the returned case ID
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
case .jsObject(nil):
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
case .jsObject(_?):
return ["\(raw: unwrappedVar).jsObject.bridgeJSLowerStackReturn()"]
case .array(let elementType):
return lowerArrayStatements(elementType: elementType, accessor: unwrappedVar, varPrefix: varPrefix)
case .dictionary(let valueType):
return lowerDictionaryStatements(valueType: valueType, accessor: unwrappedVar, varPrefix: varPrefix)
default:
return ["preconditionFailure(\"BridgeJS: unsupported optional wrapped type\")"]
}
Expand Down Expand Up @@ -1834,8 +1781,12 @@ extension BridgeType {
case .swiftProtocol: return .jsObject
case .void: return .void
case .nullable(let wrappedType, _):
let wrappedInfo = try wrappedType.liftParameterInfo()
if wrappedInfo.parameters.isEmpty {
return LiftingIntrinsicInfo(parameters: [])
}
var optionalParams: [(name: String, type: WasmCoreType)] = [("isSome", .i32)]
optionalParams.append(contentsOf: try wrappedType.liftParameterInfo().parameters)
optionalParams.append(contentsOf: wrappedInfo.parameters)
return LiftingIntrinsicInfo(parameters: optionalParams)
case .caseEnum: return .caseEnum
case .rawValueEnum(_, let rawType):
Expand Down
9 changes: 6 additions & 3 deletions Plugins/BridgeJS/Sources/BridgeJSLink/JSGlueGen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,8 @@ struct IntrinsicJSFragment: Sendable {
}
printer.write("}")
cleanupCode.write("if (\(cleanupVar)) { \(cleanupVar)(); }")
return ["+\(isSomeVar)"]
printer.write("\(JSGlueVariableScope.reservedI32Stack).push(+\(isSomeVar));")
return []
case .string, .rawValueEnum(_, .string):
let bytesVar = scope.variable("\(value)Bytes")
let idVar = scope.variable("\(value)Id")
Expand Down Expand Up @@ -895,7 +896,8 @@ struct IntrinsicJSFragment: Sendable {
}
printer.write("}")
cleanupCode.write("for (const cleanup of \(cleanupArrayVar)) { cleanup(); }")
return ["+\(isSomeVar)"]
printer.write("\(JSGlueVariableScope.reservedI32Stack).push(+\(isSomeVar));")
return []
case .dictionary(let valueType):
let cleanupArrayVar = scope.variable("\(value)Cleanups")
printer.write("const \(cleanupArrayVar) = [];")
Expand All @@ -915,7 +917,8 @@ struct IntrinsicJSFragment: Sendable {
}
printer.write("}")
cleanupCode.write("for (const cleanup of \(cleanupArrayVar)) { cleanup(); }")
return ["+\(isSomeVar)"]
printer.write("\(JSGlueVariableScope.reservedI32Stack).push(+\(isSomeVar));")
return []
default:
switch wrappedType {
case .swiftHeapObject:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,20 +277,10 @@ public func _bjs_processOptionalStringArray() -> Void {

@_expose(wasm, "bjs_processOptionalArray")
@_cdecl("bjs_processOptionalArray")
public func _bjs_processOptionalArray(_ values: Int32) -> Void {
public func _bjs_processOptionalArray() -> Void {
#if arch(wasm32)
let ret = processOptionalArray(_: {
if values == 0 {
return Optional<[Int]>.none
} else {
return [Int].bridgeJSLiftParameter()
}
}())
let __bjs_isSome_ret = ret != nil
if let __bjs_unwrapped_ret = ret {
__bjs_unwrapped_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret ? 1 : 0)
let ret = processOptionalArray(_: Optional<[Int]>.bridgeJSLiftParameter())
ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
Expand All @@ -311,11 +301,7 @@ public func _bjs_processOptionalPointArray() -> Void {
return __result
}())
for __bjs_elem_ret in ret {
let __bjs_isSome_ret_elem = __bjs_elem_ret != nil
if let __bjs_unwrapped_ret_elem = __bjs_elem_ret {
__bjs_unwrapped_ret_elem.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_ret_elem ? 1 : 0)
__bjs_elem_ret.bridgeJSLowerReturn()
}
_swift_js_push_i32(Int32(ret.count))
#else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,9 @@ public func _bjs_testEmptyInit(_ greeter: UnsafeMutableRawPointer) -> UnsafeMuta

@_expose(wasm, "bjs_testOptionalStructDefault")
@_cdecl("bjs_testOptionalStructDefault")
public func _bjs_testOptionalStructDefault(_ point: Int32) -> Void {
public func _bjs_testOptionalStructDefault() -> Void {
#if arch(wasm32)
let ret = testOptionalStructDefault(point: Optional<Config>.bridgeJSLiftParameter(point))
let ret = testOptionalStructDefault(point: Optional<Config>.bridgeJSLiftParameter())
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
Expand All @@ -305,9 +305,9 @@ public func _bjs_testOptionalStructDefault(_ point: Int32) -> Void {

@_expose(wasm, "bjs_testOptionalStructWithValueDefault")
@_cdecl("bjs_testOptionalStructWithValueDefault")
public func _bjs_testOptionalStructWithValueDefault(_ point: Int32) -> Void {
public func _bjs_testOptionalStructWithValueDefault() -> Void {
#if arch(wasm32)
let ret = testOptionalStructWithValueDefault(point: Optional<Config>.bridgeJSLiftParameter(point))
let ret = testOptionalStructWithValueDefault(point: Optional<Config>.bridgeJSLiftParameter())
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ public func _bjs_mirrorDictionary() -> Void {

@_expose(wasm, "bjs_optionalDictionary")
@_cdecl("bjs_optionalDictionary")
public func _bjs_optionalDictionary(_ values: Int32) -> Void {
public func _bjs_optionalDictionary() -> Void {
#if arch(wasm32)
let ret = optionalDictionary(_: Optional<[String: String]>.bridgeJSLiftParameter(values))
let ret = optionalDictionary(_: Optional<[String: String]>.bridgeJSLiftParameter())
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -617,14 +617,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
case 3:
return .optNestedEnum(Optional<APIResult>.bridgeJSLiftParameter())
case 4:
return .optArray({
let __isSome = _swift_js_pop_i32()
if __isSome == 0 {
return Optional<[Int]>.none
} else {
return [Int].bridgeJSLiftParameter()
}
}())
return .optArray(Optional<[Int]>.bridgeJSLiftParameter())
case 5:
return .empty
default:
Expand All @@ -637,11 +630,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerParameter() -> Int32 {
switch self {
case .optStruct(let param0):
let __bjs_isSome_param0 = param0 != nil
if let __bjs_unwrapped_param0 = param0 {
__bjs_unwrapped_param0.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
param0.bridgeJSLowerReturn()
return Int32(0)
case .optClass(let param0):
let __bjs_isSome_param0 = param0 != nil
Expand All @@ -665,11 +654,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
return Int32(3)
case .optArray(let param0):
let __bjs_isSome_param0 = param0 != nil
if let __bjs_unwrapped_param0 = param0 {
__bjs_unwrapped_param0.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
param0.bridgeJSLowerReturn()
return Int32(4)
case .empty:
return Int32(5)
Expand All @@ -689,11 +674,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerReturn() {
switch self {
case .optStruct(let param0):
let __bjs_isSome_param0 = param0 != nil
if let __bjs_unwrapped_param0 = param0 {
__bjs_unwrapped_param0.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
param0.bridgeJSLowerReturn()
_swift_js_push_tag(Int32(0))
case .optClass(let param0):
let __bjs_isSome_param0 = param0 != nil
Expand All @@ -717,11 +698,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
_swift_js_push_tag(Int32(3))
case .optArray(let param0):
let __bjs_isSome_param0 = param0 != nil
if let __bjs_unwrapped_param0 = param0 {
__bjs_unwrapped_param0.bridgeJSLowerReturn()
}
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
param0.bridgeJSLowerReturn()
_swift_js_push_tag(Int32(4))
case .empty:
_swift_js_push_tag(Int32(5))
Expand Down
Loading