Skip to main content

fluentbase_runtime/syscall_handler/host/
debug_log.rs

1use 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]) {}