@@ -223,6 +223,20 @@ pub fn emit_hl_unmarshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStr
223223 ( #retid, cursor)
224224 }
225225 }
226+ Value :: FixList ( vt, _size) => {
227+ let inid = format_ident ! ( "{}_elem" , id) ;
228+ let vtun = emit_hl_unmarshal_value ( s, inid. clone ( ) , vt) ;
229+ quote ! {
230+ let mut cursor = 0 ;
231+ let arr = :: core:: array:: from_fn( |_i| {
232+ let #inid = & #id[ cursor..] ;
233+ let ( x, b) = { #vtun } ;
234+ cursor += b;
235+ x
236+ } ) ;
237+ ( arr, cursor)
238+ }
239+ }
226240 Value :: Record ( _) => panic ! ( "record not at top level of valtype" ) ,
227241 Value :: Tuple ( vts) => {
228242 let inid = format_ident ! ( "{}_elem" , id) ;
@@ -515,6 +529,25 @@ pub fn emit_hl_marshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStrea
515529 #retid
516530 }
517531 }
532+ Value :: FixList ( vt, _size) => {
533+ // Optimize for byte arrays ie. [u8; N]
534+ if matches ! ( vt. as_ref( ) , Value :: S ( _) | Value :: U ( _) | Value :: F ( _) ) {
535+ quote ! {
536+ alloc:: vec:: Vec :: from( #id. as_slice( ) )
537+ }
538+ } else {
539+ let retid = format_ident ! ( "{}_fixlist" , id) ;
540+ let inid = format_ident ! ( "{}_elem" , id) ;
541+ let vtun = emit_hl_marshal_value ( s, inid. clone ( ) , vt) ;
542+ quote ! {
543+ let mut #retid = alloc:: vec:: Vec :: new( ) ;
544+ for #inid in #id {
545+ #retid. extend( { #vtun } )
546+ }
547+ #retid
548+ }
549+ }
550+ }
518551 Value :: Record ( _) => panic ! ( "record not at top level of valtype" ) ,
519552 Value :: Tuple ( vts) => {
520553 let retid = format_ident ! ( "{}_tuple" , id) ;
0 commit comments