@@ -4,12 +4,16 @@ use darling::ast::{Data, Fields};
44use darling:: ToTokens ;
55use proc_macro2:: TokenStream ;
66use quote:: quote;
7+ #[ cfg( feature = "bits" ) ]
78use syn:: LitStr ;
89use syn:: { Ident , LitByteStr } ;
910
11+ #[ cfg( feature = "bits" ) ]
12+ use crate :: macros:: gen_bit_order_from_str;
13+
1014use crate :: macros:: {
11- assertion_failed, gen_bit_order_from_str , gen_ctx_types_and_arg, gen_field_args,
12- gen_internal_field_idents , token_contains_string, wrap_default_ctx,
15+ assertion_failed, gen_ctx_types_and_arg, gen_field_args, gen_internal_field_idents ,
16+ token_contains_string, wrap_default_ctx,
1317} ;
1418use crate :: { from_token, DekuData , DekuDataEnum , DekuDataStruct , FieldData , Id } ;
1519
@@ -353,16 +357,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
353357 if !has_default_match && default_reader. is_none ( ) {
354358 variant_matches. push ( quote ! {
355359 _ => {
356- extern crate alloc;
357- use alloc:: borrow:: Cow ;
358- use alloc:: format;
359- return Err ( :: #crate_:: DekuError :: Parse (
360- Cow :: from( format!(
361- "Could not match enum variant id = {:?} on enum `{}`" ,
362- __deku_variant_id,
363- #ident_as_string
364- ) )
365- ) ) ;
360+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Could not match enum variant" , "ID {:?} not found on {}" , __deku_variant_id, #ident_as_string) ) ;
366361 }
367362 } ) ;
368363 }
@@ -534,10 +529,7 @@ fn emit_magic_read_lit(crate_: &Ident, magic: &LitByteStr) -> TokenStream {
534529 for __deku_byte in __deku_magic {
535530 let __deku_read_byte = u8 :: from_reader_with_ctx( __deku_reader, ( ) ) ?;
536531 if * __deku_byte != __deku_read_byte {
537- extern crate alloc;
538- use alloc:: borrow:: Cow ;
539- use alloc:: format;
540- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( format!( "Missing magic value {:?}" , #magic) ) ) ) ;
532+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Missing magic value" , "{:?}" , #magic) ) ;
541533 }
542534 }
543535 }
@@ -609,19 +601,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
609601 let order = gen_bit_order_from_str ( bit_order) . unwrap ( ) ;
610602 quote ! {
611603 {
612- use core:: convert:: TryFrom ;
613- // TODO: I hope this consts in most cases?
614604 extern crate alloc;
615- use alloc :: borrow :: Cow ;
616- use alloc :: format ;
605+
606+ use core :: convert :: TryFrom ;
617607 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
618- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
619- "Invalid padding param \" ({})\" : cannot convert to usize" ,
620- stringify!( #bit_size)
621- ) ) )
608+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert ot usize" , "{}" , stringify!( #bit_size) )
622609 ) ?;
623610
624-
625611 if ( __deku_pad % 8 ) == 0 {
626612 let bytes_read = __deku_pad / 8 ;
627613 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -636,19 +622,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
636622 } else {
637623 quote ! {
638624 {
639- use core:: convert:: TryFrom ;
640- // TODO: I hope this consts in most cases?
641625 extern crate alloc;
642- use alloc :: borrow :: Cow ;
643- use alloc :: format ;
626+
627+ use core :: convert :: TryFrom ;
644628 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
645- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
646- "Invalid padding param \" ({})\" : cannot convert to usize" ,
647- stringify!( #bit_size)
648- ) ) )
629+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
649630 ) ?;
650631
651-
652632 if ( __deku_pad % 8 ) == 0 {
653633 let bytes_read = __deku_pad / 8 ;
654634 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -670,19 +650,16 @@ fn emit_padding_bytes(bit_size: &TokenStream) -> TokenStream {
670650 quote ! {
671651 {
672652 use core:: convert:: TryFrom ;
673- extern crate alloc;
674- use alloc:: borrow:: Cow ;
675- use alloc:: format;
676- let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
677- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
678- "Invalid padding param \" ({})\" : cannot convert to usize" ,
679- stringify!( #bit_size)
680- ) ) )
653+ let mut __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
654+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
681655 ) ?;
682656
683-
684- let mut buf = alloc:: vec![ 0 ; __deku_pad] ;
685- let _ = __deku_reader. read_bytes( __deku_pad, & mut buf, :: #crate_:: ctx:: Order :: default ( ) ) ?;
657+ while __deku_pad > 0 {
658+ let mut __deku_pad_source = [ 0u8 ; 64 ] ;
659+ let __deku_pad_chunk = core:: cmp:: min( __deku_pad_source. len( ) , __deku_pad) ;
660+ __deku_reader. read_bytes( __deku_pad_chunk, & mut __deku_pad_source[ ..__deku_pad_chunk] , :: #crate_:: ctx:: Order :: default ( ) ) ?;
661+ __deku_pad -= __deku_pad_chunk;
662+ }
686663 }
687664 }
688665}
@@ -1088,9 +1065,7 @@ pub fn emit_try_from(
10881065 let mut cursor = :: #crate_:: no_std_io:: Cursor :: new( input) ;
10891066 let ( amt_read, res) = <Self as :: #crate_:: DekuContainerRead >:: from_reader( ( & mut cursor, 0 ) ) ?;
10901067 if ( amt_read / 8 ) != total_len {
1091- extern crate alloc;
1092- use alloc:: borrow:: Cow ;
1093- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( "Too much data" ) ) ) ;
1068+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Too much data" ) ) ;
10941069 }
10951070 Ok ( res)
10961071 }
0 commit comments