pub const LUA_MULTRET: i32 = -1;
#[derive(Debug, Clone)]
pub struct CallInfo {
pub func: usize,
pub base: usize,
pub top: usize,
pub saved_pc: usize,
pub num_results: i32,
pub tail_calls: i32,
pub is_lua: bool,
}
impl CallInfo {
#[must_use]
pub fn new(func: usize, base: usize, top: usize, num_results: i32) -> Self {
Self {
func,
base,
top,
saved_pc: 0,
num_results,
tail_calls: 0,
is_lua: false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lua_multret_value() {
assert_eq!(LUA_MULTRET, -1);
}
#[test]
fn callinfo_new() {
let ci = CallInfo::new(0, 1, 21, LUA_MULTRET);
assert_eq!(ci.func, 0);
assert_eq!(ci.base, 1);
assert_eq!(ci.top, 21);
assert_eq!(ci.saved_pc, 0);
assert_eq!(ci.num_results, LUA_MULTRET);
assert_eq!(ci.tail_calls, 0);
}
#[test]
fn callinfo_with_fixed_results() {
let ci = CallInfo::new(5, 6, 26, 3);
assert_eq!(ci.func, 5);
assert_eq!(ci.base, 6);
assert_eq!(ci.top, 26);
assert_eq!(ci.num_results, 3);
}
#[test]
fn callinfo_clone() {
let ci = CallInfo::new(0, 1, 21, 1);
let ci2 = ci.clone();
assert_eq!(ci.func, ci2.func);
assert_eq!(ci.base, ci2.base);
assert_eq!(ci.top, ci2.top);
assert_eq!(ci.num_results, ci2.num_results);
}
#[test]
fn callinfo_saved_pc_mutation() {
let mut ci = CallInfo::new(0, 1, 21, 1);
assert_eq!(ci.saved_pc, 0);
ci.saved_pc = 42;
assert_eq!(ci.saved_pc, 42);
}
#[test]
fn callinfo_tail_calls_mutation() {
let mut ci = CallInfo::new(0, 1, 21, 1);
assert_eq!(ci.tail_calls, 0);
ci.tail_calls = 5;
assert_eq!(ci.tail_calls, 5);
}
#[test]
fn callinfo_debug_format() {
let ci = CallInfo::new(0, 1, 21, LUA_MULTRET);
let debug = format!("{ci:?}");
assert!(debug.contains("CallInfo"));
assert!(debug.contains("func: 0"));
assert!(debug.contains("base: 1"));
}
}