X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=14fd918e2be81cb267a01f08f18206bf0bbd1b7b;hb=483aa2c8c37f626bb100c926bbad81a393332396;hp=224b3ecfcb8caa3905ce45823aaf27abf7b3ff2f;hpb=18dc4eff64fcad567e67dfe11c501a9b4ec7633e;p=ldk-c-bindings diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 224b3ec..14fd918 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -46,6 +46,10 @@ pub fn get_single_remaining_path_seg<'a, I: Iterator> } else { None } } +pub fn first_seg_is_stdlib(first_seg_str: &str) -> bool { + first_seg_str == "std" || first_seg_str == "core" || first_seg_str == "alloc" +} + pub fn single_ident_generic_path_to_ident(p: &syn::Path) -> Option<&syn::Ident> { if p.segments.len() == 1 { Some(&p.segments.iter().next().unwrap().ident) @@ -600,7 +604,7 @@ impl<'mod_lifetime, 'crate_lft: 'mod_lifetime> ImportResolver<'mod_lifetime, 'cr } } else if let Some(_) = self.priv_modules.get(&first_seg.ident) { Some(format!("{}::{}{}", self.module_path, first_seg.ident, remaining)) - } else if first_seg_str == "std" || first_seg_str == "core" || self.dependencies.contains(&first_seg.ident) { + } else if first_seg_is_stdlib(&first_seg_str) || self.dependencies.contains(&first_seg.ident) { Some(first_seg_str + &remaining) } else { None } } @@ -1369,6 +1373,14 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { } } if let Some(t) = single_contained { + if let syn::Type::Reference(syn::TypeReference { elem, .. }) = t { + if let syn::Type::Slice(_) = &**elem { + return Some(("if ", vec![ + (".is_none() { SmartPtr::null() } else { SmartPtr::from_obj(".to_string(), + format!("({}.unwrap())", var_access)) + ], ") }", ContainerPrefixLocation::PerConv)); + } + } let mut v = Vec::new(); self.write_empty_rust_val(generics, &mut v, t); let s = String::from_utf8(v).unwrap(); @@ -2102,7 +2114,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if let Some((prefix, conversions, suffix, prefix_location)) = container_lookup(&$container_type, is_ref && ty_has_inner, only_contained_type, ident, var) { assert_eq!(conversions.len(), $args_len); - write!(w, "let mut local_{}{} = ", ident, if !to_c && needs_ref_map {"_base"} else { "" }).unwrap(); + write!(w, "let mut local_{}{} = ", ident, + if (!to_c && needs_ref_map) || (to_c && $container_type == "Option" && contains_slice) {"_base"} else { "" }).unwrap(); if prefix_location == ContainerPrefixLocation::OutsideConv { var_prefix(w, $args_iter().next().unwrap(), generics, is_ref, ptr_for_ref, true); } @@ -2127,7 +2140,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { write!(w, "ObjOps::heap_alloc(").unwrap(); } - write!(w, "{}{}", if contains_slice { "local_" } else { "" }, if new_var { new_var_name } else { var_access }).unwrap(); + write!(w, "{}{}", if contains_slice && !to_c { "local_" } else { "" }, if new_var { new_var_name } else { var_access }).unwrap(); if prefix_location == ContainerPrefixLocation::PerConv { var_suffix(w, conv_ty, generics, is_ref && ty_has_inner, ptr_for_ref, false); } else if !is_ref && !needs_ref_map && to_c && only_contained_has_inner { @@ -2146,6 +2159,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { write!(w, ".map(|a| &a[..])").unwrap(); } write!(w, ";").unwrap(); + } else if to_c && $container_type == "Option" && contains_slice { + write!(w, " let mut local_{} = *local_{}_base;", ident, ident).unwrap(); } return true; }