use crate::compiler::format_source;
use crate::lua_value::LuaValue;
#[derive(Debug, Clone, Default)]
pub struct DebugInfo {
pub source: Option<String>,
pub short_src: Option<String>,
pub linedefined: Option<i32>,
pub lastlinedefined: Option<i32>,
pub what: Option<&'static str>,
pub currentline: Option<i32>,
pub nups: Option<u8>,
pub nparams: Option<u8>,
pub isvararg: Option<bool>,
pub name: Option<String>,
pub namewhat: Option<String>,
pub istailcall: Option<bool>,
pub extraargs: Option<u8>,
pub ftransfer: Option<i32>,
pub ntransfer: Option<i32>,
pub activelines: Option<Vec<i32>>,
pub func: Option<LuaValue>,
}
impl DebugInfo {
pub fn new() -> Self {
Self::default()
}
pub(crate) fn fill_source(
&mut self,
source_name: Option<&str>,
linedefined: i32,
lastlinedefined: i32,
) {
let source = source_name.unwrap_or("=?");
self.source = Some(source.to_string());
self.short_src = Some(format_source(source));
self.linedefined = Some(linedefined);
self.lastlinedefined = Some(lastlinedefined);
self.what = Some(if linedefined == 0 { "main" } else { "Lua" });
}
pub(crate) fn fill_source_c(&mut self) {
self.source = Some("=[C]".to_string());
self.short_src = Some("[C]".to_string());
self.linedefined = Some(-1);
self.lastlinedefined = Some(-1);
self.what = Some("C");
}
pub(crate) fn fill_currentline(&mut self, currentline: i32) {
self.currentline = Some(currentline);
}
pub(crate) fn fill_upvalues(&mut self, nups: u8, nparams: u8, isvararg: bool) {
self.nups = Some(nups);
self.nparams = Some(nparams);
self.isvararg = Some(isvararg);
}
pub(crate) fn fill_upvalues_c(&mut self, nups: u8) {
self.nups = Some(nups);
self.nparams = Some(0);
self.isvararg = Some(true);
}
pub(crate) fn fill_name(&mut self, namewhat: &str, name: &str) {
self.namewhat = Some(namewhat.to_string());
self.name = Some(name.to_string());
}
pub(crate) fn fill_name_empty(&mut self) {
self.namewhat = Some(String::new());
self.name = None;
}
pub(crate) fn fill_tail(&mut self, istailcall: bool, extraargs: u8) {
self.istailcall = Some(istailcall);
self.extraargs = Some(extraargs);
}
pub(crate) fn fill_transfer(&mut self, ftransfer: i32, ntransfer: i32) {
self.ftransfer = Some(ftransfer);
self.ntransfer = Some(ntransfer);
}
pub(crate) fn fill_activelines(&mut self, line_info: &[u32], is_vararg: bool) {
let mut lines = Vec::new();
let start = if is_vararg { 1 } else { 0 }; for i in start..line_info.len() {
let line = line_info[i] as i32;
if !lines.contains(&line) {
lines.push(line);
}
}
self.activelines = Some(lines);
}
pub(crate) fn fill_activelines_nil(&mut self) {
self.activelines = None;
}
pub(crate) fn fill_func(&mut self, func: LuaValue) {
self.func = Some(func);
}
}