Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,11 @@ struct CdeclLowering {
// Lower the self parameter.
let loweredSelf: LoweredParameter? =
switch signature.selfParameter {
case .instance(let selfParameter):
case .instance(let convention, let swiftType):
try lowerParameter(
selfParameter.type,
convention: selfParameter.convention,
parameterName: selfParameter.parameterName ?? "self",
swiftType,
convention: convention,
parameterName: "self",
genericParameters: signature.genericParameters,
genericRequirements: signature.genericRequirements
)
Expand Down Expand Up @@ -949,10 +949,10 @@ extension LoweredFunctionSignature {

let selfExpr: ExprSyntax?
switch original.selfParameter {
case .instance(let swiftSelf):
case .instance:
// Raise the 'self' from cdecl parameters.
selfExpr = self.selfParameter!.conversion.asExprSyntax(
placeholder: swiftSelf.parameterName ?? "self",
placeholder: "self",
bodyItems: &bodyItems
)
case .staticMethod(let selfType), .initializer(let selfType):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,11 @@ extension FFMSwift2JavaGenerator {

// 'self'
let selfParameter: TranslatedParameter?
if case .instance(let swiftSelf) = swiftSignature.selfParameter {
if case .instance(let convention, let swiftType) = swiftSignature.selfParameter {
selfParameter = try self.translateParameter(
type: swiftSelf.type,
convention: swiftSelf.convention,
parameterName: swiftSelf.parameterName ?? "self",
type: swiftType,
convention: convention,
parameterName: "self",
loweredParam: loweredFunctionSignature.selfParameter!,
methodName: methodName,
genericParameters: swiftSignature.genericParameters,
Expand Down
12 changes: 1 addition & 11 deletions Sources/JExtractSwiftLib/ImportedDecls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,7 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
}

var parentType: SwiftType? {
guard let selfParameter = functionSignature.selfParameter else {
return nil
}
switch selfParameter {
case .instance(let parameter):
return parameter.type
case .staticMethod(let type):
return type
case .initializer(let type):
return type
}
functionSignature.selfParameter?.selfType
}

/// If this function type uses types that require any additional `import` statements,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -399,12 +399,12 @@ extension JNISwift2JavaGenerator {
printer.printBraceBlock("public Discriminator getDiscriminator()") { printer in
printer.print("return Discriminator.values()[$getDiscriminator(this.$memoryAddress(), this.$typeMetadataAddress())];")
}
printer.print("private static native int $getDiscriminator(long self, long selfType);")
printer.print("private static native int $getDiscriminator(long selfPointer, long selfTypePointer);")
} else {
printer.printBraceBlock("public Discriminator getDiscriminator()") { printer in
printer.print("return Discriminator.values()[$getDiscriminator(this.$memoryAddress())];")
}
printer.print("private static native int $getDiscriminator(long self);")
printer.print("private static native int $getDiscriminator(long selfPointer);")
}
}

Expand Down Expand Up @@ -740,7 +740,7 @@ extension JNISwift2JavaGenerator {
private func printDestroyFunction(_ printer: inout CodePrinter, _ type: ImportedNominalType) {
let isGeneric = type.swiftNominal.isGeneric
if isGeneric {
printer.print("private static native void $destroy(long selfPointer, long selfType);")
printer.print("private static native void $destroy(long selfPointer, long selfTypePointer);")
} else {
printer.print("private static native void $destroy(long selfPointer);")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ extension JNISwift2JavaGenerator {
functionTypes: [],
translatedFunctionSignature: TranslatedFunctionSignature(
selfParameter: TranslatedParameter(
parameter: JavaParameter(name: "self", type: .long),
parameter: JavaParameter(name: "selfPointer", type: .long),
conversion: .aggregate(
[
.ifStatement(
Expand All @@ -164,7 +164,7 @@ extension JNISwift2JavaGenerator {
selfTypeParameter: !isGenericParent
? nil
: .init(
parameter: JavaParameter(name: "selfType", type: .long),
parameter: JavaParameter(name: "selfTypePointer", type: .long),
conversion: .typeMetadataAddress(.placeholder)
),
parameters: [],
Expand All @@ -179,15 +179,15 @@ extension JNISwift2JavaGenerator {
),
nativeFunctionSignature: NativeFunctionSignature(
selfParameter: NativeParameter(
parameters: [JavaParameter(name: "self", type: .long)],
parameters: [JavaParameter(name: "selfPointer", type: .long)],
conversion: .extractSwiftValue(.placeholder, swiftType: .nominal(enumCase.enumType), allowNil: false),
indirectConversion: nil,
conversionCheck: nil
),
selfTypeParameter: !isGenericParent
? nil
: .init(
parameters: [JavaParameter(name: "selfType", type: .long)],
parameters: [JavaParameter(name: "selfTypePointer", type: .long)],
conversion: .extractMetatypeValue(.placeholder),
indirectConversion: nil,
conversionCheck: nil
Expand Down Expand Up @@ -396,10 +396,10 @@ extension JNISwift2JavaGenerator {
genericRequirements: [SwiftGenericRequirement]
) throws -> TranslatedParameter? {
// 'self'
if case .instance(let swiftSelf) = selfParameter {
if case .instance(_, let swiftType) = selfParameter {
return try self.translateParameter(
swiftType: swiftSelf.type,
parameterName: swiftSelf.parameterName ?? "self",
swiftType: swiftType,
parameterName: "selfPointer",
methodName: methodName,
parentName: parentName,
genericParameters: genericParameters,
Expand All @@ -422,17 +422,11 @@ extension JNISwift2JavaGenerator {
return nil
}

let isGeneric =
switch selfParameter {
case .instance(let selfParameter):
selfParameter.type.asNominalTypeDeclaration?.isGeneric == true
case .initializer(let swiftType), .staticMethod(let swiftType):
swiftType.asNominalTypeDeclaration?.isGeneric == true
}
let isGeneric = selfParameter.selfType.asNominalTypeDeclaration?.isGeneric == true
if isGeneric {
return try self.translateParameter(
swiftType: .metatype(selfParameter.selfType),
parameterName: "selfType",
parameterName: "selfTypePointer",
methodName: methodName,
parentName: parentName,
genericParameters: genericParameters,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ extension JNISwift2JavaGenerator {
// Lower the self parameter.
let nativeSelf: NativeParameter? =
switch functionSignature.selfParameter {
case .instance(let selfParameter):
case .instance(_, let swiftType):
try translateParameter(
type: selfParameter.type,
parameterName: selfParameter.parameterName ?? "self",
type: swiftType,
parameterName: "selfPointer",
methodName: methodName,
parentName: parentName,
genericParameters: functionSignature.genericParameters,
Expand All @@ -68,7 +68,7 @@ extension JNISwift2JavaGenerator {
{
try translateParameter(
type: .metatype(selfType),
parameterName: "selfType",
parameterName: "selfTypePointer",
methodName: methodName,
parentName: parentName,
genericParameters: functionSignature.genericParameters,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ extension JNISwift2JavaGenerator {
let selfPointerParam = JavaParameter(name: "selfPointer", type: .long)
var parameters = [selfPointerParam]
if type.swiftNominal.isGeneric {
parameters.append(JavaParameter(name: "selfType", type: .long))
parameters.append(JavaParameter(name: "selfTypePointer", type: .long))
}

printCDecl(
Expand All @@ -315,7 +315,7 @@ extension JNISwift2JavaGenerator {
if type.swiftNominal.isGeneric {
let knownTypes = SwiftKnownTypes(symbolTable: lookupContext.symbolTable)
let discriminatorFunctionSignature = SwiftFunctionSignature(
selfParameter: .instance(SwiftParameter(convention: .byValue, parameterName: "selfPointer", type: type.swiftType)),
selfParameter: .instance(convention: .byValue, swiftType: type.swiftType),
parameters: [],
result: .init(convention: .direct, type: knownTypes.int),
effectSpecifiers: [],
Expand Down Expand Up @@ -391,7 +391,7 @@ extension JNISwift2JavaGenerator {
) { printer in
let selfPointer = enumCase.getAsCaseFunction.nativeFunctionSignature.selfParameter!.conversion.render(
&printer,
"self"
"selfPointer"
)
let caseNames = enumCase.original.parameters.enumerated().map { idx, parameter in
parameter.name ?? "_\(idx)"
Expand Down Expand Up @@ -598,10 +598,10 @@ extension JNISwift2JavaGenerator {
// Callee
let callee: String =
switch decl.functionSignature.selfParameter {
case .instance(let swiftSelf):
case .instance:
nativeSignature.selfParameter!.conversion.render(
&printer,
swiftSelf.parameterName ?? "self"
"selfPointer"
)
case .staticMethod(let selfType), .initializer(let selfType):
"\(selfType)"
Expand Down Expand Up @@ -819,7 +819,7 @@ extension JNISwift2JavaGenerator {
let selfPointerParam = JavaParameter(name: "selfPointer", type: .long)
var parameters = [selfPointerParam]
if type.swiftNominal.isGeneric {
parameters.append(JavaParameter(name: "selfType", type: .long))
parameters.append(JavaParameter(name: "selfTypePointer", type: .long))
}

printCDecl(
Expand All @@ -831,7 +831,7 @@ extension JNISwift2JavaGenerator {
) { printer in
if type.swiftNominal.isGeneric {
let destroyFunctionSignature = SwiftFunctionSignature(
selfParameter: .instance(SwiftParameter(convention: .byValue, parameterName: "selfPointer", type: type.swiftType)),
selfParameter: .instance(convention: .byValue, swiftType: type.swiftType),
parameters: [],
result: .void,
effectSpecifiers: [],
Expand Down Expand Up @@ -933,7 +933,7 @@ extension JNISwift2JavaGenerator {
}
let nativeSignature = translatedDecl.nativeFunctionSignature

let selfType = nativeSignature.selfTypeParameter!.conversion.render(&printer, "selfType")
let selfType = nativeSignature.selfTypeParameter!.conversion.render(&printer, "selfTypePointer")
let openerName = openerProtocolName(for: parentNominalType.nominalTypeDecl)
printer.print("let openerType = \(selfType) as! (any \(openerName).Type)")

Expand Down Expand Up @@ -1043,14 +1043,14 @@ extension JNISwift2JavaGenerator {
}

printer.printBraceBlock("static func _destroy(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, selfPointer: jlong)") { printer in
printer.print(#"assert(selfPointer != 0, "self memory address was null")"#)
printer.print("let selfBits$ = Int(Int64(fromJNI: selfPointer, in: environment))")
printer.print("let self$ = UnsafeMutablePointer<Self>(bitPattern: selfBits$)")
printer.printBraceBlock("guard let self$ else") { printer in
printer.print("fatalError(\"self memory address was null in call to \\(#function)!\")")
printer.print(#"assert(selfPointer != 0, "selfPointer memory address was null")"#)
printer.print("let selfPointerBits$ = Int(Int64(fromJNI: selfPointer, in: environment))")
printer.print("let selfPointer$ = UnsafeMutablePointer<Self>(bitPattern: selfPointerBits$)")
printer.printBraceBlock("guard let selfPointer$ else") { printer in
printer.print("fatalError(\"selfPointer memory address was null in call to \\(#function)!\")")
}
printer.print("self$.deinitialize(count: 1)")
printer.print("self$.deallocate()")
printer.print("selfPointer$.deinitialize(count: 1)")
printer.print("selfPointer$.deallocate()")
}
}
}
Expand All @@ -1063,16 +1063,16 @@ extension JNISwift2JavaGenerator {
swiftParentName: String,
_ selfPointerParam: JavaParameter
) -> String {
let newSelfParamName = "self$"
let newSelfParamName = "selfPointer$"
printer.print(
"""
guard let env$ = environment else {
fatalError("Missing JNIEnv in downcall to \\(#function)")
}
assert(\(selfPointerParam.name) != 0, "\(selfPointerParam.name) memory address was null")
let selfBits$ = Int(Int64(fromJNI: \(selfPointerParam.name), in: env$))
guard let \(newSelfParamName) = UnsafeMutablePointer<\(swiftParentName)>(bitPattern: selfBits$) else {
fatalError("self memory address was null in call to \\(#function)!")
let selfPointerBits$ = Int(Int64(fromJNI: \(selfPointerParam.name), in: env$))
guard let \(newSelfParamName) = UnsafeMutablePointer<\(swiftParentName)>(bitPattern: selfPointerBits$) else {
fatalError("selfPointer memory address was null in call to \\(#function)!")
}
"""
)
Expand Down
2 changes: 1 addition & 1 deletion Sources/JExtractSwiftLib/Swift2JavaVisitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ final class Swift2JavaVisitor {

let knownTypes = SwiftKnownTypes(symbolTable: translator.symbolTable)
let toStringFunctionSignature = SwiftFunctionSignature(
selfParameter: .instance(SwiftParameter(convention: .byValue, parameterName: "selfPointer", type: imported.swiftType)),
selfParameter: .instance(convention: .byValue, swiftType: imported.swiftType),
parameters: [],
result: SwiftResult(convention: .direct, type: knownTypes.string),
effectSpecifiers: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public struct SwiftFunctionSignature: Equatable {
/// Describes the "self" parameter of a Swift function signature.
enum SwiftSelfParameter: Equatable {
/// 'self' is an instance parameter.
case instance(SwiftParameter)
case instance(convention: SwiftParameterConvention, swiftType: SwiftType)

/// 'self' is a metatype for a static method. We only need the type to
/// form the call.
Expand All @@ -70,9 +70,7 @@ enum SwiftSelfParameter: Equatable {

var selfType: SwiftType {
switch self {
case .instance(let swiftParameter):
return swiftParameter.type
case .staticMethod(let swiftType), .initializer(let swiftType):
case .instance(_, let swiftType), .staticMethod(let swiftType), .initializer(let swiftType):
return swiftType
}
}
Expand Down Expand Up @@ -161,10 +159,8 @@ extension SwiftFunctionSignature {
selfParameter = .staticMethod(enclosingType)
} else {
selfParameter = .instance(
SwiftParameter(
convention: isMutating ? .inout : isConsuming ? .consuming : .byValue,
type: enclosingType
)
convention: isMutating ? .inout : isConsuming ? .consuming : .byValue,
swiftType: enclosingType
)
}
} else {
Expand Down Expand Up @@ -414,10 +410,8 @@ extension SwiftFunctionSignature {
return .staticMethod(enclosingType)
} else {
return .instance(
SwiftParameter(
convention: isSet && !enclosingType.isReferenceType ? .inout : .byValue,
type: enclosingType
)
convention: isSet && !enclosingType.isReferenceType ? .inout : .byValue,
swiftType: enclosingType
)
}
} else {
Expand Down
1 change: 0 additions & 1 deletion Sources/JExtractSwiftLib/SwiftTypes/SwiftParameter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ struct SwiftParameter: Equatable {
var argumentLabel: String?
var parameterName: String?
var type: SwiftType
var canBeDirectReturn = false
}

extension SwiftParameter: CustomStringConvertible {
Expand Down
2 changes: 1 addition & 1 deletion Tests/JExtractSwiftTests/DateTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ struct DateTests {
""",
"""
@_cdecl("Java_com_example_swift_Date__00024getTimeIntervalSince1970__J")
public func Java_com_example_swift_Date__00024getTimeIntervalSince1970__J(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, self: jlong) -> jdouble {
public func Java_com_example_swift_Date__00024getTimeIntervalSince1970__J(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, selfPointer: jlong) -> jdouble {
""",
]
)
Expand Down
Loading