lua_code/opcode_names.rs
1//! Opcode name table for debug/disassembly output.
2//!
3//! Direct port of `src/lopnames.h` from Lua 5.4.7. Order must match the
4//! `OpCode` enum (`src/lopcodes.h`); `ORDER OP` invariant.
5//!
6//! The C source is preserved inline as `// C:` comments for diff-time
7//! review.
8
9// C: /* ORDER OP */
10// C: static const char *const opnames[] = {
11// C: "MOVE", "LOADI", "LOADF", "LOADK", "LOADKX", "LOADFALSE", "LFALSESKIP",
12// C: "LOADTRUE", "LOADNIL", "GETUPVAL", "SETUPVAL", "GETTABUP", "GETTABLE",
13// C: "GETI", "GETFIELD", "SETTABUP", "SETTABLE", "SETI", "SETFIELD",
14// C: "NEWTABLE", "SELF", "ADDI", "ADDK", "SUBK", "MULK", "MODK", "POWK",
15// C: "DIVK", "IDIVK", "BANDK", "BORK", "BXORK", "SHRI", "SHLI", "ADD",
16// C: "SUB", "MUL", "MOD", "POW", "DIV", "IDIV", "BAND", "BOR", "BXOR",
17// C: "SHL", "SHR", "MMBIN", "MMBINI", "MMBINK", "UNM", "BNOT", "NOT",
18// C: "LEN", "CONCAT", "CLOSE", "TBC", "JMP", "EQ", "LT", "LE", "EQK",
19// C: "EQI", "LTI", "LEI", "GTI", "GEI", "TEST", "TESTSET", "CALL",
20// C: "TAILCALL", "RETURN", "RETURN0", "RETURN1", "FORLOOP", "FORPREP",
21// C: "TFORPREP", "TFORCALL", "TFORLOOP", "SETLIST", "CLOSURE", "VARARG",
22// C: "VARARGPREP", "EXTRAARG", NULL
23// C: };
24//
25// PORT NOTE: dropped the trailing NULL sentinel. Length is `OP_COUNT` known
26// at compile time; Rust slice + bounds-check serves the role of the
27// sentinel.
28
29/// Total number of opcodes. Must equal `OpCode::Count as usize` once the
30/// enum lands; trailer-required hook checks this constant exists.
31pub const OP_COUNT: usize = 83;
32
33/// Opcode names, indexed by `OpCode as usize`. ORDER OP — must match the
34/// `OpCode` enum order in `lopcodes.h` exactly.
35pub const OPNAMES: [&str; OP_COUNT] = [
36 "MOVE", "LOADI", "LOADF", "LOADK", "LOADKX", "LOADFALSE", "LFALSESKIP",
37 "LOADTRUE", "LOADNIL", "GETUPVAL", "SETUPVAL", "GETTABUP", "GETTABLE",
38 "GETI", "GETFIELD", "SETTABUP", "SETTABLE", "SETI", "SETFIELD",
39 "NEWTABLE", "SELF", "ADDI", "ADDK", "SUBK", "MULK", "MODK", "POWK",
40 "DIVK", "IDIVK", "BANDK", "BORK", "BXORK", "SHRI", "SHLI", "ADD",
41 "SUB", "MUL", "MOD", "POW", "DIV", "IDIV", "BAND", "BOR", "BXOR",
42 "SHL", "SHR", "MMBIN", "MMBINI", "MMBINK", "UNM", "BNOT", "NOT",
43 "LEN", "CONCAT", "CLOSE", "TBC", "JMP", "EQ", "LT", "LE", "EQK",
44 "EQI", "LTI", "LEI", "GTI", "GEI", "TEST", "TESTSET", "CALL",
45 "TAILCALL", "RETURN", "RETURN0", "RETURN1", "FORLOOP", "FORPREP",
46 "TFORPREP", "TFORCALL", "TFORLOOP", "SETLIST", "CLOSURE", "VARARG",
47 "VARARGPREP", "EXTRAARG",
48];
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn op_count_matches_table() {
56 assert_eq!(OPNAMES.len(), OP_COUNT);
57 }
58
59 #[test]
60 fn first_and_last_opcodes() {
61 assert_eq!(OPNAMES[0], "MOVE");
62 assert_eq!(OPNAMES[OP_COUNT - 1], "EXTRAARG");
63 }
64}
65
66// ──────────────────────────────────────────────────────────────────────────
67// PORT STATUS
68// source: src/lopnames.h (103 lines, 1 static array)
69// target_crate: lua-code
70// confidence: high
71// todos: 0
72// port_notes: 1 (dropped NULL sentinel — Rust length is exact)
73// unsafe_blocks: 0
74// notes: opcode name table only; OpCode enum lands separately
75// ──────────────────────────────────────────────────────────────────────────