X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=7fc7e4cd905cff8d1cc66cd39aba44988b38c535;hb=1316265a93939a232734719e383bfb659fe15780;hp=8c15b1258dad3ee6b80b105f626d571f0b84e024;hpb=cdbe8333faf138876f391a1567b521f959e5a9fc;p=rust-lightning diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 8c15b125..7fc7e4cd 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -114,16 +114,20 @@ pub fn assert_simple_bound(bound: &syn::TraitBound) { /// type), otherwise it is mapped into a transparent, C-compatible version of itself. pub fn is_enum_opaque(e: &syn::ItemEnum) -> bool { for var in e.variants.iter() { - if let syn::Fields::Unit = var.fields { - } else if let syn::Fields::Named(fields) = &var.fields { + if let syn::Fields::Named(fields) = &var.fields { for field in fields.named.iter() { match export_status(&field.attrs) { ExportStatus::Export|ExportStatus::TestOnly => {}, ExportStatus::NoExport => return true, } } - } else { - return true; + } else if let syn::Fields::Unnamed(fields) = &var.fields { + for field in fields.unnamed.iter() { + match export_status(&field.attrs) { + ExportStatus::Export|ExportStatus::TestOnly => {}, + ExportStatus::NoExport => return true, + } + } } } false @@ -583,7 +587,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { /// Returns true we if can just skip passing this to C entirely fn no_arg_path_to_rust(&self, full_path: &str) -> &str { if full_path == "bitcoin::secp256k1::Secp256k1" { - "&bitcoin::secp256k1::Secp256k1::new()" + "secp256k1::SECP256K1" } else { unimplemented!(); } } @@ -612,7 +616,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { } /// Gets the C-mapped type for types which are outside of the crate, or which are manually /// ignored by for some reason need mapping anyway. - fn c_type_from_path<'b>(&self, full_path: &'b str, is_ref: bool, ptr_for_ref: bool) -> Option<&'b str> { + fn c_type_from_path<'b>(&self, full_path: &'b str, is_ref: bool, _ptr_for_ref: bool) -> Option<&'b str> { if self.is_primitive(full_path) { return Some(full_path); } @@ -804,7 +808,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { _ => None, }.map(|s| s.to_owned()) } - fn to_c_conversion_inline_prefix_from_path(&self, full_path: &str, is_ref: bool, ptr_for_ref: bool) -> Option { + fn to_c_conversion_inline_prefix_from_path(&self, full_path: &str, is_ref: bool, _ptr_for_ref: bool) -> Option { if self.is_primitive(full_path) { return Some("".to_owned()); } @@ -860,7 +864,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { _ => None, }.map(|s| s.to_owned()) } - fn to_c_conversion_inline_suffix_from_path(&self, full_path: &str, is_ref: bool, ptr_for_ref: bool) -> Option { + fn to_c_conversion_inline_suffix_from_path(&self, full_path: &str, is_ref: bool, _ptr_for_ref: bool) -> Option { if self.is_primitive(full_path) { return Some("".to_owned()); } @@ -963,7 +967,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { ").into() }")) }, "Vec" if !is_ref => { - Some(("Vec::new(); for item in ", vec![(format!(".drain(..) {{ local_{}.push(", var_name), "item".to_string())], "); }")) + Some(("Vec::new(); for mut item in ", vec![(format!(".drain(..) {{ local_{}.push(", var_name), "item".to_string())], "); }")) }, "Slice" => { Some(("Vec::new(); for item in ", vec![(format!(".iter() {{ local_{}.push(", var_name), "**item".to_string())], "); }")) @@ -1004,8 +1008,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { match full_path { "Result" if !is_ref => { Some(("match ", - vec![(".result_ok { true => Ok(".to_string(), format!("(*unsafe {{ Box::from_raw(<*mut _>::take_ptr(&mut {}.contents.result)) }})", var_name)), - ("), false => Err(".to_string(), format!("(*unsafe {{ Box::from_raw(<*mut _>::take_ptr(&mut {}.contents.err)) }})", var_name))], + vec![(".result_ok { true => Ok(".to_string(), format!("(*unsafe {{ Box::from_raw(<*mut _>::take_ptr(&mut {}.contents.result)) }})", var_access)), + ("), false => Err(".to_string(), format!("(*unsafe {{ Box::from_raw(<*mut _>::take_ptr(&mut {}.contents.err)) }})", var_access))], ")}")) }, "Vec"|"Slice" if !is_ref => { @@ -1018,9 +1022,9 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if let Some(syn::Type::Path(p)) = single_contained { if self.c_type_has_inner_from_path(&self.resolve_path(&p.path, generics)) { if is_ref { - return Some(("if ", vec![(".inner.is_null() { None } else { Some((*".to_string(), format!("{}", var_name))], ").clone()) }")) + return Some(("if ", vec![(".inner.is_null() { None } else { Some((*".to_string(), format!("{}", var_access))], ").clone()) }")) } else { - return Some(("if ", vec![(".inner.is_null() { None } else { Some(".to_string(), format!("{}", var_name))], ") }")); + return Some(("if ", vec![(".inner.is_null() { None } else { Some(".to_string(), format!("{}", var_access))], ") }")); } } }