@@ -44,7 +44,8 @@ extension Swift2JavaTranslator {
44
44
let loweredSelf = try signature. selfParameter. map { selfParameter in
45
45
try lowerParameter (
46
46
selfParameter. type,
47
- convention: selfParameter. convention, parameterName: " self "
47
+ convention: selfParameter. convention,
48
+ parameterName: selfParameter. parameterName ?? " self "
48
49
)
49
50
}
50
51
@@ -136,7 +137,7 @@ extension Swift2JavaTranslator {
136
137
case . metatype( let instanceType) :
137
138
return LoweredParameters (
138
139
cdeclToOriginal: . unsafeCastPointer(
139
- . passDirectly ( parameterName ) ,
140
+ . value ,
140
141
swiftType: instanceType
141
142
) ,
142
143
cdeclParameters: [
@@ -172,10 +173,10 @@ extension Swift2JavaTranslator {
172
173
switch nominal. nominalTypeDecl. kind {
173
174
case . actor , . class:
174
175
loweringStep =
175
- . unsafeCastPointer( . passDirectly ( parameterName ) , swiftType: type)
176
+ . unsafeCastPointer( . value , swiftType: type)
176
177
case . enum, . struct, . protocol:
177
178
loweringStep =
178
- . passIndirectly( . pointee( . typedPointer( . passDirectly ( parameterName ) , swiftType: type) ) )
179
+ . passIndirectly( . pointee( . typedPointer( . value , swiftType: type) ) )
179
180
}
180
181
181
182
return LoweredParameters (
@@ -226,7 +227,7 @@ extension Swift2JavaTranslator {
226
227
}
227
228
228
229
return LoweredParameters (
229
- cdeclToOriginal: . passDirectly ( parameterName ) ,
230
+ cdeclToOriginal: . value ,
230
231
cdeclParameters: [
231
232
SwiftParameter (
232
233
convention: convention,
@@ -247,7 +248,7 @@ extension Swift2JavaTranslator {
247
248
}
248
249
249
250
return LoweredParameters (
250
- cdeclToOriginal: . passDirectly ( parameterName ) ,
251
+ cdeclToOriginal: . value ,
251
252
cdeclParameters: [
252
253
SwiftParameter (
253
254
convention: convention,
@@ -281,30 +282,34 @@ extension Swift2JavaTranslator {
281
282
var cdeclToOriginal : LoweringStep
282
283
switch ( requiresArgument, hasCount) {
283
284
case ( false , false ) :
284
- cdeclToOriginal = . passDirectly ( parameterName )
285
+ cdeclToOriginal = . value
285
286
286
287
case ( true , false ) :
287
288
cdeclToOriginal = . typedPointer(
288
- . passDirectly ( parameterName + " _pointer " ) ,
289
+ . explodedComponent ( . value , component : " pointer " ) ,
289
290
swiftType: nominal. genericArguments![ 0 ]
290
291
)
291
292
292
293
case ( false , true ) :
293
294
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 " ) )
296
297
] )
297
298
298
299
case ( true , true ) :
299
300
cdeclToOriginal = . initialize(
300
301
type,
301
302
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
+ )
308
313
]
309
314
)
310
315
}
@@ -393,8 +398,12 @@ extension LabeledArgument: Equatable where Element: Equatable { }
393
398
/// and map them to the corresponding parameter (or result value) of the
394
399
/// original function.
395
400
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 )
398
407
399
408
/// Cast the pointer described by the lowering step to the given
400
409
/// Swift type using `unsafeBitCast(_:to:)`.
@@ -435,36 +444,39 @@ struct LoweredParameters: Equatable {
435
444
extension LoweredParameters {
436
445
/// Produce an expression that computes the argument for this parameter
437
446
/// 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 )
440
449
}
441
450
}
442
451
443
452
extension LoweringStep {
444
- func asExprSyntax( isSelf: Bool ) -> ExprSyntax {
453
+ func asExprSyntax( isSelf: Bool , value : String ) -> ExprSyntax {
445
454
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) " )
448
460
449
461
case . unsafeCastPointer( let step, swiftType: let swiftType) :
450
- let untypedExpr = step. asExprSyntax ( isSelf: false )
462
+ let untypedExpr = step. asExprSyntax ( isSelf: false , value : value )
451
463
return " unsafeBitCast( \( untypedExpr) , to: \( swiftType. metatypeReferenceExprSyntax) ) "
452
464
453
465
case . typedPointer( let step, swiftType: let type) :
454
- let untypedExpr = step. asExprSyntax ( isSelf: isSelf)
466
+ let untypedExpr = step. asExprSyntax ( isSelf: isSelf, value : value )
455
467
return " \( untypedExpr) .assumingMemoryBound(to: \( type. metatypeReferenceExprSyntax) ) "
456
468
457
469
case . pointee( let step) :
458
- let untypedExpr = step. asExprSyntax ( isSelf: isSelf)
470
+ let untypedExpr = step. asExprSyntax ( isSelf: isSelf, value : value )
459
471
return " \( untypedExpr) .pointee "
460
472
461
473
case . passIndirectly( let step) :
462
- let innerExpr = step. asExprSyntax ( isSelf: false )
474
+ let innerExpr = step. asExprSyntax ( isSelf: false , value : value )
463
475
return isSelf ? innerExpr : " & \( innerExpr) "
464
476
465
477
case . initialize( let type, arguments: let arguments) :
466
478
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 )
468
480
if let argmentLabel = labeledArgument. label {
469
481
return " \( argmentLabel) : \( renderedArg. description) "
470
482
} else {
@@ -478,8 +490,8 @@ extension LoweringStep {
478
490
return " \( raw: type. description) ( \( raw: renderedArgumentList) ) "
479
491
480
492
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
483
495
}
484
496
485
497
// FIXME: Should be able to use structured initializers here instead
@@ -520,19 +532,17 @@ extension LoweredFunctionSignature {
520
532
// Lower "self", if there is one.
521
533
let parametersToLower : ArraySlice < LoweredParameters >
522
534
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 " )
525
537
parametersToLower = parameters [ 1 ... ]
526
538
} else {
527
539
cdeclToOriginalSelf = nil
528
540
parametersToLower = parameters [ ... ]
529
541
}
530
542
531
543
// Lower the remaining arguments.
532
- // FIXME: Should be able to use structured initializers here instead
533
- // of splatting out text.
534
544
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 " )
536
546
if let argumentLabel = originalParam. argumentLabel {
537
547
return " \( argumentLabel) : \( cdeclToOriginalArg. description) "
538
548
} else {
@@ -559,7 +569,7 @@ extension LoweredFunctionSignature {
559
569
// into a
560
570
loweredCDecl. body = """
561
571
{
562
- \( result. cdeclToOriginalArgumentExpr ( isSelf: true ) ) = \( callExpression)
572
+ \( result. cdeclToOriginalArgumentExpr ( isSelf: true , value : " _result " ) ) = \( callExpression)
563
573
}
564
574
"""
565
575
} else {
0 commit comments