@@ -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
@@ -357,16 +361,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
357361 if !has_default_match && default_reader. is_none ( ) {
358362 variant_matches. push ( quote ! {
359363 _ => {
360- extern crate alloc;
361- use alloc:: borrow:: Cow ;
362- use alloc:: format;
363- return Err ( :: #crate_:: DekuError :: Parse (
364- Cow :: from( format!(
365- "Could not match enum variant id = {:?} on enum `{}`" ,
366- __deku_variant_id,
367- #ident_as_string
368- ) )
369- ) ) ;
364+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Could not match enum variant" , "ID {:?} not found on {}" , __deku_variant_id, #ident_as_string) ) ;
370365 }
371366 } ) ;
372367 }
@@ -538,10 +533,7 @@ fn emit_magic_read_lit(crate_: &Ident, magic: &LitByteStr) -> TokenStream {
538533 for __deku_byte in __deku_magic {
539534 let __deku_read_byte = u8 :: from_reader_with_ctx( __deku_reader, ( ) ) ?;
540535 if * __deku_byte != __deku_read_byte {
541- extern crate alloc;
542- use alloc:: borrow:: Cow ;
543- use alloc:: format;
544- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( format!( "Missing magic value {:?}" , #magic) ) ) ) ;
536+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Missing magic value" , "{:?}" , #magic) ) ;
545537 }
546538 }
547539 }
@@ -613,19 +605,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
613605 let order = gen_bit_order_from_str ( bit_order) . unwrap ( ) ;
614606 quote ! {
615607 {
616- use core:: convert:: TryFrom ;
617- // TODO: I hope this consts in most cases?
618608 extern crate alloc;
619- use alloc :: borrow :: Cow ;
620- use alloc :: format ;
609+
610+ use core :: convert :: TryFrom ;
621611 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
622- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
623- "Invalid padding param \" ({})\" : cannot convert to usize" ,
624- stringify!( #bit_size)
625- ) ) )
612+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert ot usize" , "{}" , stringify!( #bit_size) )
626613 ) ?;
627614
628-
629615 if ( __deku_pad % 8 ) == 0 {
630616 let bytes_read = __deku_pad / 8 ;
631617 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -640,19 +626,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
640626 } else {
641627 quote ! {
642628 {
643- use core:: convert:: TryFrom ;
644- // TODO: I hope this consts in most cases?
645629 extern crate alloc;
646- use alloc :: borrow :: Cow ;
647- use alloc :: format ;
630+
631+ use core :: convert :: TryFrom ;
648632 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
649- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
650- "Invalid padding param \" ({})\" : cannot convert to usize" ,
651- stringify!( #bit_size)
652- ) ) )
633+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
653634 ) ?;
654635
655-
656636 if ( __deku_pad % 8 ) == 0 {
657637 let bytes_read = __deku_pad / 8 ;
658638 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -674,19 +654,16 @@ fn emit_padding_bytes(bit_size: &TokenStream) -> TokenStream {
674654 quote ! {
675655 {
676656 use core:: convert:: TryFrom ;
677- extern crate alloc;
678- use alloc:: borrow:: Cow ;
679- use alloc:: format;
680- let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
681- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
682- "Invalid padding param \" ({})\" : cannot convert to usize" ,
683- stringify!( #bit_size)
684- ) ) )
657+ let mut __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
658+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
685659 ) ?;
686660
687-
688- let mut buf = alloc:: vec![ 0 ; __deku_pad] ;
689- let _ = __deku_reader. read_bytes( __deku_pad, & mut buf, :: #crate_:: ctx:: Order :: default ( ) ) ?;
661+ while __deku_pad > 0 {
662+ let mut __deku_pad_source = [ 0u8 ; 64 ] ;
663+ let __deku_pad_chunk = core:: cmp:: min( __deku_pad_source. len( ) , __deku_pad) ;
664+ __deku_reader. read_bytes( __deku_pad_chunk, & mut __deku_pad_source[ ..__deku_pad_chunk] , :: #crate_:: ctx:: Order :: default ( ) ) ?;
665+ __deku_pad -= __deku_pad_chunk;
666+ }
690667 }
691668 }
692669}
@@ -1092,9 +1069,7 @@ pub fn emit_try_from(
10921069 let mut cursor = :: #crate_:: no_std_io:: Cursor :: new( input) ;
10931070 let ( amt_read, res) = <Self as :: #crate_:: DekuContainerRead >:: from_reader( ( & mut cursor, 0 ) ) ?;
10941071 if ( amt_read / 8 ) != total_len {
1095- extern crate alloc;
1096- use alloc:: borrow:: Cow ;
1097- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( "Too much data" ) ) ) ;
1072+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Too much data" ) ) ;
10981073 }
10991074 Ok ( res)
11001075 }
0 commit comments