1
use super::super::context::CompileContext;
2
use super::super::emit::FunctionEmitter;
3
use super::super::expr::{compile_nil, eval_value, format_expr};
4
use crate::ast::Expr;
5
use crate::error::Result;
6
use crate::runtime::SymbolTable;
7

            
8
const SCRATCH_OFFSET: u32 = 0;
9

            
10
pub(super) fn debug_call(symbols: &mut SymbolTable, args: &[Expr]) -> Result<Expr> {
11
    let parts: Vec<String> = args
12
        .iter()
13
        .map(|a| eval_value(symbols, a).map(|r| format_expr(&r)))
14
        .collect::<Result<_>>()?;
15
    let msg = parts.join(" ");
16
    tracing::debug!("[script] {msg}");
17
    Ok(Expr::Nil)
18
}
19

            
20
pub(in crate::compiler) fn compile_debug_effect(
21
    ctx: &mut CompileContext,
22
    emit: &mut FunctionEmitter,
23
    symbols: &mut SymbolTable,
24
    args: &[Expr],
25
) -> Result<()> {
26
    let resolved: std::result::Result<Vec<_>, _> =
27
        args.iter().map(|a| eval_value(symbols, a)).collect();
28
    let msg = resolved?
29
        .iter()
30
        .map(format_expr)
31
        .collect::<Vec<_>>()
32
        .join(" ");
33
    let data_idx = ctx.add_data(msg.as_bytes());
34
    let len = msg.len() as u32;
35
    emit.memory_init(data_idx, SCRATCH_OFFSET, len);
36
    emit.i32_const(0);
37
    emit.i32_const(SCRATCH_OFFSET as i32);
38
    emit.i32_const(len as i32);
39
    emit.call(ctx.func("log"));
40
    Ok(())
41
}
42

            
43
132
pub(super) fn compile_debug(
44
132
    ctx: &mut CompileContext,
45
132
    emit: &mut FunctionEmitter,
46
132
    symbols: &mut SymbolTable,
47
132
    args: &[Expr],
48
132
) -> Result<()> {
49
132
    let resolved: std::result::Result<Vec<_>, _> =
50
264
        args.iter().map(|a| eval_value(symbols, a)).collect();
51
132
    let msg = resolved?
52
132
        .iter()
53
132
        .map(format_expr)
54
132
        .collect::<Vec<_>>()
55
132
        .join(" ");
56
132
    let data_idx = ctx.add_data(msg.as_bytes());
57
132
    let len = msg.len() as u32;
58
132
    emit.memory_init(data_idx, SCRATCH_OFFSET, len);
59
132
    emit.i32_const(0); // level = debug
60
132
    emit.i32_const(SCRATCH_OFFSET as i32);
61
132
    emit.i32_const(len as i32);
62
132
    emit.call(ctx.func("log"));
63
132
    compile_nil(ctx, emit);
64
132
    Ok(())
65
132
}