Skip to main content

luaur_bytecode/methods/
bytecode_builder_add_debug_remark.rs

1use crate::enums::dump_flags::DumpFlags;
2use crate::records::bytecode_builder::BytecodeBuilder;
3use luaur_common::functions::vformat_append::vformatAppend;
4
5impl BytecodeBuilder {
6    pub fn add_debug_remark(&mut self, args: core::fmt::Arguments<'_>) {
7        if (self.dump_flags & (DumpFlags::Dump_Remarks as u32)) == 0 {
8            return;
9        }
10
11        let offset = self.debug_remark_buffer.len();
12
13        // C++ `addDebugRemark(const char* format, ...)` printf-formats the whole remark.
14        // Rust has no printf, so callers pass the fully-rendered message as a single
15        // `format_args!(...)` (the C-style `%d`/`%.2f` become `{}`/`{:.2}`).
16        vformatAppend(&mut self.debug_remark_buffer, args);
17
18        // we null-terminate all remarks to avoid storing remark length
19        self.debug_remark_buffer.push('\0');
20
21        self.debug_remarks
22            .push((self.insns.len() as u32, offset as u32));
23
24        let remark_len = self.debug_remark_buffer.as_bytes()[offset..]
25            .iter()
26            .position(|&b| b == 0)
27            .unwrap_or(self.debug_remark_buffer.len() - offset) as i32;
28
29        let remark_str =
30            self.debug_remark_buffer[offset..offset + (remark_len as usize)].to_string();
31
32        self.dump_remarks.push((self.debug_line, remark_str));
33    }
34}