@@ -63,21 +63,35 @@ impl State {
6363 let offset_to_entries = header ( & mut write, version, num_entries) ?;
6464 let offset_to_extensions = entries ( & mut write, self , offset_to_entries) ?;
6565
66- let mut extensions = Vec :: with_capacity ( 5 ) ;
67- if let Some ( offset_past_tree_ext) = tree_cache_extension
68- . then ( || self . tree ( ) )
69- . flatten ( )
70- . map ( |tree| tree. write_to ( & mut write) . map ( |_| write. count ) )
71- . transpose ( ) ?
72- {
73- extensions. push ( (
74- extension:: tree:: SIGNATURE ,
75- offset_past_tree_ext - offset_to_extensions - ( extension:: MIN_SIZE as u32 ) ,
76- ) ) ;
77- }
66+ let extensions = {
67+ let extensions: & [ & dyn Fn ( & mut dyn std:: io:: Write ) -> Option < std:: io:: Result < extension:: Signature > > ] =
68+ & [ & |write| {
69+ tree_cache_extension
70+ . then ( || self . tree ( ) )
71+ . flatten ( )
72+ . map ( |tree| tree. write_to ( write) . map ( |_| extension:: tree:: SIGNATURE ) )
73+ } ] ;
74+
75+ let mut offset_to_previous_ext = offset_to_extensions;
76+ let mut out = Vec :: with_capacity ( 5 ) ;
77+ for write_ext in extensions {
78+ if let Some ( signature) = write_ext ( & mut write) . transpose ( ) ? {
79+ let offset_past_ext = write. count ;
80+ let ext_size = offset_past_ext - offset_to_previous_ext - ( extension:: MIN_SIZE as u32 ) ;
81+ offset_to_previous_ext = offset_past_ext;
82+ out. push ( ( signature, ext_size) ) ;
83+ }
84+ }
85+ out
86+ } ;
7887
7988 if num_entries > 0 && end_of_index_entry_extension && !extensions. is_empty ( ) {
80- extension:: end_of_index_entry:: write_to ( write. inner , hash_kind, offset_to_extensions, & extensions) ?
89+ extension:: end_of_index_entry:: write_to (
90+ write. inner ,
91+ hash_kind,
92+ offset_to_extensions,
93+ extensions. into_iter ( ) ,
94+ ) ?
8195 }
8296
8397 Ok ( ( ) )
0 commit comments