@@ -279,7 +279,7 @@ pub trait Ext: sealing::Sealed {
279
279
/// when the code is executing on-chain.
280
280
///
281
281
/// Returns `true` if debug message recording is enabled. Otherwise `false` is returned.
282
- fn append_debug_buffer ( & mut self , msg : & str ) -> Result < bool , DispatchError > ;
282
+ fn append_debug_buffer ( & mut self , msg : & str ) -> bool ;
283
283
284
284
/// Call some dispatchable and return the result.
285
285
fn call_runtime ( & self , call : <Self :: T as Config >:: RuntimeCall ) -> DispatchResultWithPostInfo ;
@@ -1334,16 +1334,34 @@ where
1334
1334
& mut self . top_frame_mut ( ) . nested_gas
1335
1335
}
1336
1336
1337
- fn append_debug_buffer ( & mut self , msg : & str ) -> Result < bool , DispatchError > {
1337
+ fn append_debug_buffer ( & mut self , msg : & str ) -> bool {
1338
1338
if let Some ( buffer) = & mut self . debug_message {
1339
- if !msg. is_empty ( ) {
1340
- buffer
1341
- . try_extend ( & mut msg. bytes ( ) )
1342
- . map_err ( |_| Error :: < T > :: DebugBufferExhausted ) ?;
1343
- }
1344
- Ok ( true )
1339
+ let mut msg = msg. bytes ( ) ;
1340
+ let num_drain = {
1341
+ let capacity = DebugBufferVec :: < T > :: bound ( ) . checked_sub ( buffer. len ( ) ) . expect (
1342
+ "
1343
+ `buffer` is of type `DebugBufferVec`,
1344
+ `DebugBufferVec` is a `BoundedVec`,
1345
+ `BoundedVec::len()` <= `BoundedVec::bound()`;
1346
+ qed
1347
+ " ,
1348
+ ) ;
1349
+ msg. len ( ) . saturating_sub ( capacity) . min ( buffer. len ( ) )
1350
+ } ;
1351
+ buffer. drain ( 0 ..num_drain) ;
1352
+ buffer
1353
+ . try_extend ( & mut msg)
1354
+ . map_err ( |_| {
1355
+ log:: debug!(
1356
+ target: "runtime::contracts" ,
1357
+ "Debug message to big (size={}) for debug buffer (bound={})" ,
1358
+ msg. len( ) , DebugBufferVec :: <T >:: bound( ) ,
1359
+ ) ;
1360
+ } )
1361
+ . ok ( ) ;
1362
+ true
1345
1363
} else {
1346
- Ok ( false )
1364
+ false
1347
1365
}
1348
1366
}
1349
1367
@@ -2511,12 +2529,8 @@ mod tests {
2511
2529
#[ test]
2512
2530
fn printing_works ( ) {
2513
2531
let code_hash = MockLoader :: insert ( Call , |ctx, _| {
2514
- ctx. ext
2515
- . append_debug_buffer ( "This is a test" )
2516
- . expect ( "Maximum allowed debug buffer size exhausted!" ) ;
2517
- ctx. ext
2518
- . append_debug_buffer ( "More text" )
2519
- . expect ( "Maximum allowed debug buffer size exhausted!" ) ;
2532
+ ctx. ext . append_debug_buffer ( "This is a test" ) ;
2533
+ ctx. ext . append_debug_buffer ( "More text" ) ;
2520
2534
exec_success ( )
2521
2535
} ) ;
2522
2536
@@ -2549,12 +2563,8 @@ mod tests {
2549
2563
#[ test]
2550
2564
fn printing_works_on_fail ( ) {
2551
2565
let code_hash = MockLoader :: insert ( Call , |ctx, _| {
2552
- ctx. ext
2553
- . append_debug_buffer ( "This is a test" )
2554
- . expect ( "Maximum allowed debug buffer size exhausted!" ) ;
2555
- ctx. ext
2556
- . append_debug_buffer ( "More text" )
2557
- . expect ( "Maximum allowed debug buffer size exhausted!" ) ;
2566
+ ctx. ext . append_debug_buffer ( "This is a test" ) ;
2567
+ ctx. ext . append_debug_buffer ( "More text" ) ;
2558
2568
exec_trapped ( )
2559
2569
} ) ;
2560
2570
@@ -2587,7 +2597,7 @@ mod tests {
2587
2597
#[ test]
2588
2598
fn debug_buffer_is_limited ( ) {
2589
2599
let code_hash = MockLoader :: insert ( Call , move |ctx, _| {
2590
- ctx. ext . append_debug_buffer ( "overflowing bytes" ) ? ;
2600
+ ctx. ext . append_debug_buffer ( "overflowing bytes" ) ;
2591
2601
exec_success ( )
2592
2602
} ) ;
2593
2603
@@ -2602,20 +2612,22 @@ mod tests {
2602
2612
set_balance ( & ALICE , min_balance * 10 ) ;
2603
2613
place_contract ( & BOB , code_hash) ;
2604
2614
let mut storage_meter = storage:: meter:: Meter :: new ( & ALICE , Some ( 0 ) , 0 ) . unwrap ( ) ;
2605
- assert_err ! (
2606
- MockStack :: run_call(
2607
- ALICE ,
2608
- BOB ,
2609
- & mut gas_meter,
2610
- & mut storage_meter,
2611
- & schedule,
2612
- 0 ,
2613
- vec![ ] ,
2614
- Some ( & mut debug_buffer) ,
2615
- Determinism :: Deterministic ,
2616
- )
2617
- . map_err( |e| e. error) ,
2618
- Error :: <Test >:: DebugBufferExhausted
2615
+ MockStack :: run_call (
2616
+ ALICE ,
2617
+ BOB ,
2618
+ & mut gas_meter,
2619
+ & mut storage_meter,
2620
+ & schedule,
2621
+ 0 ,
2622
+ vec ! [ ] ,
2623
+ Some ( & mut debug_buffer) ,
2624
+ Determinism :: Deterministic ,
2625
+ )
2626
+ . unwrap ( ) ;
2627
+ assert_eq ! (
2628
+ & String :: from_utf8( debug_buffer[ DebugBufferVec :: <Test >:: bound( ) - 17 ..] . to_vec( ) )
2629
+ . unwrap( ) ,
2630
+ "overflowing bytes"
2619
2631
) ;
2620
2632
} ) ;
2621
2633
}
0 commit comments