Skip to content

Commit 9065f02

Browse files
committed
jextract: use SwiftValueLayout.has32bitSwiftInt helper for range checks
1 parent 5f1f97c commit 9065f02

6 files changed

Lines changed: 173 additions & 129 deletions

File tree

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 79 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ extension FFMSwift2JavaGenerator {
1919
_ printer: inout CodePrinter,
2020
_ decl: ImportedFunc
2121
) {
22-
guard let _ = translatedDecl(for: decl) else {
22+
guard translatedDecl(for: decl) != nil else {
2323
// Failed to translate. Skip.
2424
return
2525
}
@@ -65,7 +65,7 @@ extension FFMSwift2JavaGenerator {
6565
printJavaBindingDowncallMethod(&printer, cFunc)
6666
if let outCallback = translated.translatedSignature.result.outCallback {
6767
printUpcallParameterDescriptorClasses(&printer, outCallback)
68-
} else { // FIXME: not an "else"
68+
} else { // FIXME: not an "else"
6969
printParameterDescriptorClasses(&printer, cFunc)
7070
}
7171
}
@@ -109,13 +109,13 @@ extension FFMSwift2JavaGenerator {
109109
var params: [String] = []
110110
var args: [String] = []
111111
for param in cFunc.parameters {
112-
let name = param.name! // !-safe, because cdecl lowering guarantees the parameter named.
112+
let name = param.name! // !-safe, because cdecl lowering guarantees the parameter named.
113113

114114
let annotationsStr =
115115
if param.type.javaType.parameterAnnotations.isEmpty {
116116
""
117117
} else {
118-
param.type.javaType.parameterAnnotations.map({$0.render()}).joined(separator: " ") + " "
118+
param.type.javaType.parameterAnnotations.map({ $0.render() }).joined(separator: " ") + " "
119119
}
120120
params.append("\(annotationsStr)\(param.type.javaType) \(name)")
121121
args.append(name)
@@ -156,14 +156,15 @@ extension FFMSwift2JavaGenerator {
156156
continue
157157
}
158158
}
159-
}
160-
159+
}
160+
161161
func printUpcallParameterDescriptorClasses(
162162
_ printer: inout CodePrinter,
163163
_ outCallback: OutCallback
164164
) {
165165
let name = outCallback.name
166-
printFunctionPointerParameterDescriptorClass(&printer, name, outCallback.cFunc.functionType, impl: outCallback)
166+
printFunctionPointerParameterDescriptorClass(
167+
&printer, name, outCallback.cFunc.functionType, impl: outCallback)
167168
}
168169

169170
/// Print a class describing a function pointer parameter type.
@@ -181,7 +182,7 @@ extension FFMSwift2JavaGenerator {
181182
/// }
182183
/// }
183184
/// ```
184-
///
185+
///
185186
/// If a `functionBody` is provided, a `Function$Impl` class will be emitted as well.
186187
func printFunctionPointerParameterDescriptorClass(
187188
_ printer: inout CodePrinter,
@@ -192,10 +193,10 @@ extension FFMSwift2JavaGenerator {
192193
let cResultType: CType
193194
let cParameterTypes: [CType]
194195
if case .pointer(.function(let _cResultType, let _cParameterTypes, variadic: false)) = cType {
195-
cResultType = _cResultType
196+
cResultType = _cResultType
196197
cParameterTypes = _cParameterTypes
197198
} else if case .function(let _cResultType, let _cParameterTypes, variadic: false) = cType {
198-
cResultType = _cResultType
199+
cResultType = _cResultType
199200
cParameterTypes = _cParameterTypes
200201
} else {
201202
fatalError("must be a C function (pointer) type; name=\(name), cType=\(cType)")
@@ -204,7 +205,7 @@ extension FFMSwift2JavaGenerator {
204205
let cParams = cParameterTypes.enumerated().map { i, ty in
205206
CParameter(name: "_\(i)", type: ty)
206207
}
207-
let paramDecls = cParams.map({"\($0.type.javaType) \($0.name!)"})
208+
let paramDecls = cParams.map({ "\($0.type.javaType) \($0.name!)" })
208209

209210
printer.printBraceBlock(
210211
"""
@@ -224,7 +225,7 @@ extension FFMSwift2JavaGenerator {
224225
}
225226
"""
226227
)
227-
228+
228229
if let impl {
229230
printer.print(
230231
"""
@@ -236,7 +237,7 @@ extension FFMSwift2JavaGenerator {
236237
}
237238
"""
238239
)
239-
}
240+
}
240241

241242
printFunctionDescriptorDefinition(&printer, cResultType, cParams)
242243
printer.print(
@@ -308,7 +309,7 @@ extension FFMSwift2JavaGenerator {
308309
"""
309310
)
310311

311-
let cdeclParams = functionType.cdeclType.parameters.map( { "\($0.parameterName!)" })
312+
let cdeclParams = functionType.cdeclType.parameters.map({ "\($0.parameterName!)" })
312313

313314
printer.printBraceBlock(
314315
"""
@@ -360,7 +361,8 @@ extension FFMSwift2JavaGenerator {
360361
let translatedSignature = translated.translatedSignature
361362
let returnTy = translatedSignature.result.javaResultType
362363

363-
var annotationsStr = translatedSignature.annotations.map({ $0.render() }).joined(separator: "\n")
364+
var annotationsStr = translatedSignature.annotations.map({ $0.render() }).joined(
365+
separator: "\n")
364366
if !annotationsStr.isEmpty { annotationsStr += "\n" }
365367

366368
var paramDecls = translatedSignature.parameters
@@ -380,7 +382,7 @@ extension FFMSwift2JavaGenerator {
380382
\(annotationsStr)\(modifiers) \(returnTy) \(methodName)(\(paramDecls.joined(separator: ", ")))
381383
"""
382384
) { printer in
383-
if case .instance(_) = decl.functionSignature.selfParameter {
385+
if case .instance(_) = decl.functionSignature.selfParameter {
384386
// Make sure the object has not been destroyed.
385387
printer.print("$ensureAlive();")
386388
}
@@ -401,7 +403,7 @@ extension FFMSwift2JavaGenerator {
401403

402404
if translatedSignature.requiresTemporaryArena {
403405
printer.print("try(var arena$ = Arena.ofConfined()) {")
404-
printer.indent();
406+
printer.indent()
405407
}
406408

407409
//=== Part 1.5: integer range checks (before any narrowing casts).
@@ -438,14 +440,16 @@ extension FFMSwift2JavaGenerator {
438440
}
439441
let memoryLayout = renderMemoryLayoutValue(for: type)
440442

441-
let arena = if let className = type.className,
442-
analysis.importedTypes[className] != nil {
443-
// Use passed-in 'SwiftArena' for 'SwiftValue'.
444-
"swiftArena$"
445-
} else {
446-
// Otherwise use the temporary 'Arena'.
447-
"arena$"
448-
}
443+
let arena =
444+
if let className = type.className,
445+
analysis.importedTypes[className] != nil
446+
{
447+
// Use passed-in 'SwiftArena' for 'SwiftValue'.
448+
"swiftArena$"
449+
} else {
450+
// Otherwise use the temporary 'Arena'.
451+
"arena$"
452+
}
449453

450454
// FIXME: use trailing$ convention
451455
let varName = outParameter.name.isEmpty ? "_result" : "_result_" + outParameter.name
@@ -457,7 +461,7 @@ extension FFMSwift2JavaGenerator {
457461
}
458462

459463
let thunkName = thunkNameRegistry.functionThunkName(decl: decl)
460-
464+
461465
if let outCallback = translatedSignature.result.outCallback {
462466
let funcName = outCallback.name
463467
assert(funcName.first == "$", "OutCallback names must start with $")
@@ -479,9 +483,9 @@ extension FFMSwift2JavaGenerator {
479483
} else {
480484
let placeholder: String
481485
let placeholderForDowncall: String?
482-
486+
483487
if let outCallback = translatedSignature.result.outCallback {
484-
placeholder = "\(outCallback.name)" // the result will be read out from the _result_initialize java class
488+
placeholder = "\(outCallback.name)" // the result will be read out from the _result_initialize java class
485489
placeholderForDowncall = "\(downCall)"
486490
} else if translatedSignature.result.outParameters.isEmpty {
487491
placeholder = downCall
@@ -492,13 +496,14 @@ extension FFMSwift2JavaGenerator {
492496
placeholderForDowncall = nil
493497
placeholder = "_result"
494498
}
495-
let result = translatedSignature.result.conversion.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
499+
let result = translatedSignature.result.conversion.render(
500+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
496501

497502
if translatedSignature.result.javaResultType != .void {
498503
switch translatedSignature.result.conversion {
499504
case .initializeResultWithUpcall(_, let extractResult):
500-
printer.print("\(result);") // the result in the callback situation is a series of setup steps
501-
printer.print("return \(extractResult.render(&printer, placeholder));") // extract the actual result
505+
printer.print("\(result);") // the result in the callback situation is a series of setup steps
506+
printer.print("return \(extractResult.render(&printer, placeholder));") // extract the actual result
502507
default:
503508
printer.print("return \(result);")
504509
}
@@ -519,7 +524,7 @@ extension FFMSwift2JavaGenerator {
519524
rangeCheck: IntegerRangeCheck
520525
) {
521526
if rangeCheck.onlyWhenSwiftIntIs32Bit {
522-
printer.print("if (SwiftValueLayout.SWIFT_INT == ValueLayout.JAVA_INT) {")
527+
printer.print("if (SwiftValueLayout.has32bitSwiftInt()) {")
523528
printer.indent()
524529
}
525530

@@ -565,11 +570,11 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
565570
case .call(let inner, let base, _, _):
566571
return inner.requiresSwiftArena || (base?.requiresSwiftArena == true)
567572

568-
case .cast(let inner, _),
569-
.construct(let inner, _),
570-
.method(let inner, _, _, _),
571-
.property(let inner, _),
572-
.swiftValueSelfSegment(let inner):
573+
case .cast(let inner, _),
574+
.construct(let inner, _),
575+
.method(let inner, _, _, _),
576+
.property(let inner, _),
577+
.swiftValueSelfSegment(let inner):
573578
return inner.requiresSwiftArena
574579

575580
case .commaSeparated(let list, _):
@@ -592,16 +597,17 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
592597
return true
593598
case .introduceVariable(_, let value):
594599
return value.requiresTemporaryArena
595-
case .cast(let inner, _),
596-
.construct(let inner, _),
597-
.constructSwiftValue(let inner, _),
598-
.swiftValueSelfSegment(let inner),
599-
.wrapMemoryAddressUnsafe(let inner, _):
600+
case .cast(let inner, _),
601+
.construct(let inner, _),
602+
.constructSwiftValue(let inner, _),
603+
.swiftValueSelfSegment(let inner),
604+
.wrapMemoryAddressUnsafe(let inner, _):
600605
return inner.requiresSwiftArena
601606
case .call(let inner, let base, _, let withArena):
602607
return withArena || (base?.requiresTemporaryArena == true) || inner.requiresTemporaryArena
603608
case .method(let inner, _, let args, let withArena):
604-
return withArena || inner.requiresTemporaryArena || args.contains(where: { $0.requiresTemporaryArena })
609+
return withArena || inner.requiresTemporaryArena
610+
|| args.contains(where: { $0.requiresTemporaryArena })
605611
case .property(let inner, _):
606612
return inner.requiresTemporaryArena
607613
case .commaSeparated(let list, _):
@@ -610,7 +616,9 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
610616
}
611617

612618
/// Returns the conversion string applied to the placeholder.
613-
func render(_ printer: inout CodePrinter, _ placeholder: String, placeholderForDowncall: String? = nil) -> String {
619+
func render(
620+
_ printer: inout CodePrinter, _ placeholder: String, placeholderForDowncall: String? = nil
621+
) -> String {
614622
// NOTE: 'printer' is used if the conversion wants to cause side-effects.
615623
// E.g. storing a temporary values into a variable.
616624
switch self {
@@ -626,7 +634,7 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
626634
case .placeholderForSwiftThunkName:
627635
if let placeholderForDowncall {
628636
let downcall = "\(placeholderForDowncall)"
629-
return String(downcall[..<(downcall.firstIndex(of: ".") ?? downcall.endIndex)]) // . separates thunk name from the `.call`
637+
return String(downcall[..<(downcall.firstIndex(of: ".") ?? downcall.endIndex)]) // . separates thunk name from the `.call`
630638
} else {
631639
return "/*placeholderForDowncall undefined!*/"
632640
}
@@ -639,24 +647,25 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
639647

640648
case .swiftValueSelfSegment:
641649
return "\(placeholder).$memorySegment()"
642-
650+
643651
case .javaNew(let value):
644-
return "new \(value.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall))"
652+
return
653+
"new \(value.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall))"
645654

646655
case .initializeResultWithUpcall(let steps, _):
647656
// TODO: could we use the printing to introduce the upcall handle instead?
648-
return steps.map { step in
657+
return steps.map { step in
649658
var printer = CodePrinter()
650659
var out = ""
651660
out += step.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
652661
out += printer.contents
653-
return out
662+
return out
654663
}.joined(separator: ";\n")
655664

656665
case .call(let inner, let base, let function, let withArena):
657666
let inner = inner.render(&printer, placeholder)
658667
let arenaArg = withArena ? ", arena$" : ""
659-
let baseStr : String =
668+
let baseStr: String =
660669
if let base {
661670
base.render(&printer, placeholder) + "."
662671
} else {
@@ -666,38 +675,47 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
666675

667676
// TODO: deduplicate with 'method'
668677
case .method(let inner, let methodName, let arguments, let withArena):
669-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
670-
let args = arguments.map { $0.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall) }
678+
let inner = inner.render(
679+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
680+
let args = arguments.map {
681+
$0.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
682+
}
671683
let argsStr = (args + (withArena ? ["arena$"] : [])).joined(separator: " ,")
672684
return "\(inner).\(methodName)(\(argsStr))"
673685

674686
case .property(let inner, let propertyName):
675-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
687+
let inner = inner.render(
688+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
676689
return "\(inner).\(propertyName)"
677690

678691
case .constructSwiftValue(let inner, let javaType):
679-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
692+
let inner = inner.render(
693+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
680694
return "new \(javaType.className!)(\(inner), swiftArena$)"
681695

682696
case .wrapMemoryAddressUnsafe(let inner, let javaType):
683-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
697+
let inner = inner.render(
698+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
684699
return "\(javaType.className!).wrapMemoryAddressUnsafe(\(inner), swiftArena$)"
685700

686701
case .construct(let inner, let javaType):
687-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
702+
let inner = inner.render(
703+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
688704
return "new \(javaType)(\(inner))"
689-
705+
690706
case .introduceVariable(let name, let value):
691-
let value = value.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
707+
let value = value.render(
708+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
692709
return "var \(name) = \(value);"
693710

694711
case .cast(let inner, let javaType):
695-
let inner = inner.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
712+
let inner = inner.render(
713+
&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
696714
return "(\(javaType)) \(inner)"
697715

698716
case .commaSeparated(let list, let separator):
699-
return list.map({
700-
$0.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
717+
return list.map({
718+
$0.render(&printer, placeholder, placeholderForDowncall: placeholderForDowncall)
701719
}).joined(separator: separator)
702720

703721
case .constant(let value):

0 commit comments

Comments
 (0)