lua_bytecode/
lib.rs

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(Default)]
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(Default)]
47pub struct Bytecode {
48    pub header: Header,
49    pub protos: Vec<Proto>,
50    pub main_proto_id: u32,
51}
52
53pub struct LocalVariable {
54    name: RawLuaString,
55    start_pc: u32,
56    end_pc: u32,
57
58    #[cfg(feature = "luau")]
59    register: u8,
60}
61
62#[derive(Default)]
63pub struct Proto {
64    #[cfg(feature = "luau")]
65    pub bytecode_id: u32,
66
67    pub max_stack_size: u8,
68    pub parameter_count: u8,
69    pub upvalue_count: u8,
70    pub is_vararg: bool,
71
72    pub flags: u8,
73    pub type_info: Vec<u8>,
74
75    pub line_defined: u32,
76    pub last_line_defined: u32,
77
78    pub name: Option<RawLuaString>,
79    pub line_info: Vec<u32>,
80    pub absolute_line_info: Vec<i32>,
81    pub linegaplog2: u8,
82
83    pub protos: Vec<u32>,
84    pub locals: Vec<LocalVariable>,
85    pub upvalues: Vec<RawLuaString>,
86    pub constants: Vec<Constant>,
87    pub instructions: Vec<opcode::Instruction>,
88}