@@ -53,7 +53,8 @@ extension Swift2JavaTranslator {
53
53
if let outputFile = try printer. writeContents (
54
54
outputDirectory: outputDirectory,
55
55
javaPackagePath: javaPackagePath,
56
- filename: filename) {
56
+ filename: filename)
57
+ {
57
58
print ( " [swift-java] Generated: \( self . swiftModuleName) .java (at \( outputFile) " )
58
59
}
59
60
}
@@ -76,7 +77,8 @@ extension Swift2JavaTranslator {
76
77
if let outputFile = try printer. writeContents (
77
78
outputDirectory: outputDirectory,
78
79
javaPackagePath: nil ,
79
- filename: moduleFilename) {
80
+ filename: moduleFilename)
81
+ {
80
82
print ( " [swift-java] Generated: \( moduleFilenameBase. bold) .swift (at \( outputFile) " )
81
83
}
82
84
} catch {
@@ -95,7 +97,8 @@ extension Swift2JavaTranslator {
95
97
if let outputFile = try printer. writeContents (
96
98
outputDirectory: outputDirectory,
97
99
javaPackagePath: nil ,
98
- filename: filename) {
100
+ filename: filename)
101
+ {
99
102
print ( " [swift-java] Generated: \( fileNameBase. bold) .swift (at \( outputFile) " )
100
103
}
101
104
} catch {
@@ -133,12 +136,12 @@ extension Swift2JavaTranslator {
133
136
let stt = SwiftThunkTranslator ( self )
134
137
135
138
printer. print (
136
- """
137
- // Generated by swift-java
139
+ """
140
+ // Generated by swift-java
138
141
139
- import SwiftKitSwift
142
+ import SwiftKitSwift
140
143
141
- """
144
+ """
142
145
)
143
146
144
147
for thunk in stt. renderThunks ( forType: ty) {
@@ -291,6 +294,7 @@ extension Swift2JavaTranslator {
291
294
printer in
292
295
// ==== Storage of the class
293
296
printClassSelfProperty ( & printer, decl)
297
+ printStatusFlagsField ( & printer, decl)
294
298
295
299
// Constants
296
300
printClassConstants ( printer: & printer)
@@ -412,6 +416,21 @@ extension Swift2JavaTranslator {
412
416
)
413
417
}
414
418
419
+ private func printStatusFlagsField( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
420
+ printer. print (
421
+ """
422
+ // TODO: make this a flagset integer and/or use a field updater
423
+ /** Used to track additional state of the underlying object, e.g. if it was explicitly destroyed. */
424
+ private final AtomicBoolean $state$destroyed = new AtomicBoolean(false);
425
+
426
+ @Override
427
+ public final AtomicBoolean $statusDestroyedFlag() {
428
+ return this.$state$destroyed;
429
+ }
430
+ """
431
+ )
432
+ }
433
+
415
434
private func printClassMemoryLayout( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
416
435
printer. print (
417
436
"""
@@ -476,10 +495,10 @@ extension Swift2JavaTranslator {
476
495
printMethodDowncallHandleForAddrDesc ( & printer)
477
496
}
478
497
479
- printClassInitializerConstructors ( & printer, decl, parentName: parentName)
498
+ printNominalInitializerConstructors ( & printer, decl, parentName: parentName)
480
499
}
481
500
482
- public func printClassInitializerConstructors (
501
+ public func printNominalInitializerConstructors (
483
502
_ printer: inout CodePrinter ,
484
503
_ decl: ImportedFunc ,
485
504
parentName: TranslatedType
@@ -499,6 +518,25 @@ extension Swift2JavaTranslator {
499
518
"""
500
519
)
501
520
521
+ let initializeMemorySegment =
522
+ if let parent = decl. parent,
523
+ parent. isReferenceType
524
+ {
525
+ """
526
+ this.selfMemorySegment = (MemorySegment) mh$.invokeExact(
527
+ \( renderForwardJavaParams ( decl, paramPassingStyle: nil ) )
528
+ );
529
+ """
530
+ } else {
531
+ """
532
+ this.selfMemorySegment = arena.allocate($layout());
533
+ mh$.invokeExact(
534
+ \( renderForwardJavaParams ( decl, paramPassingStyle: nil ) ) ,
535
+ /* indirect return buffer */this.selfMemorySegment
536
+ );
537
+ """
538
+ }
539
+
502
540
printer. print (
503
541
"""
504
542
/**
@@ -514,7 +552,8 @@ extension Swift2JavaTranslator {
514
552
SwiftKit.traceDowncall( \( renderForwardJavaParams ( decl, paramPassingStyle: nil ) ) );
515
553
}
516
554
517
- this.selfMemorySegment = (MemorySegment) mh$.invokeExact( \( renderForwardJavaParams ( decl, paramPassingStyle: nil ) ) , TYPE_METADATA.$memorySegment());
555
+ \( initializeMemorySegment)
556
+
518
557
if (arena != null) {
519
558
arena.register(this);
520
559
}
@@ -666,9 +705,9 @@ extension Swift2JavaTranslator {
666
705
_ printer: inout CodePrinter , _ decl: ImportedFunc ,
667
706
accessorKind: VariableAccessorKind ? = nil
668
707
) {
669
- // var thunkName = SwiftKitPrinting.Names.functionThunk(
670
- // thunkNameRegistry: &self.thunkNameRegistry,
671
- // module: self.swiftModuleName, function: decl)
708
+ // var thunkName = SwiftKitPrinting.Names.functionThunk(
709
+ // thunkNameRegistry: &self.thunkNameRegistry,
710
+ // module: self.swiftModuleName, function: decl)
672
711
let thunkName = thunkNameRegistry. functionThunkName ( module: self . swiftModuleName, decl: decl)
673
712
printer. print (
674
713
"""
@@ -850,7 +889,9 @@ extension Swift2JavaTranslator {
850
889
}
851
890
}
852
891
853
- public func renderJavaParamDecls( _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ? ) -> String {
892
+ public func renderJavaParamDecls( _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ? )
893
+ -> String
894
+ {
854
895
var ps : [ String ] = [ ]
855
896
var pCounter = 0
856
897
@@ -872,7 +913,8 @@ extension Swift2JavaTranslator {
872
913
public func renderSwiftParamDecls(
873
914
_ decl: ImportedFunc ,
874
915
paramPassingStyle: SelfParameterVariant ? ,
875
- style: ParameterVariant ? = nil ) -> String {
916
+ style: ParameterVariant ? = nil
917
+ ) -> String {
876
918
var ps : [ String ] = [ ]
877
919
var pCounter = 0
878
920
@@ -887,7 +929,7 @@ extension Swift2JavaTranslator {
887
929
888
930
let paramTy : String =
889
931
if style == . cDeclThunk, p. type. javaType. isString {
890
- " UnsafeMutablePointer<CChar> " // TODO: is this ok?
932
+ " UnsafeMutablePointer<CChar> " // TODO: is this ok?
891
933
} else if paramPassingStyle == . swiftThunkSelf {
892
934
" \( p. type. cCompatibleSwiftType) "
893
935
} else {
@@ -906,7 +948,7 @@ extension Swift2JavaTranslator {
906
948
907
949
if paramPassingStyle == . swiftThunkSelf {
908
950
ps. append ( " _self: UnsafeMutableRawPointer " )
909
- // ps.append("_self: Any")
951
+ // ps.append("_self: Any")
910
952
}
911
953
912
954
let res = ps. joined ( separator: " , " )
@@ -942,7 +984,9 @@ extension Swift2JavaTranslator {
942
984
return printer. contents
943
985
}
944
986
945
- public func renderForwardJavaParams( _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ? ) -> String {
987
+ public func renderForwardJavaParams(
988
+ _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ?
989
+ ) -> String {
946
990
var ps : [ String ] = [ ]
947
991
var pCounter = 0
948
992
@@ -980,20 +1024,16 @@ extension Swift2JavaTranslator {
980
1024
}
981
1025
982
1026
// TODO: these are stateless, find new place for them?
983
- public func renderForwardSwiftParams( _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ? ) -> String {
1027
+ public func renderForwardSwiftParams(
1028
+ _ decl: ImportedFunc , paramPassingStyle: SelfParameterVariant ?
1029
+ ) -> String {
984
1030
var ps : [ String ] = [ ]
985
- var pCounter = 0
986
-
987
- func nextUniqueParamName( ) -> String {
988
- pCounter += 1
989
- return " p \( pCounter) "
990
- }
991
1031
992
1032
for p in decl. effectiveParameters ( paramPassingStyle: paramPassingStyle) {
993
1033
if let firstName = p. firstName {
994
- ps. append ( " \( firstName) : \( p. effectiveName ?? nextUniqueParamName ( ) ) " )
1034
+ ps. append ( " \( firstName) : \( p. effectiveValueName ) " )
995
1035
} else {
996
- ps. append ( " \( p. effectiveName ?? nextUniqueParamName ( ) ) " )
1036
+ ps. append ( " \( p. effectiveValueName ) " )
997
1037
}
998
1038
}
999
1039
@@ -1008,12 +1048,20 @@ extension Swift2JavaTranslator {
1008
1048
let fieldName = accessorKind. renderDescFieldName
1009
1049
printer. start ( " public static final FunctionDescriptor \( fieldName) = " )
1010
1050
1011
- let parameterLayoutDescriptors = javaMemoryLayoutDescriptors (
1051
+ let isIndirectReturn =
1052
+ decl. returnType. isValueType || ( decl. isInit && ( decl. parent? . isValueType ?? false ) )
1053
+
1054
+ var parameterLayoutDescriptors : [ ForeignValueLayout ] = javaMemoryLayoutDescriptors (
1012
1055
forParametersOf: decl,
1013
1056
paramPassingStyle: . pointer
1014
1057
)
1015
1058
1016
- if decl. returnType. javaType == . void {
1059
+ // Write indirect return buffer parameter after formal
1060
+ // if isIndirectReturn || decl.isInit {
1061
+ // parameterLayoutDescriptors.append(.SwiftPointer)
1062
+ // }
1063
+
1064
+ if decl. returnType. javaType == . void || isIndirectReturn {
1017
1065
printer. print ( " FunctionDescriptor.ofVoid( " )
1018
1066
printer. indent ( )
1019
1067
} else {
@@ -1040,6 +1088,11 @@ extension Swift2JavaTranslator {
1040
1088
printer. print ( desc, . parameterNewlineSeparator( isLast) )
1041
1089
}
1042
1090
1091
+ // // Write indirect return buffer parameter after formal
1092
+ // if isIndirectReturn {
1093
+ // printer.print(", /* indirect return buffer */SWIFT_POINTER")
1094
+ // }
1095
+
1043
1096
printer. outdent ( )
1044
1097
printer. print ( " ); " )
1045
1098
}
0 commit comments