X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=c96a3b9a2fd51220057d89381c95e77e2f5d11a6;hb=881edcf972ef61892b191a16942f93e76e28f7f6;hp=b10ce3ded424fbf0fa15cb8f64de3ac918dc64e1;hpb=c038abcf69eab334ad9be6af12228022b115b9a4;p=ldk-c-bindings diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index b10ce3d..c96a3b9 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -227,12 +227,13 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> { non_lifetimes_processed = true; if path != "std::ops::Deref" && path != "core::ops::Deref" { new_typed_generics.insert(&type_param.ident, Some(path)); - } else if trait_bound.path.segments.len() == 1 { + } else { // If we're templated on Deref, store // the reference type in `default_generics` which handles full // types and not just paths. if let syn::PathArguments::AngleBracketed(ref args) = trait_bound.path.segments[0].arguments { + assert_eq!(trait_bound.path.segments.len(), 1); for subargument in args.args.iter() { match subargument { syn::GenericArgument::Lifetime(_) => {}, @@ -268,7 +269,8 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> { if p.qself.is_some() { return false; } if p.path.leading_colon.is_some() { return false; } let mut p_iter = p.path.segments.iter(); - if let Some(gen) = new_typed_generics.get_mut(&p_iter.next().unwrap().ident) { + let p_ident = &p_iter.next().unwrap().ident; + if let Some(gen) = new_typed_generics.get_mut(p_ident) { if gen.is_some() { return false; } if &format!("{}", p_iter.next().unwrap().ident) != "Target" {return false; } @@ -281,7 +283,14 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> { if non_lifetimes_processed { return false; } non_lifetimes_processed = true; assert_simple_bound(&trait_bound); - *gen = Some(types.resolve_path(&trait_bound.path, None)); + let resolved = types.resolve_path(&trait_bound.path, None); + let ty = syn::Type::Path(syn::TypePath { + qself: None, path: string_path_to_syn_path(&resolved) + }); + let ref_ty = parse_quote!(&#ty); + self.default_generics.insert(p_ident, (ty, ref_ty)); + + *gen = Some(resolved); } } } else { return false; } @@ -438,6 +447,10 @@ impl<'mod_lifetime, 'crate_lft: 'mod_lifetime> ImportResolver<'mod_lifetime, 'cr new_path = format!("{}::{}{}", crate_name, $ident, $path_suffix); let crate_name_ident = format_ident!("{}", crate_name); path.push(parse_quote!(#crate_name_ident)); + } else if format!("{}", $ident) == "self" { + let mut path_iter = partial_path.rsplitn(2, "::"); + path_iter.next().unwrap(); + new_path = path_iter.next().unwrap().to_owned(); } else { new_path = format!("{}{}{}", partial_path, $ident, $path_suffix); } @@ -452,7 +465,8 @@ impl<'mod_lifetime, 'crate_lft: 'mod_lifetime> ImportResolver<'mod_lifetime, 'cr }, syn::UseTree::Name(n) => { push_path!(n.ident, ""); - imports.insert(n.ident.clone(), (new_path, syn::Path { leading_colon: Some(syn::Token![::](Span::call_site())), segments: path })); + let imported_ident = syn::Ident::new(new_path.rsplitn(2, "::").next().unwrap(), Span::call_site()); + imports.insert(imported_ident, (new_path, syn::Path { leading_colon: Some(syn::Token![::](Span::call_site())), segments: path })); }, syn::UseTree::Group(g) => { for i in g.items.iter() { @@ -711,6 +725,10 @@ impl FullLibraryAST { fn initial_clonable_types() -> HashSet { let mut res = HashSet::new(); res.insert("crate::c_types::u5".to_owned()); + res.insert("crate::c_types::FourBytes".to_owned()); + res.insert("crate::c_types::TwelveBytes".to_owned()); + res.insert("crate::c_types::SixteenBytes".to_owned()); + res.insert("crate::c_types::TwentyBytes".to_owned()); res.insert("crate::c_types::ThirtyTwoBytes".to_owned()); res.insert("crate::c_types::SecretKey".to_owned()); res.insert("crate::c_types::PublicKey".to_owned()); @@ -718,8 +736,17 @@ fn initial_clonable_types() -> HashSet { res.insert("crate::c_types::TxOut".to_owned()); res.insert("crate::c_types::Signature".to_owned()); res.insert("crate::c_types::RecoverableSignature".to_owned()); + res.insert("crate::c_types::Bech32Error".to_owned()); res.insert("crate::c_types::Secp256k1Error".to_owned()); res.insert("crate::c_types::IOError".to_owned()); + res.insert("crate::c_types::Error".to_owned()); + res.insert("crate::c_types::Str".to_owned()); + + // Because some types are manually-mapped to CVec_u8Z we may end up checking if its clonable + // before we ever get to constructing the type fully via + // `write_c_mangled_container_path_intern` (which will add it here too), so we have to manually + // add it on startup. + res.insert("crate::c_types::derived::CVec_u8Z".to_owned()); res } @@ -901,6 +928,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { "bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some("crate::c_types::Transaction"), "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some("crate::c_types::TxOut"), "bitcoin::network::constants::Network" => Some("crate::bitcoin::network::Network"), + "bitcoin::util::address::WitnessVersion" => Some("crate::c_types::WitnessVersion"), "bitcoin::blockdata::block::BlockHeader" if is_ref => Some("*const [u8; 80]"), "bitcoin::blockdata::block::Block" if is_ref => Some("crate::c_types::u8slice"), @@ -986,6 +1014,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { "bitcoin::blockdata::transaction::OutPoint" => Some("crate::c_types::C_to_bitcoin_outpoint("), "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(""), "bitcoin::network::constants::Network" => Some(""), + "bitcoin::util::address::WitnessVersion" => Some(""), "bitcoin::blockdata::block::BlockHeader" => Some("&::bitcoin::consensus::encode::deserialize(unsafe { &*"), "bitcoin::blockdata::block::Block" if is_ref => Some("&::bitcoin::consensus::encode::deserialize("), @@ -1067,6 +1096,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { "bitcoin::blockdata::transaction::OutPoint" => Some(")"), "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(".into_rust()"), "bitcoin::network::constants::Network" => Some(".into_bitcoin()"), + "bitcoin::util::address::WitnessVersion" => Some(".into()"), "bitcoin::blockdata::block::BlockHeader" => Some(" }).unwrap()"), "bitcoin::blockdata::block::Block" => Some(".to_slice()).unwrap()"), @@ -1159,6 +1189,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { "bitcoin::blockdata::transaction::OutPoint" => Some("crate::c_types::bitcoin_to_C_outpoint("), "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some("crate::c_types::TxOut::from_rust("), "bitcoin::network::constants::Network" => Some("crate::bitcoin::network::Network::from_bitcoin("), + "bitcoin::util::address::WitnessVersion" => Some(""), "bitcoin::blockdata::block::BlockHeader" if is_ref => Some("&local_"), "bitcoin::blockdata::block::Block" if is_ref => Some("crate::c_types::u8slice::from_slice(&local_"), @@ -1234,6 +1265,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { "bitcoin::blockdata::transaction::OutPoint" => Some(")"), "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(")"), "bitcoin::network::constants::Network" => Some(")"), + "bitcoin::util::address::WitnessVersion" => Some(".into()"), "bitcoin::blockdata::block::BlockHeader" if is_ref => Some(""), "bitcoin::blockdata::block::Block" if is_ref => Some(")"), @@ -1485,7 +1517,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if let Some(t) = single_contained { match t { - syn::Type::Reference(_)|syn::Type::Path(_)|syn::Type::Slice(_) => { + syn::Type::Reference(_)|syn::Type::Path(_)|syn::Type::Slice(_)|syn::Type::Array(_) => { let mut v = Vec::new(); let ret_ref = self.write_empty_rust_val_check_suffix(generics, &mut v, t); let s = String::from_utf8(v).unwrap(); @@ -1781,7 +1813,6 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { syn::Type::Path(p) => { let resolved = self.resolve_path(&p.path, generics); if let Some(arr_ty) = self.is_real_type_array(&resolved) { - write!(w, ".data").unwrap(); return self.write_empty_rust_val_check_suffix(generics, w, &arr_ty); } if self.crate_types.opaques.get(&resolved).is_some() { @@ -1801,7 +1832,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { syn::Type::Array(a) => { if let syn::Expr::Lit(l) = &a.len { if let syn::Lit::Int(i) = &l.lit { - write!(w, " == [0; {}]", i.base10_digits()).unwrap(); + write!(w, ".data == [0; {}]", i.base10_digits()).unwrap(); EmptyValExpectedTy::NonPointer } else { unimplemented!(); } } else { unimplemented!(); }