11use itertools:: Itertools ;
22use proc_macro2:: TokenStream ;
33use quote:: quote;
4+ use std:: fs;
45
56use zenoh_flat:: core:: {
67 primitive_builtins, FunctionsConverter , InputFn , NameMangler , OutputFn , TypeRegistry ,
@@ -85,7 +86,11 @@ macro_rules! decode_option_arc_from_raw {
8586 InputFn :: new( |input: & syn:: Ident | -> TokenStream {
8687 quote! {
8788 if #input != 0 {
88- Some ( unsafe { std:: sync:: Arc :: from_raw( #input as * const $inner) } )
89+ Some ( unsafe {
90+ let raw = #input as * const $inner;
91+ std:: sync:: Arc :: increment_strong_count( raw) ;
92+ std:: sync:: Arc :: from_raw( raw)
93+ } )
8994 } else {
9095 None
9196 }
@@ -190,7 +195,7 @@ fn shared_bindings() -> TypeRegistry {
190195 Some ( output) => quote ! {
191196 #output
192197 . as_ref( )
193- . map( |ptr| std:: sync:: Arc :: as_ptr ( ptr) as i64 )
198+ . map( |ptr| std:: sync:: Arc :: into_raw ( ptr. clone ( ) ) as i64 )
194199 . unwrap_or( 0 )
195200 } ,
196201 None => quote ! { 0 } ,
@@ -304,6 +309,16 @@ fn shared_kotlin_types() -> KotlinTypeMap {
304309 . add ( "ZResult<bool>" , "Boolean" )
305310}
306311
312+ fn patch_generated_kotlin_data_classes ( path : & str , replacements : & [ ( & str , & str ) ] ) {
313+ let mut content = fs:: read_to_string ( path)
314+ . unwrap_or_else ( |err| panic ! ( "failed to read generated Kotlin file {path}: {err}" ) ) ;
315+ for ( from, to) in replacements {
316+ content = content. replace ( from, to) ;
317+ }
318+ fs:: write ( path, content)
319+ . unwrap_or_else ( |err| panic ! ( "failed to patch generated Kotlin file {path}: {err}" ) ) ;
320+ }
321+
307322fn main ( ) {
308323 let source = prebindgen:: Source :: new ( zenoh_flat:: PREBINDGEN_OUT_DIR ) ;
309324
@@ -467,6 +482,36 @@ fn main() {
467482 session_kotlin
468483 . write ( )
469484 . expect ( "failed to write generated JNISessionNative.kt" ) ;
485+ patch_generated_kotlin_data_classes (
486+ "../zenoh-jni/generated-kotlin/io/zenoh/jni/JNISessionNative.kt" ,
487+ & [
488+ ( "val isHeartbeat: Boolean," , "var isHeartbeat: Boolean = false," ) ,
489+ ( "val periodMs: Long," , "var periodMs: Long = 0L," ) ,
490+ ( "val maxSamples: Long," , "var maxSamples: Long = 0L," ) ,
491+ ( "val repliesPriority: Int," , "var repliesPriority: Int = 0," ) ,
492+ (
493+ "val repliesCongestionControl: Int," ,
494+ "var repliesCongestionControl: Int = 0," ,
495+ ) ,
496+ (
497+ "val repliesIsExpress: Boolean," ,
498+ "var repliesIsExpress: Boolean = false," ,
499+ ) ,
500+ (
501+ "val enableHeartbeat: Boolean," ,
502+ "var enableHeartbeat: Boolean = false," ,
503+ ) ,
504+ ( "val isSporadic: Boolean," , "var isSporadic: Boolean = false," ) ,
505+ (
506+ "val detectLatePublishers: Boolean," ,
507+ "var detectLatePublishers: Boolean = false," ,
508+ ) ,
509+ (
510+ "val maxAgeSeconds: Double," ,
511+ "var maxAgeSeconds: Double = 0.0," ,
512+ ) ,
513+ ] ,
514+ ) ;
470515
471516 let mut keyexpr_kotlin = KotlinInterfaceGenerator :: builder ( )
472517 . output_path ( "../zenoh-jni/generated-kotlin/io/zenoh/jni/JNIKeyExprNative.kt" )
@@ -488,4 +533,11 @@ fn main() {
488533 keyexpr_kotlin
489534 . write ( )
490535 . expect ( "failed to write generated JNIKeyExprNative.kt" ) ;
536+ patch_generated_kotlin_data_classes (
537+ "../zenoh-jni/generated-kotlin/io/zenoh/jni/JNIKeyExprNative.kt" ,
538+ & [
539+ ( "val ptr: Long," , "var ptr: Long = 0L," ) ,
540+ ( "val string: String," , "var string: String = \" \" ," ) ,
541+ ] ,
542+ ) ;
491543}
0 commit comments