@@ -323,6 +323,24 @@ fn ensure_valid_return_type(item_fn: &ItemFn) -> Result<()> {
323323 Ok ( ( ) )
324324}
325325
326+ /// Ensure that the passed statements do not contain any forbidden variable names
327+ fn ensure_no_forbidden_variable_names ( stmts : & [ Stmt ] ) -> Result < ( ) > {
328+ const FORBIDDEN_VAR_NAMES : [ & str ; 2 ] = [ "recording" , "verify" ] ;
329+ for stmt in stmts {
330+ let Stmt :: Local ( l) = stmt else { continue } ;
331+ let Pat :: Ident ( ident) = & l. pat else { continue } ;
332+ if FORBIDDEN_VAR_NAMES . contains ( & ident. ident . to_string ( ) . as_str ( ) ) {
333+ return Err ( Error :: new (
334+ ident. span ( ) ,
335+ format ! (
336+ "Variables {FORBIDDEN_VAR_NAMES:?} are reserved for benchmarking internals." ,
337+ ) ,
338+ ) ) ;
339+ }
340+ }
341+ Ok ( ( ) )
342+ }
343+
326344/// Parses params such as `x: Linear<0, 1>`
327345fn parse_params ( item_fn : & ItemFn ) -> Result < Vec < ParamDef > > {
328346 let mut params: Vec < ParamDef > = Vec :: new ( ) ;
@@ -481,9 +499,12 @@ impl BenchmarkDef {
481499 }
482500 } ;
483501
502+ let setup_stmts = Vec :: from ( & item_fn. block . stmts [ 0 ..i] ) ;
503+ ensure_no_forbidden_variable_names ( & setup_stmts) ?;
504+
484505 Ok ( BenchmarkDef {
485506 params,
486- setup_stmts : Vec :: from ( & item_fn . block . stmts [ 0 ..i ] ) ,
507+ setup_stmts,
487508 call_def,
488509 verify_stmts,
489510 last_stmt,
@@ -692,18 +713,16 @@ pub fn benchmarks(
692713
693714 fn instance(
694715 & self ,
716+ recording: & mut impl #krate:: Recording ,
695717 components: & [ ( #krate:: BenchmarkParameter , u32 ) ] ,
696718 verify: bool ,
697- ) -> Result <
698- #krate:: __private:: Box <dyn FnOnce ( ) -> Result <( ) , #krate:: BenchmarkError >>,
699- #krate:: BenchmarkError ,
700- > {
719+ ) -> Result <( ) , #krate:: BenchmarkError > {
701720 match self {
702721 #(
703722 Self :: #benchmark_names => {
704723 <#benchmark_names as #krate:: BenchmarkingSetup <
705724 #type_use_generics
706- >>:: instance( & #benchmark_names, components, verify)
725+ >>:: instance( & #benchmark_names, recording , components, verify)
707726 }
708727 )
709728 *
@@ -794,17 +813,7 @@ pub fn benchmarks(
794813 #krate:: benchmarking:: set_whitelist( whitelist. clone( ) ) ;
795814 let mut results: #krate:: __private:: Vec <#krate:: BenchmarkResult > = #krate:: __private:: Vec :: new( ) ;
796815
797- // Always do at least one internal repeat...
798- for _ in 0 .. internal_repeats. max( 1 ) {
799- // Always reset the state after the benchmark.
800- #krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
801-
802- // Set up the externalities environment for the setup we want to
803- // benchmark.
804- let closure_to_benchmark = <
805- SelectedBenchmark as #krate:: BenchmarkingSetup <#type_use_generics>
806- >:: instance( & selected_benchmark, c, verify) ?;
807-
816+ let on_before_start = || {
808817 // Set the block number to at least 1 so events are deposited.
809818 if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
810819 #frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
@@ -822,6 +831,12 @@ pub fn benchmarks(
822831
823832 // Reset the read/write counter so we don't count operations in the setup process.
824833 #krate:: benchmarking:: reset_read_write_count( ) ;
834+ } ;
835+
836+ // Always do at least one internal repeat...
837+ for _ in 0 .. internal_repeats. max( 1 ) {
838+ // Always reset the state after the benchmark.
839+ #krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
825840
826841 // Time the extrinsic logic.
827842 #krate:: __private:: log:: trace!(
@@ -831,20 +846,12 @@ pub fn benchmarks(
831846 c
832847 ) ;
833848
834- let start_pov = #krate:: benchmarking:: proof_size( ) ;
835- let start_extrinsic = #krate:: benchmarking:: current_time( ) ;
836-
837- closure_to_benchmark( ) ?;
838-
839- let finish_extrinsic = #krate:: benchmarking:: current_time( ) ;
840- let end_pov = #krate:: benchmarking:: proof_size( ) ;
849+ let mut recording = #krate:: BenchmarkRecording :: new( & on_before_start) ;
850+ <SelectedBenchmark as #krate:: BenchmarkingSetup <#type_use_generics>>:: instance( & selected_benchmark, & mut recording, c, verify) ?;
841851
842852 // Calculate the diff caused by the benchmark.
843- let elapsed_extrinsic = finish_extrinsic. saturating_sub( start_extrinsic) ;
844- let diff_pov = match ( start_pov, end_pov) {
845- ( Some ( start) , Some ( end) ) => end. saturating_sub( start) ,
846- _ => Default :: default ( ) ,
847- } ;
853+ let elapsed_extrinsic = recording. elapsed_extrinsic( ) . expect( "elapsed time should be recorded" ) ;
854+ let diff_pov = recording. diff_pov( ) . unwrap_or_default( ) ;
848855
849856 // Commit the changes to get proper write count
850857 #krate:: benchmarking:: commit_db( ) ;
@@ -1163,9 +1170,10 @@ fn expand_benchmark(
11631170
11641171 fn instance(
11651172 & self ,
1173+ recording: & mut impl #krate:: Recording ,
11661174 components: & [ ( #krate:: BenchmarkParameter , u32 ) ] ,
11671175 verify: bool
1168- ) -> Result <#krate :: __private :: Box <dyn FnOnce ( ) -> Result < ( ) , #krate :: BenchmarkError >> , #krate:: BenchmarkError > {
1176+ ) -> Result <( ) , #krate:: BenchmarkError > {
11691177 #(
11701178 // prepare instance #param_names
11711179 let #param_names = components. iter( )
@@ -1179,15 +1187,15 @@ fn expand_benchmark(
11791187 #setup_stmts
11801188 ) *
11811189 #pre_call
1182- Ok ( #krate :: __private :: Box :: new ( move || -> Result < ( ) , #krate :: BenchmarkError > {
1183- #post_call
1184- if verify {
1185- # (
1186- #verify_stmts
1187- ) *
1188- }
1189- #impl_last_stmt
1190- } ) )
1190+ recording . start ( ) ;
1191+ #post_call
1192+ recording . stop ( ) ;
1193+ if verify {
1194+ # (
1195+ #verify_stmts
1196+ ) *
1197+ }
1198+ #impl_last_stmt
11911199 }
11921200 }
11931201
@@ -1205,18 +1213,15 @@ fn expand_benchmark(
12051213 // Always reset the state after the benchmark.
12061214 #krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
12071215
1208- // Set up the benchmark, return execution + verification function.
1209- let closure_to_verify = <
1210- SelectedBenchmark as #krate:: BenchmarkingSetup <T , _>
1211- >:: instance( & selected_benchmark, & c, true ) ?;
1212-
1213- // Set the block number to at least 1 so events are deposited.
1214- if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
1215- #frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
1216- }
1216+ let on_before_start = || {
1217+ // Set the block number to at least 1 so events are deposited.
1218+ if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
1219+ #frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
1220+ }
1221+ } ;
12171222
12181223 // Run execution + verification
1219- closure_to_verify ( )
1224+ < SelectedBenchmark as #krate :: BenchmarkingSetup < T , _>> :: test_instance ( & selected_benchmark , & c , & on_before_start )
12201225 } ;
12211226
12221227 if components. is_empty( ) {
0 commit comments