1#![allow(dead_code)]
2
3use constant::Constant;
4
5mod buffer;
6pub mod constant;
7pub mod opcode;
8
9#[cfg(feature = "lua51")]
10pub mod lua51;
11#[cfg(feature = "luau")]
12pub mod luau;
13
14#[cfg(feature = "lua51")]
15pub const LUA_MAGIC: u32 = 0x61754c1b;
16
17enum Format {
18 Lua51,
19 Lua52,
20 Lua53,
21 Lua54,
22 LuaJit,
23 Luau,
24}
25
26type RawLuaString = Vec<u8>;
27
28#[cfg(feature = "lua51")]
29#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
30pub struct Header {
31 pub version: u8,
32 pub format: u8,
33
34 pub is_big_endian: bool,
35
36 pub int_size: u8,
37 pub size_t_size: u8,
38 pub instruction_size: u8,
39 pub number_size: u8,
40
41 pub is_number_integral: bool,
42 pub luajit_flags: u8,
43}
44
45#[cfg(feature = "lua51")]
46#[derive(Clone, Debug, Default)]
47pub struct Bytecode {
48 pub header: Header,
49 pub protos: Vec<Proto>,
50 pub main_proto_id: u32,
51}
52
53#[derive(Clone, Debug, Default, PartialEq, Eq)]
54pub struct LocalVariable {
55 name: RawLuaString,
56 start_pc: u32,
57 end_pc: u32,
58
59 #[cfg(feature = "luau")]
60 register: u8,
61}
62
63#[derive(Clone, Debug, Default)]
64pub struct Proto {
65 #[cfg(feature = "luau")]
66 pub bytecode_id: u32,
67
68 pub max_stack_size: u8,
69 pub parameter_count: u8,
70 pub upvalue_count: u8,
71 pub is_vararg: bool,
72
73 pub flags: u8,
74 pub type_info: Vec<u8>,
75
76 pub line_defined: u32,
77 pub last_line_defined: u32,
78
79 pub name: Option<RawLuaString>,
80 pub line_info: Vec<u32>,
81 pub absolute_line_info: Vec<i32>,
82 pub linegaplog2: u8,
83
84 pub protos: Vec<u32>,
85 pub locals: Vec<LocalVariable>,
86 pub upvalues: Vec<RawLuaString>,
87 pub constants: Vec<Constant>,
88 pub instructions: Vec<opcode::Instruction>,
89}