Merge pull request #63 from TheBlueMatt/main v0.0.105.2
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Wed, 23 Mar 2022 20:23:23 +0000 (20:23 +0000)
committerGitHub <noreply@github.com>
Wed, 23 Mar 2022 20:23:23 +0000 (20:23 +0000)
Consider all reference types clonable + handle refs-in-tuples

c-bindings-gen/src/blocks.rs
c-bindings-gen/src/types.rs
lightning-c-bindings/include/lightning.h
lightning-c-bindings/src/c_types/derived.rs

index e97fb65e88e4c0a58dfcf82e959e48515aecbc9f..0e1617a3fc35ada2d9ec76f1420e1cbeba0ac991 100644 (file)
@@ -272,14 +272,22 @@ pub fn write_tuple_block<W: std::io::Write>(w: &mut W, mangled_container: &str,
        writeln!(w, "pub struct {} {{", mangled_container).unwrap();
        for (idx, ty) in types.iter().enumerate() {
                writeln!(w, "\t/// The element at position {}", idx).unwrap();
-               writeln!(w, "\tpub {}: {},", ('a' as u8 + idx as u8) as char, ty).unwrap();
+               if ty.starts_with("&'static ") {
+                       writeln!(w, "\tpub {}: {},", ('a' as u8 + idx as u8) as char, &ty[9..]).unwrap();
+               } else {
+                       writeln!(w, "\tpub {}: {},", ('a' as u8 + idx as u8) as char, ty).unwrap();
+               }
        }
        writeln!(w, "}}").unwrap();
 
        let mut tuple_str = "(".to_owned();
        for (idx, ty) in types.iter().enumerate() {
                if idx != 0 { tuple_str += ", "; }
-               tuple_str += ty;
+               if ty.starts_with("&'static ") {
+                       tuple_str += &ty[9..];
+               } else {
+                       tuple_str += ty;
+               }
        }
        tuple_str += ")";
 
@@ -306,8 +314,14 @@ pub fn write_tuple_block<W: std::io::Write>(w: &mut W, mangled_container: &str,
                writeln!(w, "impl Clone for {} {{", mangled_container).unwrap();
                writeln!(w, "\tfn clone(&self) -> Self {{").unwrap();
                writeln!(w, "\t\tSelf {{").unwrap();
-               for idx in 0..types.len() {
-                       writeln!(w, "\t\t\t{}: Clone::clone(&self.{}),", ('a' as u8 + idx as u8) as char, ('a' as u8 + idx as u8) as char).unwrap();
+               for (idx, ty) in types.iter().enumerate() {
+                       if ty.starts_with("&'static ") {
+                               // Assume blindly the type is opaque. If its not we'll fail to build.
+                               // Really we should never have derived structs with a reference type.
+                               write!(w, "\t\t\t{}: {} {{ inner: self.{}.inner, is_owned: false}},", ('a' as u8 + idx as u8) as char, &ty[9..], ('a' as u8 + idx as u8) as char).unwrap();
+                       } else{
+                               writeln!(w, "\t\t\t{}: Clone::clone(&self.{}),", ('a' as u8 + idx as u8) as char, ('a' as u8 + idx as u8) as char).unwrap();
+                       }
                }
                writeln!(w, "\t\t}}").unwrap();
                writeln!(w, "\t}}").unwrap();
@@ -327,8 +341,14 @@ pub fn write_tuple_block<W: std::io::Write>(w: &mut W, mangled_container: &str,
        }
        writeln!(w, ") -> {} {{", mangled_container).unwrap();
        write!(w, "\t{} {{ ", mangled_container).unwrap();
-       for idx in 0..types.len() {
-               write!(w, "{}, ", ('a' as u8 + idx as u8) as char).unwrap();
+       for (idx, ty) in types.iter().enumerate() {
+               if ty.starts_with("&'static ") {
+                       // Assume blindly the type is opaque. If its not we'll fail to build.
+                       // Really we should never have derived structs with a reference type.
+                       write!(w, "{}: {} {{ inner: {}.inner, is_owned: false}}, ", ('a' as u8 + idx as u8) as char, &ty[9..], ('a' as u8 + idx as u8) as char).unwrap();
+               } else {
+                       write!(w, "{}, ", ('a' as u8 + idx as u8) as char).unwrap();
+               }
        }
        writeln!(w, "}}\n}}\n").unwrap();
 
index 2efba6e3c1130e2148bdce95ddb8c6a60c3b5fbb..51a5dfcfd0a60207b36303ca7f08b56f03e7894f 100644 (file)
@@ -772,6 +772,7 @@ impl<'a> CrateTypes<'a> {
                self.clonable_types.borrow_mut().insert(object);
        }
        pub fn is_clonable(&self, object: &str) -> bool {
+               object.starts_with("&'static ") ||
                self.clonable_types.borrow().contains(object)
        }
        pub fn write_new_template(&self, mangled_container: String, has_destructor: bool, created_container: &[u8]) {
index 727489780438b2595db5bcf60e4e175f6b7cda3b..9b2fefef3187d1a115850889294d35d36d1bf06a 100644 (file)
@@ -4319,7 +4319,7 @@ typedef struct LDKC2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
    /**
     * The element at position 1
     */
-   const struct LDKNetworkGraph *NONNULL_PTR b;
+   struct LDKNetworkGraph b;
 } LDKC2Tuple_ProbabilisticScoringParametersNetworkGraphZ;
 
 
@@ -13407,6 +13407,12 @@ void CResult_ProbabilisticScoringParametersDecodeErrorZ_free(struct LDKCResult_P
  */
 struct LDKCResult_ProbabilisticScoringParametersDecodeErrorZ CResult_ProbabilisticScoringParametersDecodeErrorZ_clone(const struct LDKCResult_ProbabilisticScoringParametersDecodeErrorZ *NONNULL_PTR orig);
 
+/**
+ * Creates a new tuple which has the same data as `orig`
+ * but with all dynamically-allocated buffers duplicated in new buffers.
+ */
+struct LDKC2Tuple_ProbabilisticScoringParametersNetworkGraphZ C2Tuple_ProbabilisticScoringParametersNetworkGraphZ_clone(const struct LDKC2Tuple_ProbabilisticScoringParametersNetworkGraphZ *NONNULL_PTR orig);
+
 /**
  * Creates a new C2Tuple_ProbabilisticScoringParametersNetworkGraphZ from the contained elements.
  */
index 6c184463ee7c27bc2bd41999278cc0d86da43860..62c6ccc14c95a9c83dd741db5b130c17de5f12bb 100644 (file)
@@ -3963,10 +3963,10 @@ pub struct C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
        /// The element at position 0
        pub a: crate::lightning::routing::scoring::ProbabilisticScoringParameters,
        /// The element at position 1
-       pub b: &'static crate::lightning::routing::network_graph::NetworkGraph,
+       pub b: crate::lightning::routing::network_graph::NetworkGraph,
 }
-impl From<(crate::lightning::routing::scoring::ProbabilisticScoringParameters, &'static crate::lightning::routing::network_graph::NetworkGraph)> for C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
-       fn from (tup: (crate::lightning::routing::scoring::ProbabilisticScoringParameters, &'static crate::lightning::routing::network_graph::NetworkGraph)) -> Self {
+impl From<(crate::lightning::routing::scoring::ProbabilisticScoringParameters, crate::lightning::routing::network_graph::NetworkGraph)> for C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
+       fn from (tup: (crate::lightning::routing::scoring::ProbabilisticScoringParameters, crate::lightning::routing::network_graph::NetworkGraph)) -> Self {
                Self {
                        a: tup.0,
                        b: tup.1,
@@ -3974,14 +3974,25 @@ impl From<(crate::lightning::routing::scoring::ProbabilisticScoringParameters, &
        }
 }
 impl C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
-       #[allow(unused)] pub(crate) fn to_rust(mut self) -> (crate::lightning::routing::scoring::ProbabilisticScoringParameters, &'static crate::lightning::routing::network_graph::NetworkGraph) {
+       #[allow(unused)] pub(crate) fn to_rust(mut self) -> (crate::lightning::routing::scoring::ProbabilisticScoringParameters, crate::lightning::routing::network_graph::NetworkGraph) {
                (self.a, self.b)
        }
 }
+impl Clone for C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
+       fn clone(&self) -> Self {
+               Self {
+                       a: Clone::clone(&self.a),
+                       b: crate::lightning::routing::network_graph::NetworkGraph { inner: self.b.inner, is_owned: false},              }
+       }
+}
+#[no_mangle]
+/// Creates a new tuple which has the same data as `orig`
+/// but with all dynamically-allocated buffers duplicated in new buffers.
+pub extern "C" fn C2Tuple_ProbabilisticScoringParametersNetworkGraphZ_clone(orig: &C2Tuple_ProbabilisticScoringParametersNetworkGraphZ) -> C2Tuple_ProbabilisticScoringParametersNetworkGraphZ { Clone::clone(&orig) }
 /// Creates a new C2Tuple_ProbabilisticScoringParametersNetworkGraphZ from the contained elements.
 #[no_mangle]
 pub extern "C" fn C2Tuple_ProbabilisticScoringParametersNetworkGraphZ_new(a: crate::lightning::routing::scoring::ProbabilisticScoringParameters, b: &'static crate::lightning::routing::network_graph::NetworkGraph) -> C2Tuple_ProbabilisticScoringParametersNetworkGraphZ {
-       C2Tuple_ProbabilisticScoringParametersNetworkGraphZ { a, b, }
+       C2Tuple_ProbabilisticScoringParametersNetworkGraphZ { a, b: crate::lightning::routing::network_graph::NetworkGraph { inner: b.inner, is_owned: false}, }
 }
 
 #[no_mangle]