@@ -223,6 +223,20 @@ pub fn emit_hl_unmarshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStr
223
223
( #retid, cursor)
224
224
}
225
225
}
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
+ }
226
240
Value :: Record ( _) => panic ! ( "record not at top level of valtype" ) ,
227
241
Value :: Tuple ( vts) => {
228
242
let inid = format_ident ! ( "{}_elem" , id) ;
@@ -515,6 +529,25 @@ pub fn emit_hl_marshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStrea
515
529
#retid
516
530
}
517
531
}
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
+ }
518
551
Value :: Record ( _) => panic ! ( "record not at top level of valtype" ) ,
519
552
Value :: Tuple ( vts) => {
520
553
let retid = format_ident ! ( "{}_tuple" , id) ;
0 commit comments