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(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}