X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=51a5dfcfd0a60207b36303ca7f08b56f03e7894f;hb=291aea2200e01843623a67d42112500b1810d276;hp=35ec928bd42ed8b96cdb296a3e438b00535a52a0;hpb=b29fc9ff682340c72f6b76a0c8def8e132d7605a;p=ldk-c-bindings diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 35ec928..51a5dfc 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -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]) { @@ -1662,7 +1663,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { write!(w, ">").unwrap(); } pub fn write_rust_type(&self, w: &mut W, generics: Option<&GenericTypes>, t: &syn::Type) { - match t { + match generics.resolve_type(t) { syn::Type::Path(p) => { if p.qself.is_some() { unimplemented!(); @@ -2332,6 +2333,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { } write!(w, "let mut local_{} = (", ident).unwrap(); for (idx, elem) in t.elems.iter().enumerate() { + let real_elem = generics.resolve_type(&elem); let ty_has_inner = { if to_c { // "To C ptr_for_ref" means "return the regular object with @@ -2339,16 +2341,16 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { // if we're about to set ty_has_inner. ptr_for_ref = true; } - if let syn::Type::Reference(t) = elem { + if let syn::Type::Reference(t) = real_elem { if let syn::Type::Path(p) = &*t.elem { self.c_type_has_inner_from_path(&self.resolve_path(&p.path, generics)) } else { false } - } else if let syn::Type::Path(p) = elem { + } else if let syn::Type::Path(p) = real_elem { self.c_type_has_inner_from_path(&self.resolve_path(&p.path, generics)) } else { false } }; if idx != 0 { write!(w, ", ").unwrap(); } - var_prefix(w, elem, generics, is_ref && ty_has_inner, ptr_for_ref, false); + var_prefix(w, real_elem, generics, is_ref && ty_has_inner, ptr_for_ref, false); if is_ref && ty_has_inner { // For ty_has_inner, the regular var_prefix mapping will take a // reference, so deref once here to make sure we keep the original ref. @@ -2360,7 +2362,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { // hope the type is Clonable and use that. write!(w, ".clone()").unwrap(); } - var_suffix(w, elem, generics, is_ref && ty_has_inner, ptr_for_ref, false); + var_suffix(w, real_elem, generics, is_ref && ty_has_inner, ptr_for_ref, false); } write!(w, "){};", if to_c { ".into()" } else { "" }).unwrap(); true