X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=88d66403931c34b2792e932309e2dfa08f09b226;hb=76eed6fb43c1d675195aff896efb325828c76498;hp=007441ed5625e4f4bba85aa5ea7057c822a253c7;hpb=60b47dba2937366d168694832df4134a498d509a;p=ldk-c-bindings diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 007441e..88d6640 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -110,8 +110,7 @@ pub fn export_status(attrs: &[syn::Attribute]) -> ExportStatus { } if all_test { return ExportStatus::TestOnly; } } - } else if i == "test" || i == "feature" { - // If its cfg(feature(...)) we assume its test-only + } else if i == "test" { return ExportStatus::TestOnly; } } @@ -828,7 +827,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { // ************************************************* /// Returns true we if can just skip passing this to C entirely - fn skip_path(&self, full_path: &str) -> bool { + pub fn skip_path(&self, full_path: &str) -> bool { full_path == "bitcoin::secp256k1::Secp256k1" || full_path == "bitcoin::secp256k1::Signing" || full_path == "bitcoin::secp256k1::Verification" @@ -1297,6 +1296,22 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { assert!(args.next().is_none()); match inner { syn::Type::Reference(_) => true, + syn::Type::Array(a) => { + if let syn::Expr::Lit(l) = &a.len { + if let syn::Lit::Int(i) = &l.lit { + if i.base10_digits().parse::().unwrap() >= 32 { + let mut buf = Vec::new(); + self.write_rust_type(&mut buf, generics, &a.elem); + let ty = String::from_utf8(buf).unwrap(); + ty == "u8" + } else { + // Blindly assume that if we're trying to create an empty value for an + // array < 32 entries that all-0s may be a valid state. + unimplemented!(); + } + } else { unimplemented!(); } + } else { unimplemented!(); } + }, syn::Type::Path(p) => { if let Some(resolved) = self.maybe_resolve_path(&p.path, generics) { if self.c_type_has_inner_from_path(&resolved) { return true; } @@ -2611,8 +2626,15 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if !self.is_primitive(&resolved) { return false; } if let syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(len), .. }) = &a.len { if self.c_type_from_path(&format!("[{}; {}]", resolved, len.base10_digits()), is_ref, ptr_for_ref).is_none() { return false; } - write!(w, "_{}{}", resolved, len.base10_digits()).unwrap(); - write!(mangled_type, "_{}{}", resolved, len.base10_digits()).unwrap(); + if in_type || args.len() != 1 { + write!(w, "_{}{}", resolved, len.base10_digits()).unwrap(); + write!(mangled_type, "_{}{}", resolved, len.base10_digits()).unwrap(); + } else { + let arrty = format!("[{}; {}]", resolved, len.base10_digits()); + let realty = self.c_type_from_path(&arrty, is_ref, ptr_for_ref).unwrap_or(&arrty); + write!(w, "{}", realty).unwrap(); + write!(mangled_type, "{}", realty).unwrap(); + } } else { return false; } } else { return false; } },