@@ -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
@@ -356,16 +360,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
356360 if !has_default_match && default_reader. is_none ( ) {
357361 variant_matches. push ( quote ! {
358362 _ => {
359- extern crate alloc;
360- use alloc:: borrow:: Cow ;
361- use alloc:: format;
362- return Err ( :: #crate_:: DekuError :: Parse (
363- Cow :: from( format!(
364- "Could not match enum variant id = {:?} on enum `{}`" ,
365- __deku_variant_id,
366- #ident_as_string
367- ) )
368- ) ) ;
363+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Could not match enum variant" , "ID {:?} not found on {}" , __deku_variant_id, #ident_as_string) ) ;
369364 }
370365 } ) ;
371366 }
@@ -540,10 +535,7 @@ fn emit_magic_read_lit(crate_: &Ident, magic: &LitByteStr) -> TokenStream {
540535 for __deku_byte in __deku_magic {
541536 let __deku_read_byte = u8 :: from_reader_with_ctx( __deku_reader, ( ) ) ?;
542537 if * __deku_byte != __deku_read_byte {
543- extern crate alloc;
544- use alloc:: borrow:: Cow ;
545- use alloc:: format;
546- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( format!( "Missing magic value {:?}" , #magic) ) ) ) ;
538+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Missing magic value" , "{:?}" , #magic) ) ;
547539 }
548540 }
549541 }
@@ -615,19 +607,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
615607 let order = gen_bit_order_from_str ( bit_order) . unwrap ( ) ;
616608 quote ! {
617609 {
618- use core:: convert:: TryFrom ;
619- // TODO: I hope this consts in most cases?
620610 extern crate alloc;
621- use alloc :: borrow :: Cow ;
622- use alloc :: format ;
611+
612+ use core :: convert :: TryFrom ;
623613 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
624- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
625- "Invalid padding param \" ({})\" : cannot convert to usize" ,
626- stringify!( #bit_size)
627- ) ) )
614+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert ot usize" , "{}" , stringify!( #bit_size) )
628615 ) ?;
629616
630-
631617 if ( __deku_pad % 8 ) == 0 {
632618 let bytes_read = __deku_pad / 8 ;
633619 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -642,19 +628,13 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
642628 } else {
643629 quote ! {
644630 {
645- use core:: convert:: TryFrom ;
646- // TODO: I hope this consts in most cases?
647631 extern crate alloc;
648- use alloc :: borrow :: Cow ;
649- use alloc :: format ;
632+
633+ use core :: convert :: TryFrom ;
650634 let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
651- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
652- "Invalid padding param \" ({})\" : cannot convert to usize" ,
653- stringify!( #bit_size)
654- ) ) )
635+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
655636 ) ?;
656637
657-
658638 if ( __deku_pad % 8 ) == 0 {
659639 let bytes_read = __deku_pad / 8 ;
660640 let mut buf = alloc:: vec![ 0 ; bytes_read] ;
@@ -673,22 +653,20 @@ fn emit_padding(bit_size: &TokenStream, bit_order: Option<&LitStr>) -> TokenStre
673653#[ cfg( not( feature = "bits" ) ) ]
674654fn emit_padding_bytes ( bit_size : & TokenStream ) -> TokenStream {
675655 let crate_ = super :: get_crate_name ( ) ;
656+ let pad = crate :: PAD_ARRAY_SIZE ;
676657 quote ! {
677658 {
678659 use core:: convert:: TryFrom ;
679- extern crate alloc;
680- use alloc:: borrow:: Cow ;
681- use alloc:: format;
682- let __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
683- :: #crate_:: DekuError :: InvalidParam ( Cow :: from( format!(
684- "Invalid padding param \" ({})\" : cannot convert to usize" ,
685- stringify!( #bit_size)
686- ) ) )
660+ let mut __deku_pad = usize :: try_from( #bit_size) . map_err( |e|
661+ :: #crate_:: deku_error!( :: #crate_:: DekuError :: InvalidParam , "Invalid padding param, cannot convert to usize" , "{}" , stringify!( #bit_size) )
687662 ) ?;
688663
689-
690- let mut buf = alloc:: vec![ 0 ; __deku_pad] ;
691- let _ = __deku_reader. read_bytes( __deku_pad, & mut buf, :: #crate_:: ctx:: Order :: default ( ) ) ?;
664+ while __deku_pad > 0 {
665+ let mut __deku_pad_source = [ 0u8 ; #pad] ;
666+ let __deku_pad_chunk = core:: cmp:: min( __deku_pad_source. len( ) , __deku_pad) ;
667+ __deku_reader. read_bytes( __deku_pad_chunk, & mut __deku_pad_source[ ..__deku_pad_chunk] , :: #crate_:: ctx:: Order :: default ( ) ) ?;
668+ __deku_pad -= __deku_pad_chunk;
669+ }
692670 }
693671 }
694672}
@@ -1094,9 +1072,7 @@ pub fn emit_try_from(
10941072 let mut cursor = :: #crate_:: no_std_io:: Cursor :: new( input) ;
10951073 let ( amt_read, res) = <Self as :: #crate_:: DekuContainerRead >:: from_reader( ( & mut cursor, 0 ) ) ?;
10961074 if ( amt_read / 8 ) != total_len {
1097- extern crate alloc;
1098- use alloc:: borrow:: Cow ;
1099- return Err ( :: #crate_:: DekuError :: Parse ( Cow :: from( "Too much data" ) ) ) ;
1075+ return Err ( :: #crate_:: deku_error!( :: #crate_:: DekuError :: Parse , "Too much data" ) ) ;
11001076 }
11011077 Ok ( res)
11021078 }
0 commit comments