@@ -700,17 +700,10 @@ def map_result(struct_name, res_ty, err_ty):
700700 if not err_map .is_native_primitive and (err_map .rust_obj .replace ("LDK" , "" ) + "_clone" not in clone_fns ):
701701 can_clone = False
702702
703- out_java .write ("\t public static native " + res_map .java_ty + " " + struct_name + "_get_ok(long arg);\n " )
704- write_c (consts .c_fn_ty_pfx + res_map .c_ty + " " + consts .c_fn_name_define_pfx (struct_name + "_get_ok" , True ) + consts .ptr_c_ty + " arg) {\n " )
705- write_c ("\t " + struct_name + " *val = (" + struct_name + "*)(arg & ~1);\n " )
706- write_c ("\t CHECK(val->result_ok);\n \t " )
703+ create_getter (struct_name , res_ty , "ok" , ("*" , "->contents.result" ), ("" , "->result_ok" ))
704+ create_getter (struct_name , err_ty , "err" , ("*" , "->contents.err" ), ("!" , "->result_ok" ))
705+
707706 out_java_struct .write ("\t public static final class " + human_ty + "_OK extends " + human_ty + " {\n " )
708- if res_map .ret_conv is not None :
709- write_c (res_map .ret_conv [0 ].replace ("\n " , "\n \t " ) + "(*val->contents.result)" )
710- write_c (res_map .ret_conv [1 ].replace ("\n " , "\n \t " ) + "\n \t return " + res_map .ret_conv_name )
711- else :
712- write_c ("return *val->contents.result" )
713- write_c (";\n }\n " )
714707
715708 if res_map .java_hu_ty != "void" :
716709 out_java_struct .write ("\t \t public final " + res_map .java_hu_ty + " res;\n " )
@@ -719,42 +712,60 @@ def map_result(struct_name, res_ty, err_ty):
719712 if res_map .java_hu_ty == "void" :
720713 pass
721714 elif res_map .to_hu_conv is not None :
722- out_java_struct .write ("\t \t \t " + res_map .java_ty + " res = bindings." + struct_name + "_get_ok(ptr);\n " )
715+ out_java_struct .write ("\t \t \t " + res_map .java_ty + " res = bindings." + struct_name . replace ( "LDK" , "" ) + "_get_ok(ptr);\n " )
723716 out_java_struct .write ("\t \t \t " + res_map .to_hu_conv .replace ("\n " , "\n \t \t \t " ))
724717 out_java_struct .write ("\n \t \t \t this.res = " + res_map .to_hu_conv_name + ";\n " )
725718 else :
726- out_java_struct .write ("\t \t \t this.res = bindings." + struct_name + "_get_ok(ptr);\n " )
719+ out_java_struct .write ("\t \t \t this.res = bindings." + struct_name . replace ( "LDK" , "" ) + "_get_ok(ptr);\n " )
727720 out_java_struct .write ("\t \t }\n " )
728721 out_java_struct .write ("\t }\n \n " )
729722
730- out_java .write ("\t public static native " + err_map .java_ty + " " + struct_name + "_get_err(long arg);\n " )
731- write_c (consts .c_fn_ty_pfx + err_map .c_ty + " " + consts .c_fn_name_define_pfx (struct_name + "_get_err" , True ) + consts .ptr_c_ty + " arg) {\n " )
732- write_c ("\t " + struct_name + " *val = (" + struct_name + "*)(arg & ~1);\n " )
733- write_c ("\t CHECK(!val->result_ok);\n \t " )
734723 out_java_struct .write ("\t public static final class " + human_ty + "_Err extends " + human_ty + " {\n " )
735- if err_map .ret_conv is not None :
736- write_c (err_map .ret_conv [0 ].replace ("\n " , "\n \t " ) + "(*val->contents.err)" )
737- write_c (err_map .ret_conv [1 ].replace ("\n " , "\n \t " ) + "\n \t return " + err_map .ret_conv_name )
738- else :
739- write_c ("return *val->contents.err" )
740- write_c (";\n }\n " )
741-
742724 if err_map .java_hu_ty != "void" :
743725 out_java_struct .write ("\t \t public final " + err_map .java_hu_ty + " err;\n " )
744726 out_java_struct .write ("\t \t private " + human_ty + "_Err(Object _dummy, long ptr) {\n " )
745727 out_java_struct .write ("\t \t \t super(_dummy, ptr);\n " )
746728 if err_map .java_hu_ty == "void" :
747729 pass
748730 elif err_map .to_hu_conv is not None :
749- out_java_struct .write ("\t \t \t " + err_map .java_ty + " err = bindings." + struct_name + "_get_err(ptr);\n " )
731+ out_java_struct .write ("\t \t \t " + err_map .java_ty + " err = bindings." + struct_name . replace ( "LDK" , "" ) + "_get_err(ptr);\n " )
750732 out_java_struct .write ("\t \t \t " + err_map .to_hu_conv .replace ("\n " , "\n \t \t \t " ))
751733 out_java_struct .write ("\n \t \t \t this.err = " + err_map .to_hu_conv_name + ";\n " )
752734 else :
753- out_java_struct .write ("\t \t \t this.err = bindings." + struct_name + "_get_err(ptr);\n " )
735+ out_java_struct .write ("\t \t \t this.err = bindings." + struct_name . replace ( "LDK" , "" ) + "_get_err(ptr);\n " )
754736 out_java_struct .write ("\t \t }\n " )
755737
756738 out_java_struct .write ("\t }\n \n " )
757739
740+ def create_getter (struct_name , field_decl , field_name , accessor , check_sfx ):
741+ field_ty = java_c_types (field_decl + " " + field_name , None )
742+ ptr_fn_defn = field_decl + " *" + struct_name .replace ("LDK" , "" ) + "_get_" + field_name + "(" + struct_name + " *NONNULL_PTR owner)"
743+ owned_fn_defn = field_decl + " " + struct_name .replace ("LDK" , "" ) + "_get_" + field_name + "(" + struct_name + " *NONNULL_PTR owner)"
744+
745+ holds_ref = False
746+ if field_ty .rust_obj is not None and field_ty .rust_obj .replace ("LDK" , "" ) + "_clone" in clone_fns :
747+ fn_defn = owned_fn_defn
748+ write_c ("static inline " + fn_defn + "{\n " )
749+ if check_sfx is not None :
750+ write_c ("CHECK(" + check_sfx [0 ] + "owner" + check_sfx [1 ] + ");\n " )
751+ write_c ("\t return " + field_ty .rust_obj .replace ("LDK" , "" ) + "_clone(&" + accessor [0 ] + "owner" + accessor [1 ] + ");\n " )
752+ elif field_ty .arr_len is not None or field_ty .is_native_primitive or field_ty .rust_obj in unitary_enums :
753+ fn_defn = owned_fn_defn
754+ write_c ("static inline " + fn_defn + "{\n " )
755+ if check_sfx is not None :
756+ write_c ("CHECK(" + check_sfx [0 ] + "owner" + check_sfx [1 ] + ");\n " )
757+ write_c ("\t return " + accessor [0 ] + "owner" + accessor [1 ] + ";\n " )
758+ else :
759+ fn_defn = ptr_fn_defn
760+ write_c ("static inline " + fn_defn + "{\n " )
761+ if check_sfx is not None :
762+ write_c ("CHECK(" + check_sfx [0 ] + "owner" + check_sfx [1 ] + ");\n " )
763+ write_c ("\t return &" + accessor [0 ] + "owner" + accessor [1 ] + ";\n " )
764+ holds_ref = True
765+ write_c ("}\n " )
766+ dummy_line = fn_defn + ";\n "
767+ map_fn_with_ref_option (dummy_line , reg_fn_regex .match (dummy_line ), None , None , "" , holds_ref )
768+
758769 def map_tuple (struct_name , field_lines ):
759770 human_ty = struct_name .replace ("LDKC2Tuple" , "TwoTuple" ).replace ("LDKC3Tuple" , "ThreeTuple" )
760771 with open (f"{ sys .argv [3 ]} /structs/{ human_ty } { consts .file_ext } " , "w" ) as out_java_struct :
@@ -770,27 +781,7 @@ def map_tuple(struct_name, field_lines):
770781 if idx != 0 and idx < len (field_lines ) - 2 :
771782 field_name = chr (ord ('a' ) + idx - 1 )
772783 assert line .endswith (" " + field_name + ";" )
773- field_ty = java_c_types (line [:- 1 ], None )
774- ptr_fn_defn = line [:- 3 ].strip () + " *" + struct_name .replace ("LDK" , "" ) + "_get_" + field_name + "(" + struct_name + " *NONNULL_PTR tuple)"
775- owned_fn_defn = line [:- 3 ].strip () + " " + struct_name .replace ("LDK" , "" ) + "_get_" + field_name + "(" + struct_name + " *NONNULL_PTR tuple)"
776-
777- holds_ref = False
778- if field_ty .rust_obj is not None and field_ty .rust_obj .replace ("LDK" , "" ) + "_clone" in clone_fns :
779- fn_defn = owned_fn_defn
780- write_c ("static inline " + fn_defn + "{\n " )
781- write_c ("\t return " + field_ty .rust_obj .replace ("LDK" , "" ) + "_clone(&tuple->" + field_name + ");\n " )
782- elif field_ty .arr_len is not None or field_ty .is_native_primitive :
783- fn_defn = owned_fn_defn
784- write_c ("static inline " + fn_defn + "{\n " )
785- write_c ("\t return tuple->" + field_name + ";\n " )
786- else :
787- fn_defn = ptr_fn_defn
788- write_c ("static inline " + fn_defn + "{\n " )
789- write_c ("\t return &tuple->" + field_name + ";\n " )
790- holds_ref = True
791- write_c ("}\n " )
792- dummy_line = fn_defn + ";\n "
793- map_fn_with_ref_option (dummy_line , reg_fn_regex .match (dummy_line ), None , None , "" , holds_ref )
784+ create_getter (struct_name , line [:- 3 ].strip (), field_name , ("" , "->" + field_name ), None )
794785
795786 out_java .write (consts .bindings_header )
796787 with open (f"{ sys .argv [2 ]} /version{ consts .file_ext } " , "w" ) as out_java_version :
0 commit comments