Skip to content

Commit 169b2f0

Browse files
committed
Use placeholders rather than parameter names in cdecl-to-swift sequences
1 parent 68d48d4 commit 169b2f0

File tree

1 file changed

+46
-36
lines changed

1 file changed

+46
-36
lines changed

Sources/JExtractSwift/Swift2JavaTranslator+FunctionLowering.swift

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ extension Swift2JavaTranslator {
4444
let loweredSelf = try signature.selfParameter.map { selfParameter in
4545
try lowerParameter(
4646
selfParameter.type,
47-
convention: selfParameter.convention, parameterName: "self"
47+
convention: selfParameter.convention,
48+
parameterName: selfParameter.parameterName ?? "self"
4849
)
4950
}
5051

@@ -136,7 +137,7 @@ extension Swift2JavaTranslator {
136137
case .metatype(let instanceType):
137138
return LoweredParameters(
138139
cdeclToOriginal: .unsafeCastPointer(
139-
.passDirectly(parameterName),
140+
.value,
140141
swiftType: instanceType
141142
),
142143
cdeclParameters: [
@@ -172,10 +173,10 @@ extension Swift2JavaTranslator {
172173
switch nominal.nominalTypeDecl.kind {
173174
case .actor, .class:
174175
loweringStep =
175-
.unsafeCastPointer(.passDirectly(parameterName), swiftType: type)
176+
.unsafeCastPointer(.value, swiftType: type)
176177
case .enum, .struct, .protocol:
177178
loweringStep =
178-
.passIndirectly(.pointee( .typedPointer(.passDirectly(parameterName), swiftType: type)))
179+
.passIndirectly(.pointee(.typedPointer(.value, swiftType: type)))
179180
}
180181

181182
return LoweredParameters(
@@ -226,7 +227,7 @@ extension Swift2JavaTranslator {
226227
}
227228

228229
return LoweredParameters(
229-
cdeclToOriginal: .passDirectly(parameterName),
230+
cdeclToOriginal: .value,
230231
cdeclParameters: [
231232
SwiftParameter(
232233
convention: convention,
@@ -247,7 +248,7 @@ extension Swift2JavaTranslator {
247248
}
248249

249250
return LoweredParameters(
250-
cdeclToOriginal: .passDirectly(parameterName),
251+
cdeclToOriginal: .value,
251252
cdeclParameters: [
252253
SwiftParameter(
253254
convention: convention,
@@ -281,30 +282,34 @@ extension Swift2JavaTranslator {
281282
var cdeclToOriginal: LoweringStep
282283
switch (requiresArgument, hasCount) {
283284
case (false, false):
284-
cdeclToOriginal = .passDirectly(parameterName)
285+
cdeclToOriginal = .value
285286

286287
case (true, false):
287288
cdeclToOriginal = .typedPointer(
288-
.passDirectly(parameterName + "_pointer"),
289+
.explodedComponent(.value, component: "pointer"),
289290
swiftType: nominal.genericArguments![0]
290291
)
291292

292293
case (false, true):
293294
cdeclToOriginal = .initialize(type, arguments: [
294-
LabeledArgument(label: "start", argument: .passDirectly(parameterName + "_pointer")),
295-
LabeledArgument(label: "count", argument: .passDirectly(parameterName + "_count"))
295+
LabeledArgument(label: "start", argument: .explodedComponent(.value, component: "pointer")),
296+
LabeledArgument(label: "count", argument: .explodedComponent(.value, component: "count"))
296297
])
297298

298299
case (true, true):
299300
cdeclToOriginal = .initialize(
300301
type,
301302
arguments: [
302-
LabeledArgument(label: "start",
303-
argument: .typedPointer(
304-
.passDirectly(parameterName + "_pointer"),
305-
swiftType: nominal.genericArguments![0])),
306-
LabeledArgument(label: "count",
307-
argument: .passDirectly(parameterName + "_count"))
303+
LabeledArgument(
304+
label: "start",
305+
argument: .typedPointer(
306+
.explodedComponent(.value, component: "pointer"),
307+
swiftType: nominal.genericArguments![0])
308+
),
309+
LabeledArgument(
310+
label: "count",
311+
argument: .explodedComponent(.value, component: "count")
312+
)
308313
]
309314
)
310315
}
@@ -393,8 +398,12 @@ extension LabeledArgument: Equatable where Element: Equatable { }
393398
/// and map them to the corresponding parameter (or result value) of the
394399
/// original function.
395400
enum LoweringStep: Equatable {
396-
/// A direct reference to a parameter of the thunk.
397-
case passDirectly(String)
401+
/// The value being lowered.
402+
case value
403+
404+
/// A reference to a component in a value that has been exploded, such as
405+
/// a tuple element or part of a buffer pointer.
406+
indirect case explodedComponent(LoweringStep, component: String)
398407

399408
/// Cast the pointer described by the lowering step to the given
400409
/// Swift type using `unsafeBitCast(_:to:)`.
@@ -435,36 +444,39 @@ struct LoweredParameters: Equatable {
435444
extension LoweredParameters {
436445
/// Produce an expression that computes the argument for this parameter
437446
/// when calling the original function from the cdecl entrypoint.
438-
func cdeclToOriginalArgumentExpr(isSelf: Bool)-> ExprSyntax {
439-
cdeclToOriginal.asExprSyntax(isSelf: isSelf)
447+
func cdeclToOriginalArgumentExpr(isSelf: Bool, value: String)-> ExprSyntax {
448+
cdeclToOriginal.asExprSyntax(isSelf: isSelf, value: value)
440449
}
441450
}
442451

443452
extension LoweringStep {
444-
func asExprSyntax(isSelf: Bool) -> ExprSyntax {
453+
func asExprSyntax(isSelf: Bool, value: String) -> ExprSyntax {
445454
switch self {
446-
case .passDirectly(let rawArgument):
447-
return "\(raw: rawArgument)"
455+
case .value:
456+
return "\(raw: value)"
457+
458+
case .explodedComponent(let step, component: let component):
459+
return step.asExprSyntax(isSelf: false, value: "\(value)_\(component)")
448460

449461
case .unsafeCastPointer(let step, swiftType: let swiftType):
450-
let untypedExpr = step.asExprSyntax(isSelf: false)
462+
let untypedExpr = step.asExprSyntax(isSelf: false, value: value)
451463
return "unsafeBitCast(\(untypedExpr), to: \(swiftType.metatypeReferenceExprSyntax))"
452464

453465
case .typedPointer(let step, swiftType: let type):
454-
let untypedExpr = step.asExprSyntax(isSelf: isSelf)
466+
let untypedExpr = step.asExprSyntax(isSelf: isSelf, value: value)
455467
return "\(untypedExpr).assumingMemoryBound(to: \(type.metatypeReferenceExprSyntax))"
456468

457469
case .pointee(let step):
458-
let untypedExpr = step.asExprSyntax(isSelf: isSelf)
470+
let untypedExpr = step.asExprSyntax(isSelf: isSelf, value: value)
459471
return "\(untypedExpr).pointee"
460472

461473
case .passIndirectly(let step):
462-
let innerExpr = step.asExprSyntax(isSelf: false)
474+
let innerExpr = step.asExprSyntax(isSelf: false, value: value)
463475
return isSelf ? innerExpr : "&\(innerExpr)"
464476

465477
case .initialize(let type, arguments: let arguments):
466478
let renderedArguments: [String] = arguments.map { labeledArgument in
467-
let renderedArg = labeledArgument.argument.asExprSyntax(isSelf: false)
479+
let renderedArg = labeledArgument.argument.asExprSyntax(isSelf: false, value: value)
468480
if let argmentLabel = labeledArgument.label {
469481
return "\(argmentLabel): \(renderedArg.description)"
470482
} else {
@@ -478,8 +490,8 @@ extension LoweringStep {
478490
return "\(raw: type.description)(\(raw: renderedArgumentList))"
479491

480492
case .tuplify(let elements):
481-
let renderedElements: [String] = elements.map { element in
482-
element.asExprSyntax(isSelf: false).description
493+
let renderedElements: [String] = elements.enumerated().map { (index, element) in
494+
element.asExprSyntax(isSelf: false, value: "\(value)_\(index)").description
483495
}
484496

485497
// FIXME: Should be able to use structured initializers here instead
@@ -520,19 +532,17 @@ extension LoweredFunctionSignature {
520532
// Lower "self", if there is one.
521533
let parametersToLower: ArraySlice<LoweredParameters>
522534
let cdeclToOriginalSelf: ExprSyntax?
523-
if original.selfParameter != nil {
524-
cdeclToOriginalSelf = parameters[0].cdeclToOriginalArgumentExpr(isSelf: true)
535+
if let originalSelfParam = original.selfParameter {
536+
cdeclToOriginalSelf = parameters[0].cdeclToOriginalArgumentExpr(isSelf: true, value: originalSelfParam.parameterName ?? "self")
525537
parametersToLower = parameters[1...]
526538
} else {
527539
cdeclToOriginalSelf = nil
528540
parametersToLower = parameters[...]
529541
}
530542

531543
// Lower the remaining arguments.
532-
// FIXME: Should be able to use structured initializers here instead
533-
// of splatting out text.
534544
let cdeclToOriginalArguments = zip(parametersToLower, original.parameters).map { lowering, originalParam in
535-
let cdeclToOriginalArg = lowering.cdeclToOriginalArgumentExpr(isSelf: false)
545+
let cdeclToOriginalArg = lowering.cdeclToOriginalArgumentExpr(isSelf: false, value: originalParam.parameterName ?? "FIXME")
536546
if let argumentLabel = originalParam.argumentLabel {
537547
return "\(argumentLabel): \(cdeclToOriginalArg.description)"
538548
} else {
@@ -559,7 +569,7 @@ extension LoweredFunctionSignature {
559569
// into a
560570
loweredCDecl.body = """
561571
{
562-
\(result.cdeclToOriginalArgumentExpr(isSelf: true)) = \(callExpression)
572+
\(result.cdeclToOriginalArgumentExpr(isSelf: true, value: "_result")) = \(callExpression)
563573
}
564574
"""
565575
} else {

0 commit comments

Comments
 (0)