1use crate::closure::LuaLClosure;
5use crate::gc::GcRef;
6use crate::opcode::Instruction;
7use crate::string::LuaString;
8use crate::value::LuaValue;
9use core::cell::RefCell;
10
11#[derive(Debug)]
12pub struct LuaProto {
13 pub numparams: u8,
14 pub is_vararg: bool,
15 pub maxstacksize: u8,
16 pub upvalues: Vec<UpvalDesc>,
17 pub k: Vec<LuaValue>,
18 pub code: Vec<Instruction>,
19 pub p: Vec<GcRef<LuaProto>>,
20 pub lineinfo: Vec<i8>,
21 pub abslineinfo: Vec<AbsLineInfo>,
22 pub locvars: Vec<LocalVar>,
23 pub linedefined: i32,
24 pub lastlinedefined: i32,
25 pub source: Option<GcRef<LuaString>>,
26 pub cache: RefCell<Option<GcRef<LuaLClosure>>>,
34 pub vararg_table_reg: Option<u8>,
41 pub vararg_table_needed: bool,
44}
45
46impl LuaProto {
47 pub fn placeholder() -> Self {
48 LuaProto {
49 numparams: 0,
50 is_vararg: false,
51 maxstacksize: 2,
52 upvalues: Vec::new(),
53 k: Vec::new(),
54 code: Vec::new(),
55 p: Vec::new(),
56 lineinfo: Vec::new(),
57 abslineinfo: Vec::new(),
58 locvars: Vec::new(),
59 linedefined: 0,
60 lastlinedefined: 0,
61 source: None,
62 cache: RefCell::new(None),
63 vararg_table_reg: None,
64 vararg_table_needed: false,
65 }
66 }
67
68 pub fn buffer_bytes(&self) -> usize {
74 self.upvalues.capacity() * std::mem::size_of::<UpvalDesc>()
75 + self.k.capacity() * std::mem::size_of::<LuaValue>()
76 + self.code.capacity() * std::mem::size_of::<Instruction>()
77 + self.p.capacity() * std::mem::size_of::<GcRef<LuaProto>>()
78 + self.lineinfo.capacity() * std::mem::size_of::<i8>()
79 + self.abslineinfo.capacity() * std::mem::size_of::<AbsLineInfo>()
80 + self.locvars.capacity() * std::mem::size_of::<LocalVar>()
81 }
82}
83
84#[derive(Debug, Clone)]
85pub struct UpvalDesc {
86 pub name: Option<GcRef<LuaString>>,
87 pub instack: bool,
88 pub idx: u8,
89 pub kind: u8,
90}
91
92#[derive(Debug, Clone)]
93pub struct LocalVar {
94 pub varname: GcRef<LuaString>,
95 pub startpc: i32,
96 pub endpc: i32,
97}
98
99#[derive(Debug, Clone, Copy)]
100pub struct AbsLineInfo {
101 pub pc: i32,
102 pub line: i32,
103}