Skip to content

Commit b4b8027

Browse files
authored
Merge pull request #794 from PassiveLogic/kr/fix-import-stack-param-order
BridgeJS: Fix argument order for stack-lowered imported parameters
2 parents 0e35c39 + de3c2fe commit b4b8027

32 files changed

Lines changed: 832 additions & 264 deletions

Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/BridgeJS.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,8 @@ fileprivate func bjs_TS2Swift_convert_extern(_ self: Int32, _ tsBytes: Int32, _
264264
}
265265

266266
func _$TS2Swift_convert(_ self: JSObject, _ ts: String) throws(JSException) -> String {
267-
let selfValue = self.bridgeJSLowerParameter()
268267
let ret0 = ts.bridgeJSWithLoweredParameter { (tsBytes, tsLength) in
268+
let selfValue = self.bridgeJSLowerParameter()
269269
let ret = bjs_TS2Swift_convert(selfValue, tsBytes, tsLength)
270270
return ret
271271
}

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public struct ImportTS {
107107
let abiReturnType: WasmCoreType?
108108
// Track destructured variable names for multiple lowered parameters
109109
var destructuredVarNames: [String] = []
110-
// Stack-lowered parameters should be evaluated in reverse order to match LIFO stacks
110+
// Parameters are lowered in reverse order to match the LIFO stacks they push onto
111111
var stackLoweringStmts: [String] = []
112112
// Values to extend lifetime during call
113113
var valuesToExtendLifetimeDuringCall: [String] = []
@@ -206,12 +206,8 @@ public struct ImportTS {
206206
initializerExpr = ExprSyntax("\(raw: param.name).bridgeJSLowerParameter()")
207207
}
208208

209-
if loweringInfo.loweredParameters.isEmpty {
210-
stackLoweringStmts.insert("let _ = \(initializerExpr)", at: 0)
211-
return
212-
}
213-
214-
body.write("let \(pattern) = \(initializerExpr)")
209+
let binding = loweringInfo.loweredParameters.isEmpty ? "_" : pattern
210+
stackLoweringStmts.insert("let \(binding) = \(initializerExpr)", at: 0)
215211
}
216212
destructuredVarNames.append(contentsOf: destructuredNames)
217213

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
@JSFunction func roundtrip(_ items: [Int]) throws(JSException) -> [Int]
22
@JSFunction func logStrings(_ items: [String]) throws(JSException)
3+
4+
// An optional container lowers to an `isSome` parameter *and* a stack payload,
5+
// so it has to be ordered with the other stack-lowered parameters.
6+
@JSFunction func optionalArrayThenArray(_ a: [Int]?, _ b: [Int]) throws(JSException) -> Int
7+
@JSFunction func borrowedStringAroundStackParams(
8+
_ s: String,
9+
_ a: [Int]?,
10+
_ b: [Int]
11+
) throws(JSException) -> Int

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/AliasInClosure.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ private enum _BJS_Closure_10TestModuleAl7Polygon_Si {
2727
let callback = JSObject.bridgeJSLiftParameter(callbackId)
2828
return { [callback] param0 in
2929
#if arch(wasm32)
30-
let callbackValue = callback.bridgeJSLowerParameter()
3130
let param0Pointer = param0.bridgeJSLowerParameter()
31+
let callbackValue = callback.bridgeJSLowerParameter()
3232
let ret = invoke_js_callback_TestModule_10TestModuleAl7Polygon_Si(callbackValue, param0Pointer)
3333
return Int.bridgeJSLiftReturn(ret)
3434
#else

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/ArrayTypes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,8 @@ fileprivate func bjs_checkArrayWithLength_extern(_ a: Int32, _ b: Float64) -> Vo
534534
}
535535

536536
func _$checkArrayWithLength(_ a: JSObject, _ b: Double) throws(JSException) -> Void {
537-
let aValue = a.bridgeJSLowerParameter()
538537
let bValue = b.bridgeJSLowerParameter()
538+
let aValue = a.bridgeJSLowerParameter()
539539
bjs_checkArrayWithLength(aValue, bValue)
540540
if let error = _swift_js_take_exception() {
541541
throw error

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Async.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,8 @@ fileprivate func promise_reject_TestModule_extern(_ promise: Int32, _ valueKind:
350350
}
351351
352352
func _$Promise_reject(_ promise: JSObject, _ value: JSValue) throws(JSException) -> Void {
353-
let promiseValue = promise.bridgeJSLowerParameter()
354353
let (valueKind, valuePayload1, valuePayload2) = value.bridgeJSLowerParameter()
354+
let promiseValue = promise.bridgeJSLowerParameter()
355355
promise_reject_TestModule(promiseValue, valueKind, valuePayload1, valuePayload2)
356356
if let error = _swift_js_take_exception() { throw error }
357357
}
@@ -391,8 +391,8 @@ fileprivate func promise_resolve_TestModule_Si_extern(_ promise: Int32, _ value:
391391
}
392392
393393
func _$Promise_resolve_Si(_ promise: JSObject, _ value: Int) throws(JSException) -> Void {
394-
let promiseValue = promise.bridgeJSLowerParameter()
395394
let valueValue = value.bridgeJSLowerParameter()
395+
let promiseValue = promise.bridgeJSLowerParameter()
396396
promise_resolve_TestModule_Si(promiseValue, valueValue)
397397
if let error = _swift_js_take_exception() { throw error }
398398
}
@@ -412,8 +412,8 @@ fileprivate func promise_resolve_TestModule_SS_extern(_ promise: Int32, _ valueB
412412
}
413413
414414
func _$Promise_resolve_SS(_ promise: JSObject, _ value: String) throws(JSException) -> Void {
415-
let promiseValue = promise.bridgeJSLowerParameter()
416415
value.bridgeJSWithLoweredParameter { (valueBytes, valueLength) in
416+
let promiseValue = promise.bridgeJSLowerParameter()
417417
promise_resolve_TestModule_SS(promiseValue, valueBytes, valueLength)
418418
}
419419
if let error = _swift_js_take_exception() { throw error }
@@ -434,8 +434,8 @@ fileprivate func promise_resolve_TestModule_Sb_extern(_ promise: Int32, _ value:
434434
}
435435
436436
func _$Promise_resolve_Sb(_ promise: JSObject, _ value: Bool) throws(JSException) -> Void {
437-
let promiseValue = promise.bridgeJSLowerParameter()
438437
let valueValue = value.bridgeJSLowerParameter()
438+
let promiseValue = promise.bridgeJSLowerParameter()
439439
promise_resolve_TestModule_Sb(promiseValue, valueValue)
440440
if let error = _swift_js_take_exception() { throw error }
441441
}
@@ -455,8 +455,8 @@ fileprivate func promise_resolve_TestModule_Sf_extern(_ promise: Int32, _ value:
455455
}
456456
457457
func _$Promise_resolve_Sf(_ promise: JSObject, _ value: Float) throws(JSException) -> Void {
458-
let promiseValue = promise.bridgeJSLowerParameter()
459458
let valueValue = value.bridgeJSLowerParameter()
459+
let promiseValue = promise.bridgeJSLowerParameter()
460460
promise_resolve_TestModule_Sf(promiseValue, valueValue)
461461
if let error = _swift_js_take_exception() { throw error }
462462
}
@@ -476,8 +476,8 @@ fileprivate func promise_resolve_TestModule_Sd_extern(_ promise: Int32, _ value:
476476
}
477477
478478
func _$Promise_resolve_Sd(_ promise: JSObject, _ value: Double) throws(JSException) -> Void {
479-
let promiseValue = promise.bridgeJSLowerParameter()
480479
let valueValue = value.bridgeJSLowerParameter()
480+
let promiseValue = promise.bridgeJSLowerParameter()
481481
promise_resolve_TestModule_Sd(promiseValue, valueValue)
482482
if let error = _swift_js_take_exception() { throw error }
483483
}
@@ -497,8 +497,8 @@ fileprivate func promise_resolve_TestModule_8JSObjectC_extern(_ promise: Int32,
497497
}
498498
499499
func _$Promise_resolve_8JSObjectC(_ promise: JSObject, _ value: JSObject) throws(JSException) -> Void {
500-
let promiseValue = promise.bridgeJSLowerParameter()
501500
let valueValue = value.bridgeJSLowerParameter()
501+
let promiseValue = promise.bridgeJSLowerParameter()
502502
promise_resolve_TestModule_8JSObjectC(promiseValue, valueValue)
503503
if let error = _swift_js_take_exception() { throw error }
504504
}
@@ -518,8 +518,8 @@ fileprivate func promise_resolve_TestModule_10AsyncPointV_extern(_ promise: Int3
518518
}
519519
520520
func _$Promise_resolve_10AsyncPointV(_ promise: JSObject, _ value: AsyncPoint) throws(JSException) -> Void {
521-
let promiseValue = promise.bridgeJSLowerParameter()
522521
let valueObjectId = value.bridgeJSLowerParameter()
522+
let promiseValue = promise.bridgeJSLowerParameter()
523523
promise_resolve_TestModule_10AsyncPointV(promiseValue, valueObjectId)
524524
if let error = _swift_js_take_exception() { throw error }
525525
}
@@ -539,8 +539,8 @@ fileprivate func promise_resolve_TestModule_14AsyncDirectionO_extern(_ promise:
539539
}
540540
541541
func _$Promise_resolve_14AsyncDirectionO(_ promise: JSObject, _ value: AsyncDirection) throws(JSException) -> Void {
542-
let promiseValue = promise.bridgeJSLowerParameter()
543542
let valueValue = value.bridgeJSLowerParameter()
543+
let promiseValue = promise.bridgeJSLowerParameter()
544544
promise_resolve_TestModule_14AsyncDirectionO(promiseValue, valueValue)
545545
if let error = _swift_js_take_exception() { throw error }
546546
}
@@ -560,8 +560,8 @@ fileprivate func promise_resolve_TestModule_10AsyncThemeO_extern(_ promise: Int3
560560
}
561561
562562
func _$Promise_resolve_10AsyncThemeO(_ promise: JSObject, _ value: AsyncTheme) throws(JSException) -> Void {
563-
let promiseValue = promise.bridgeJSLowerParameter()
564563
value.bridgeJSWithLoweredParameter { (valueBytes, valueLength) in
564+
let promiseValue = promise.bridgeJSLowerParameter()
565565
promise_resolve_TestModule_10AsyncThemeO(promiseValue, valueBytes, valueLength)
566566
}
567567
if let error = _swift_js_take_exception() { throw error }
@@ -582,8 +582,8 @@ fileprivate func promise_resolve_TestModule_Sq14AsyncDirectionO_extern(_ promise
582582
}
583583
584584
func _$Promise_resolve_Sq14AsyncDirectionO(_ promise: JSObject, _ value: Optional<AsyncDirection>) throws(JSException) -> Void {
585-
let promiseValue = promise.bridgeJSLowerParameter()
586585
let (valueIsSome, valueValue) = value.bridgeJSLowerParameter()
586+
let promiseValue = promise.bridgeJSLowerParameter()
587587
promise_resolve_TestModule_Sq14AsyncDirectionO(promiseValue, valueIsSome, valueValue)
588588
if let error = _swift_js_take_exception() { throw error }
589589
}
@@ -603,8 +603,8 @@ fileprivate func promise_resolve_TestModule_Sq10AsyncThemeO_extern(_ promise: In
603603
}
604604
605605
func _$Promise_resolve_Sq10AsyncThemeO(_ promise: JSObject, _ value: Optional<AsyncTheme>) throws(JSException) -> Void {
606-
let promiseValue = promise.bridgeJSLowerParameter()
607606
value.bridgeJSWithLoweredParameter { (valueIsSome, valueBytes, valueLength) in
607+
let promiseValue = promise.bridgeJSLowerParameter()
608608
promise_resolve_TestModule_Sq10AsyncThemeO(promiseValue, valueIsSome, valueBytes, valueLength)
609609
}
610610
if let error = _swift_js_take_exception() { throw error }
@@ -625,8 +625,8 @@ fileprivate func promise_resolve_TestModule_Sq10AsyncPointV_extern(_ promise: In
625625
}
626626
627627
func _$Promise_resolve_Sq10AsyncPointV(_ promise: JSObject, _ value: Optional<AsyncPoint>) throws(JSException) -> Void {
628-
let promiseValue = promise.bridgeJSLowerParameter()
629628
let valueIsSome = value.bridgeJSLowerParameter()
629+
let promiseValue = promise.bridgeJSLowerParameter()
630630
promise_resolve_TestModule_Sq10AsyncPointV(promiseValue, valueIsSome)
631631
if let error = _swift_js_take_exception() { throw error }
632632
}
@@ -646,8 +646,8 @@ fileprivate func promise_resolve_TestModule_Sa10AsyncPointV_extern(_ promise: In
646646
}
647647
648648
func _$Promise_resolve_Sa10AsyncPointV(_ promise: JSObject, _ value: [AsyncPoint]) throws(JSException) -> Void {
649-
let promiseValue = promise.bridgeJSLowerParameter()
650649
let _ = value.bridgeJSLowerParameter()
650+
let promiseValue = promise.bridgeJSLowerParameter()
651651
promise_resolve_TestModule_Sa10AsyncPointV(promiseValue)
652652
if let error = _swift_js_take_exception() { throw error }
653653
}
@@ -667,8 +667,8 @@ fileprivate func promise_resolve_TestModule_Sa14AsyncDirectionO_extern(_ promise
667667
}
668668
669669
func _$Promise_resolve_Sa14AsyncDirectionO(_ promise: JSObject, _ value: [AsyncDirection]) throws(JSException) -> Void {
670-
let promiseValue = promise.bridgeJSLowerParameter()
671670
let _ = value.bridgeJSLowerParameter()
671+
let promiseValue = promise.bridgeJSLowerParameter()
672672
promise_resolve_TestModule_Sa14AsyncDirectionO(promiseValue)
673673
if let error = _swift_js_take_exception() { throw error }
674674
}
@@ -688,8 +688,8 @@ fileprivate func promise_resolve_TestModule_SD10AsyncPointV_extern(_ promise: In
688688
}
689689
690690
func _$Promise_resolve_SD10AsyncPointV(_ promise: JSObject, _ value: [String: AsyncPoint]) throws(JSException) -> Void {
691-
let promiseValue = promise.bridgeJSLowerParameter()
692691
let _ = value.bridgeJSLowerParameter()
692+
let promiseValue = promise.bridgeJSLowerParameter()
693693
promise_resolve_TestModule_SD10AsyncPointV(promiseValue)
694694
if let error = _swift_js_take_exception() { throw error }
695695
}
@@ -709,8 +709,8 @@ fileprivate func promise_resolve_TestModule_SD14AsyncDirectionO_extern(_ promise
709709
}
710710
711711
func _$Promise_resolve_SD14AsyncDirectionO(_ promise: JSObject, _ value: [String: AsyncDirection]) throws(JSException) -> Void {
712-
let promiseValue = promise.bridgeJSLowerParameter()
713712
let _ = value.bridgeJSLowerParameter()
713+
let promiseValue = promise.bridgeJSLowerParameter()
714714
promise_resolve_TestModule_SD14AsyncDirectionO(promiseValue)
715715
if let error = _swift_js_take_exception() { throw error }
716716
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/AsyncAssociatedValueEnum.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ fileprivate func promise_reject_TestModule_extern(_ promise: Int32, _ valueKind:
6767
}
6868
6969
func _$Promise_reject(_ promise: JSObject, _ value: JSValue) throws(JSException) -> Void {
70-
let promiseValue = promise.bridgeJSLowerParameter()
7170
let (valueKind, valuePayload1, valuePayload2) = value.bridgeJSLowerParameter()
71+
let promiseValue = promise.bridgeJSLowerParameter()
7272
promise_reject_TestModule(promiseValue, valueKind, valuePayload1, valuePayload2)
7373
if let error = _swift_js_take_exception() { throw error }
7474
}
@@ -88,8 +88,8 @@ fileprivate func promise_resolve_TestModule_18AsyncPayloadResultO_extern(_ promi
8888
}
8989
9090
func _$Promise_resolve_18AsyncPayloadResultO(_ promise: JSObject, _ value: AsyncPayloadResult) throws(JSException) -> Void {
91-
let promiseValue = promise.bridgeJSLowerParameter()
9291
let valueCaseId = value.bridgeJSLowerParameter()
92+
let promiseValue = promise.bridgeJSLowerParameter()
9393
promise_resolve_TestModule_18AsyncPayloadResultO(promiseValue, valueCaseId)
9494
if let error = _swift_js_take_exception() { throw error }
9595
}
@@ -109,8 +109,8 @@ fileprivate func promise_resolve_TestModule_Sq18AsyncPayloadResultO_extern(_ pro
109109
}
110110
111111
func _$Promise_resolve_Sq18AsyncPayloadResultO(_ promise: JSObject, _ value: Optional<AsyncPayloadResult>) throws(JSException) -> Void {
112-
let promiseValue = promise.bridgeJSLowerParameter()
113112
let (valueIsSome, valueCaseId) = value.bridgeJSLowerParameter()
113+
let promiseValue = promise.bridgeJSLowerParameter()
114114
promise_resolve_TestModule_Sq18AsyncPayloadResultO(promiseValue, valueIsSome, valueCaseId)
115115
if let error = _swift_js_take_exception() { throw error }
116116
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/AsyncImport.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ private enum _BJS_Closure_10TestModules7JSValueV_y {
2727
let callback = JSObject.bridgeJSLiftParameter(callbackId)
2828
return { [callback] param0 in
2929
#if arch(wasm32)
30-
let callbackValue = callback.bridgeJSLowerParameter()
3130
let (param0Kind, param0Payload1, param0Payload2) = param0.bridgeJSLowerParameter()
31+
let callbackValue = callback.bridgeJSLowerParameter()
3232
invoke_js_callback_TestModule_10TestModules7JSValueV_y(callbackValue, param0Kind, param0Payload1, param0Payload2)
3333
#else
3434
fatalError("Only available on WebAssembly")
@@ -88,8 +88,8 @@ private enum _BJS_Closure_10TestModules8JSObjectC_y {
8888
let callback = JSObject.bridgeJSLiftParameter(callbackId)
8989
return { [callback] param0 in
9090
#if arch(wasm32)
91-
let callbackValue = callback.bridgeJSLowerParameter()
9291
let param0Value = param0.bridgeJSLowerParameter()
92+
let callbackValue = callback.bridgeJSLowerParameter()
9393
invoke_js_callback_TestModule_10TestModules8JSObjectC_y(callbackValue, param0Value)
9494
#else
9595
fatalError("Only available on WebAssembly")
@@ -149,8 +149,8 @@ private enum _BJS_Closure_10TestModulesSS_y {
149149
let callback = JSObject.bridgeJSLiftParameter(callbackId)
150150
return { [callback] param0 in
151151
#if arch(wasm32)
152-
let callbackValue = callback.bridgeJSLowerParameter()
153152
param0.bridgeJSWithLoweredParameter { (param0Bytes, param0Length) in
153+
let callbackValue = callback.bridgeJSLowerParameter()
154154
invoke_js_callback_TestModule_10TestModulesSS_y(callbackValue, param0Bytes, param0Length)
155155
}
156156
#else
@@ -211,8 +211,8 @@ private enum _BJS_Closure_10TestModulesSb_y {
211211
let callback = JSObject.bridgeJSLiftParameter(callbackId)
212212
return { [callback] param0 in
213213
#if arch(wasm32)
214-
let callbackValue = callback.bridgeJSLowerParameter()
215214
let param0Value = param0.bridgeJSLowerParameter()
215+
let callbackValue = callback.bridgeJSLowerParameter()
216216
invoke_js_callback_TestModule_10TestModulesSb_y(callbackValue, param0Value)
217217
#else
218218
fatalError("Only available on WebAssembly")
@@ -272,8 +272,8 @@ private enum _BJS_Closure_10TestModulesSd_y {
272272
let callback = JSObject.bridgeJSLiftParameter(callbackId)
273273
return { [callback] param0 in
274274
#if arch(wasm32)
275-
let callbackValue = callback.bridgeJSLowerParameter()
276275
let param0Value = param0.bridgeJSLowerParameter()
276+
let callbackValue = callback.bridgeJSLowerParameter()
277277
invoke_js_callback_TestModule_10TestModulesSd_y(callbackValue, param0Value)
278278
#else
279279
fatalError("Only available on WebAssembly")
@@ -333,8 +333,8 @@ private enum _BJS_Closure_10TestModulesSi_y {
333333
let callback = JSObject.bridgeJSLiftParameter(callbackId)
334334
return { [callback] param0 in
335335
#if arch(wasm32)
336-
let callbackValue = callback.bridgeJSLowerParameter()
337336
let param0Value = param0.bridgeJSLowerParameter()
337+
let callbackValue = callback.bridgeJSLowerParameter()
338338
invoke_js_callback_TestModule_10TestModulesSi_y(callbackValue, param0Value)
339339
#else
340340
fatalError("Only available on WebAssembly")

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/AsyncStaticImport.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ private enum _BJS_Closure_10TestModules7JSValueV_y {
2727
let callback = JSObject.bridgeJSLiftParameter(callbackId)
2828
return { [callback] param0 in
2929
#if arch(wasm32)
30-
let callbackValue = callback.bridgeJSLowerParameter()
3130
let (param0Kind, param0Payload1, param0Payload2) = param0.bridgeJSLowerParameter()
31+
let callbackValue = callback.bridgeJSLowerParameter()
3232
invoke_js_callback_TestModule_10TestModules7JSValueV_y(callbackValue, param0Kind, param0Payload1, param0Payload2)
3333
#else
3434
fatalError("Only available on WebAssembly")
@@ -88,8 +88,8 @@ private enum _BJS_Closure_10TestModulesSd_y {
8888
let callback = JSObject.bridgeJSLiftParameter(callbackId)
8989
return { [callback] param0 in
9090
#if arch(wasm32)
91-
let callbackValue = callback.bridgeJSLowerParameter()
9291
let param0Value = param0.bridgeJSLowerParameter()
92+
let callbackValue = callback.bridgeJSLowerParameter()
9393
invoke_js_callback_TestModule_10TestModulesSd_y(callbackValue, param0Value)
9494
#else
9595
fatalError("Only available on WebAssembly")

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/DocComments.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ struct AnyListener: Listener, _BridgedSwiftProtocolWrapper {
22
let jsObject: JSObject
33

44
func onEvent(id: Int) -> Void {
5-
let jsObjectValue = jsObject.bridgeJSLowerParameter()
65
let idValue = id.bridgeJSLowerParameter()
6+
let jsObjectValue = jsObject.bridgeJSLowerParameter()
77
_extern_onEvent(jsObjectValue, idValue)
88
}
99

0 commit comments

Comments
 (0)