fluentbase_runtime/syscall_handler/host/
debug_log.rs1use crate::RuntimeContext;
2use core::cell::Cell;
3use rwasm::{StoreTr, TrapCode, Value};
4
5thread_local! {
6 pub static LAST_LOG_TIME: Cell<u128> = const { Cell::new(0) };
7}
8
9pub fn syscall_debug_log_handler(
10 caller: &mut impl StoreTr<RuntimeContext>,
11 params: &[Value],
12 _result: &mut [Value],
13) -> Result<(), TrapCode> {
14 let (message_ptr, message_len) = (
15 params[0].i32().unwrap() as usize,
16 params[1].i32().unwrap() as usize,
17 );
18 let buffer = caller.memory_read_into_vec(message_ptr, message_len)?;
19 syscall_debug_log_impl(&buffer);
20 Ok(())
21}
22
23#[cfg(feature = "debug-print")]
24pub fn syscall_debug_log_impl(mut msg: &[u8]) {
25 use std::time::SystemTime;
26 let curr_time = SystemTime::now()
27 .duration_since(SystemTime::UNIX_EPOCH)
28 .unwrap()
29 .as_micros();
30 let last_time = LAST_LOG_TIME.get();
31 let time_diff = if last_time > 0 {
32 curr_time - last_time
33 } else {
34 0
35 };
36 LAST_LOG_TIME.set(curr_time);
37 const DEBUG_LOG_MAXIMUM_LEN: usize = 1_000;
38 if msg.len() > DEBUG_LOG_MAXIMUM_LEN {
39 msg = &msg[..DEBUG_LOG_MAXIMUM_LEN]
40 }
41 println!(
42 "debug_log (diff {}us): {}",
43 time_diff,
44 std::str::from_utf8(msg)
45 .map(|s| s.to_string())
46 .unwrap_or("non utf-8 message".to_string())
47 );
48}
49
50#[cfg(not(feature = "debug-print"))]
51pub fn syscall_debug_log_impl(_msg: &[u8]) {}