Skip to content

Commit 1d19255

Browse files
committed
Support &[[u8; N]] passed to Rust.
1 parent c0923bf commit 1d19255

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

c-bindings-gen/src/types.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2045,6 +2045,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
20452045
write!(w, "{}", sliceconv(false, None)).unwrap();
20462046
}
20472047
}
2048+
} else if let syn::Type::Array(_) = &*s.elem {
2049+
write!(w, "{}", sliceconv(false, Some(".map(|a| *a)"))).unwrap();
20482050
} else { unimplemented!(); }
20492051
},
20502052
syn::Type::Tuple(t) => {
@@ -2397,6 +2399,12 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
23972399
ptr_for_ref = true;
23982400
convert_container!("Slice", 1, || ty.iter());
23992401
unimplemented!("convert_container should return true as container_lookup should succeed for slices");
2402+
} else if let syn::Type::Array(_) = &*s.elem {
2403+
is_ref = false;
2404+
ptr_for_ref = true;
2405+
let arr_elem = [(*s.elem).clone()];
2406+
convert_container!("Slice", 1, || arr_elem.iter());
2407+
unimplemented!("convert_container should return true as container_lookup should succeed for slices");
24002408
} else { unimplemented!() }
24012409
},
24022410
syn::Type::Tuple(t) => {
@@ -2907,6 +2915,22 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
29072915
let mut segments = syn::punctuated::Punctuated::new();
29082916
segments.push(parse_quote!(Vec<#args>));
29092917
self.write_c_type_intern(w, &syn::Type::Path(syn::TypePath { qself: None, path: syn::Path { leading_colon: None, segments } }), generics, false, is_mut, ptr_for_ref, with_ref_lifetime, c_ty)
2918+
} else if let syn::Type::Array(a) = &*s.elem {
2919+
if let syn::Expr::Lit(l) = &a.len {
2920+
if let syn::Lit::Int(i) = &l.lit {
2921+
let mut buf = Vec::new();
2922+
self.write_rust_type(&mut buf, generics, &*a.elem, false);
2923+
let arr_ty = String::from_utf8(buf).unwrap();
2924+
2925+
let arr_str = format!("[{}; {}]", arr_ty, i.base10_digits());
2926+
let ty = self.c_type_from_path(&arr_str, false, ptr_for_ref).unwrap()
2927+
.rsplitn(2, "::").next().unwrap();
2928+
2929+
let mangled_container = format!("CVec_{}Z", ty);
2930+
write!(w, "{}::{}", Self::generated_container_path(), mangled_container).unwrap();
2931+
self.check_create_container(mangled_container, "Vec", vec![&*s.elem], generics, false)
2932+
} else { false }
2933+
} else { false }
29102934
} else { false }
29112935
},
29122936
syn::Type::Tuple(t) => {

0 commit comments

Comments
 (0)