Skip to content

Commit aff35dd

Browse files
committed
Move "self" parameter to the end of the @_cdecl thunk
This matches what we're doing elsewhere, and also the way that the Swift calling convention is lowered to LLVM IR by the compiler.
1 parent 169b2f0 commit aff35dd

File tree

2 files changed

+23
-21
lines changed

2 files changed

+23
-21
lines changed

Sources/JExtractSwift/Swift2JavaTranslator+FunctionLowering.swift

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@ extension Swift2JavaTranslator {
4141
_ signature: SwiftFunctionSignature
4242
) throws -> LoweredFunctionSignature {
4343
// Lower all of the parameters.
44-
let loweredSelf = try signature.selfParameter.map { selfParameter in
45-
try lowerParameter(
46-
selfParameter.type,
47-
convention: selfParameter.convention,
48-
parameterName: selfParameter.parameterName ?? "self"
49-
)
50-
}
51-
5244
let loweredParameters = try signature.parameters.enumerated().map { (index, param) in
5345
try lowerParameter(
5446
param.type,
@@ -83,13 +75,17 @@ extension Swift2JavaTranslator {
8375
indirectResult = true
8476
}
8577

78+
let loweredSelf = try signature.selfParameter.map { selfParameter in
79+
try lowerParameter(
80+
selfParameter.type,
81+
convention: selfParameter.convention,
82+
parameterName: selfParameter.parameterName ?? "self"
83+
)
84+
}
85+
8686
// Collect all of the lowered parameters for the @_cdecl function.
8787
var allLoweredParameters: [LoweredParameters] = []
8888
var cdeclLoweredParameters: [SwiftParameter] = []
89-
if let loweredSelf {
90-
allLoweredParameters.append(loweredSelf)
91-
cdeclLoweredParameters.append(contentsOf: loweredSelf.cdeclParameters)
92-
}
9389
allLoweredParameters.append(contentsOf: loweredParameters)
9490
cdeclLoweredParameters.append(
9591
contentsOf: loweredParameters.flatMap { $0.cdeclParameters }
@@ -110,6 +106,11 @@ extension Swift2JavaTranslator {
110106
fatalError("Improper lowering of result for \(signature)")
111107
}
112108

109+
if let loweredSelf {
110+
allLoweredParameters.append(loweredSelf)
111+
cdeclLoweredParameters.append(contentsOf: loweredSelf.cdeclParameters)
112+
}
113+
113114
let cdeclSignature = SwiftFunctionSignature(
114115
isStaticOrClass: false,
115116
selfParameter: nil,
@@ -532,9 +533,10 @@ extension LoweredFunctionSignature {
532533
// Lower "self", if there is one.
533534
let parametersToLower: ArraySlice<LoweredParameters>
534535
let cdeclToOriginalSelf: ExprSyntax?
535-
if let originalSelfParam = original.selfParameter {
536-
cdeclToOriginalSelf = parameters[0].cdeclToOriginalArgumentExpr(isSelf: true, value: originalSelfParam.parameterName ?? "self")
537-
parametersToLower = parameters[1...]
536+
if let originalSelfParam = original.selfParameter,
537+
let selfParameter = parameters.last {
538+
cdeclToOriginalSelf = selfParameter.cdeclToOriginalArgumentExpr(isSelf: true, value: originalSelfParam.parameterName ?? "self")
539+
parametersToLower = parameters.dropLast()
538540
} else {
539541
cdeclToOriginalSelf = nil
540542
parametersToLower = parameters[...]

Tests/JExtractSwiftTests/FunctionLoweringTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ final class FunctionLoweringTests {
7878
enclosingType: "Point",
7979
expectedCDecl: """
8080
@_cdecl("c_shifted")
81-
func c_shifted(_ self: UnsafeRawPointer, _ delta_0: Double, _ delta_1: Double, _ _result: UnsafeMutableRawPointer) {
81+
func c_shifted(_ delta_0: Double, _ delta_1: Double, _ _result: UnsafeMutableRawPointer, _ self: UnsafeRawPointer) {
8282
_result.assumingMemoryBound(to: Point.self).pointee = self.assumingMemoryBound(to: Point.self).pointee.shifted(by: (delta_0, delta_1))
8383
}
8484
""",
85-
expectedCFunction: "void c_shifted(void const* self, double delta_0, double delta_1, void* _result)"
85+
expectedCFunction: "void c_shifted(double delta_0, double delta_1, void* _result, void const* self)"
8686
)
8787
}
8888

@@ -97,11 +97,11 @@ final class FunctionLoweringTests {
9797
enclosingType: "Point",
9898
expectedCDecl: """
9999
@_cdecl("c_shift")
100-
func c_shift(_ self: UnsafeMutableRawPointer, _ delta_0: Double, _ delta_1: Double) {
100+
func c_shift(_ delta_0: Double, _ delta_1: Double, _ self: UnsafeMutableRawPointer) {
101101
self.assumingMemoryBound(to: Point.self).pointee.shift(by: (delta_0, delta_1))
102102
}
103103
""",
104-
expectedCFunction: "void c_shift(void* self, double delta_0, double delta_1)"
104+
expectedCFunction: "void c_shift(double delta_0, double delta_1, void* self)"
105105
)
106106
}
107107

@@ -116,11 +116,11 @@ final class FunctionLoweringTests {
116116
enclosingType: "Point",
117117
expectedCDecl: """
118118
@_cdecl("c_shift")
119-
func c_shift(_ self: UnsafeRawPointer, _ delta_0: Double, _ delta_1: Double) {
119+
func c_shift(_ delta_0: Double, _ delta_1: Double, _ self: UnsafeRawPointer) {
120120
unsafeBitCast(self, to: Point.self).shift(by: (delta_0, delta_1))
121121
}
122122
""",
123-
expectedCFunction: "void c_shift(void const* self, double delta_0, double delta_1)"
123+
expectedCFunction: "void c_shift(double delta_0, double delta_1, void const* self)"
124124
)
125125
}
126126

0 commit comments

Comments
 (0)