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
20 changes: 12 additions & 8 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,7 @@ public class ExportSwift {
/// Generates intermediate variables for stack-using parameters if needed for LIFO compatibility
private func generateParameterLifting() {
let stackParamIndices = parameters.enumerated().compactMap { index, param -> Int? in
switch param.type {
case .swiftStruct, .nullable(.swiftStruct, _),
.associatedValueEnum, .nullable(.associatedValueEnum, _),
.array:
return index
default:
return nil
}
param.type.isStackUsingParameter ? index : nil
}

guard stackParamIndices.count > 1 else { return }
Expand Down Expand Up @@ -1547,6 +1540,17 @@ extension BridgeType {
return false
}

var isStackUsingParameter: Bool {
switch self {
case .swiftStruct, .array, .dictionary, .associatedValueEnum:
return true
case .nullable(let wrapped, _):
return wrapped.isStackUsingParameter
default:
return false
}
}

struct LiftingIntrinsicInfo: Sendable {
let parameters: [(name: String, type: WasmCoreType)]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,19 @@
@JSFunction func importTransformNumbers(_ values: [Double]) throws(JSException) -> [Double]
@JSFunction func importProcessStrings(_ values: [String]) throws(JSException) -> [String]
@JSFunction func importProcessBooleans(_ values: [Bool]) throws(JSException) -> [Bool]

@JS func multiArrayParams(nums: [Int], strs: [String]) -> Int
@JS func multiOptionalArrayParams(a: [Int]?, b: [String]?) -> Int

@JS class MultiArrayContainer {
var nums: [Int]
var strs: [String]

@JS init(nums: [Int], strs: [String]) {
self.nums = nums
self.strs = strs
}

@JS var numbers: [Int] { nums }
@JS var strings: [String] { strs }
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,79 @@

],
"swiftCallName" : "Item"
},
{
"constructor" : {
"abiName" : "bjs_MultiArrayContainer_init",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : false
},
"parameters" : [
{
"label" : "nums",
"name" : "nums",
"type" : {
"array" : {
"_0" : {
"int" : {

}
}
}
}
},
{
"label" : "strs",
"name" : "strs",
"type" : {
"array" : {
"_0" : {
"string" : {

}
}
}
}
}
]
},
"methods" : [

],
"name" : "MultiArrayContainer",
"properties" : [
{
"isReadonly" : true,
"isStatic" : false,
"name" : "numbers",
"type" : {
"array" : {
"_0" : {
"int" : {

}
}
}
}
},
{
"isReadonly" : true,
"isStatic" : false,
"name" : "strings",
"type" : {
"array" : {
"_0" : {
"string" : {

}
}
}
}
}
],
"swiftCallName" : "MultiArrayContainer"
}
],
"enums" : [
Expand Down Expand Up @@ -1074,6 +1147,100 @@
}
}
}
},
{
"abiName" : "bjs_multiArrayParams",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : false
},
"name" : "multiArrayParams",
"parameters" : [
{
"label" : "nums",
"name" : "nums",
"type" : {
"array" : {
"_0" : {
"int" : {

}
}
}
}
},
{
"label" : "strs",
"name" : "strs",
"type" : {
"array" : {
"_0" : {
"string" : {

}
}
}
}
}
],
"returnType" : {
"int" : {

}
}
},
{
"abiName" : "bjs_multiOptionalArrayParams",
"effects" : {
"isAsync" : false,
"isStatic" : false,
"isThrows" : false
},
"name" : "multiOptionalArrayParams",
"parameters" : [
{
"label" : "a",
"name" : "a",
"type" : {
"nullable" : {
"_0" : {
"array" : {
"_0" : {
"int" : {

}
}
}
},
"_1" : "null"
}
}
},
{
"label" : "b",
"name" : "b",
"type" : {
"nullable" : {
"_0" : {
"array" : {
"_0" : {
"string" : {

}
}
}
},
"_1" : "null"
}
}
}
],
"returnType" : {
"int" : {

}
}
}
],
"protocols" : [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,32 @@ public func _bjs_processNestedJSObjectArray() -> Void {
#endif
}

@_expose(wasm, "bjs_multiArrayParams")
@_cdecl("bjs_multiArrayParams")
public func _bjs_multiArrayParams() -> Int32 {
#if arch(wasm32)
let _tmp_strs = [String].bridgeJSStackPop()
let _tmp_nums = [Int].bridgeJSStackPop()
let ret = multiArrayParams(nums: _tmp_nums, strs: _tmp_strs)
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_multiOptionalArrayParams")
@_cdecl("bjs_multiOptionalArrayParams")
public func _bjs_multiOptionalArrayParams() -> Int32 {
#if arch(wasm32)
let _tmp_b = Optional<[String]>.bridgeJSLiftParameter()
let _tmp_a = Optional<[Int]>.bridgeJSLiftParameter()
let ret = multiOptionalArrayParams(a: _tmp_a, b: _tmp_b)
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_Item_deinit")
@_cdecl("bjs_Item_deinit")
public func _bjs_Item_deinit(_ pointer: UnsafeMutableRawPointer) -> Void {
Expand Down Expand Up @@ -498,6 +524,69 @@ fileprivate func _bjs_Item_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> In
return _bjs_Item_wrap_extern(pointer)
}

@_expose(wasm, "bjs_MultiArrayContainer_init")
@_cdecl("bjs_MultiArrayContainer_init")
public func _bjs_MultiArrayContainer_init() -> UnsafeMutableRawPointer {
#if arch(wasm32)
let _tmp_strs = [String].bridgeJSStackPop()
let _tmp_nums = [Int].bridgeJSStackPop()
let ret = MultiArrayContainer(nums: _tmp_nums, strs: _tmp_strs)
return ret.bridgeJSLowerReturn()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_MultiArrayContainer_numbers_get")
@_cdecl("bjs_MultiArrayContainer_numbers_get")
public func _bjs_MultiArrayContainer_numbers_get(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
let ret = MultiArrayContainer.bridgeJSLiftParameter(_self).numbers
ret.bridgeJSStackPush()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_MultiArrayContainer_strings_get")
@_cdecl("bjs_MultiArrayContainer_strings_get")
public func _bjs_MultiArrayContainer_strings_get(_ _self: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
let ret = MultiArrayContainer.bridgeJSLiftParameter(_self).strings
ret.bridgeJSStackPush()
#else
fatalError("Only available on WebAssembly")
#endif
}

@_expose(wasm, "bjs_MultiArrayContainer_deinit")
@_cdecl("bjs_MultiArrayContainer_deinit")
public func _bjs_MultiArrayContainer_deinit(_ pointer: UnsafeMutableRawPointer) -> Void {
#if arch(wasm32)
Unmanaged<MultiArrayContainer>.fromOpaque(pointer).release()
#else
fatalError("Only available on WebAssembly")
#endif
}

extension MultiArrayContainer: ConvertibleToJSValue, _BridgedSwiftHeapObject {
var jsValue: JSValue {
return .object(JSObject(id: UInt32(bitPattern: _bjs_MultiArrayContainer_wrap(Unmanaged.passRetained(self).toOpaque()))))
}
}

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

#if arch(wasm32)
@_extern(wasm, module: "TestModule", name: "bjs_checkArray")
fileprivate func bjs_checkArray_extern(_ a: Int32) -> Void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,16 @@ export interface SwiftHeapObject {
}
export interface Item extends SwiftHeapObject {
}
export interface MultiArrayContainer extends SwiftHeapObject {
readonly numbers: number[];
readonly strings: string[];
}
export type Exports = {
Item: {
}
MultiArrayContainer: {
new(nums: number[], strs: string[]): MultiArrayContainer;
}
processIntArray(values: number[]): number[];
processStringArray(values: string[]): string[];
processDoubleArray(values: number[]): number[];
Expand All @@ -65,6 +72,8 @@ export type Exports = {
processJSObjectArray(objects: any[]): any[];
processOptionalJSObjectArray(objects: (any | null)[]): (any | null)[];
processNestedJSObjectArray(objects: any[][]): any[][];
multiArrayParams(nums: number[], strs: string[]): number;
multiOptionalArrayParams(a: number[] | null, b: string[] | null): number;
Direction: DirectionObject
Status: StatusObject
}
Expand Down
Loading