1#[repr(u8)]
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum Op {
8 Const, Nil, True, False, Pop, Dup, LoadLocal, StoreLocal, LoadUpvalue, StoreUpvalue, LoadGlobal, StoreGlobal, DefineGlobal, Jump, JumpIfFalse, JumpIfTrue, Call, TailCall, Return, MakeClosure, CallNative, MakeList, MakeVector, MakeMap, MakeHashMap, Throw, Add,
56 Sub,
57 Mul,
58 Div,
59 Negate,
60 Not,
61 Eq,
62 Lt,
63 Gt,
64 Le,
65 Ge,
66
67 AddInt,
69 SubInt,
70 MulInt,
71 LtInt,
72 EqInt,
73
74 LoadLocal0, LoadLocal1, LoadLocal2, LoadLocal3, StoreLocal0, StoreLocal1, StoreLocal2, StoreLocal3, CallGlobal, }
87
88impl Op {
89 pub fn from_u8(byte: u8) -> Option<Op> {
93 if byte <= Op::CallGlobal as u8 {
94 Some(unsafe { std::mem::transmute::<u8, Op>(byte) })
96 } else {
97 None
98 }
99 }
100}
101
102pub mod op {
104 use super::Op;
105 pub const CONST: u8 = Op::Const as u8;
106 pub const NIL: u8 = Op::Nil as u8;
107 pub const TRUE: u8 = Op::True as u8;
108 pub const FALSE: u8 = Op::False as u8;
109 pub const POP: u8 = Op::Pop as u8;
110 pub const DUP: u8 = Op::Dup as u8;
111 pub const LOAD_LOCAL: u8 = Op::LoadLocal as u8;
112 pub const STORE_LOCAL: u8 = Op::StoreLocal as u8;
113 pub const LOAD_UPVALUE: u8 = Op::LoadUpvalue as u8;
114 pub const STORE_UPVALUE: u8 = Op::StoreUpvalue as u8;
115 pub const LOAD_GLOBAL: u8 = Op::LoadGlobal as u8;
116 pub const STORE_GLOBAL: u8 = Op::StoreGlobal as u8;
117 pub const DEFINE_GLOBAL: u8 = Op::DefineGlobal as u8;
118 pub const JUMP: u8 = Op::Jump as u8;
119 pub const JUMP_IF_FALSE: u8 = Op::JumpIfFalse as u8;
120 pub const JUMP_IF_TRUE: u8 = Op::JumpIfTrue as u8;
121 pub const CALL: u8 = Op::Call as u8;
122 pub const TAIL_CALL: u8 = Op::TailCall as u8;
123 pub const RETURN: u8 = Op::Return as u8;
124 pub const MAKE_CLOSURE: u8 = Op::MakeClosure as u8;
125 pub const CALL_NATIVE: u8 = Op::CallNative as u8;
126 pub const MAKE_LIST: u8 = Op::MakeList as u8;
127 pub const MAKE_VECTOR: u8 = Op::MakeVector as u8;
128 pub const MAKE_MAP: u8 = Op::MakeMap as u8;
129 pub const MAKE_HASH_MAP: u8 = Op::MakeHashMap as u8;
130 pub const THROW: u8 = Op::Throw as u8;
131 pub const ADD: u8 = Op::Add as u8;
132 pub const SUB: u8 = Op::Sub as u8;
133 pub const MUL: u8 = Op::Mul as u8;
134 pub const DIV: u8 = Op::Div as u8;
135 pub const NEGATE: u8 = Op::Negate as u8;
136 pub const NOT: u8 = Op::Not as u8;
137 pub const EQ: u8 = Op::Eq as u8;
138 pub const LT: u8 = Op::Lt as u8;
139 pub const GT: u8 = Op::Gt as u8;
140 pub const LE: u8 = Op::Le as u8;
141 pub const GE: u8 = Op::Ge as u8;
142 pub const ADD_INT: u8 = Op::AddInt as u8;
143 pub const SUB_INT: u8 = Op::SubInt as u8;
144 pub const MUL_INT: u8 = Op::MulInt as u8;
145 pub const LT_INT: u8 = Op::LtInt as u8;
146 pub const EQ_INT: u8 = Op::EqInt as u8;
147 pub const LOAD_LOCAL0: u8 = Op::LoadLocal0 as u8;
148 pub const LOAD_LOCAL1: u8 = Op::LoadLocal1 as u8;
149 pub const LOAD_LOCAL2: u8 = Op::LoadLocal2 as u8;
150 pub const LOAD_LOCAL3: u8 = Op::LoadLocal3 as u8;
151 pub const STORE_LOCAL0: u8 = Op::StoreLocal0 as u8;
152 pub const STORE_LOCAL1: u8 = Op::StoreLocal1 as u8;
153 pub const STORE_LOCAL2: u8 = Op::StoreLocal2 as u8;
154 pub const STORE_LOCAL3: u8 = Op::StoreLocal3 as u8;
155 pub const CALL_GLOBAL: u8 = Op::CallGlobal as u8;
156
157 pub const SIZE_OP: usize = 1;
160 pub const SIZE_OP_U16: usize = 3;
162 pub const SIZE_OP_U32: usize = 5;
164 pub const SIZE_CALL_GLOBAL: usize = 7;
166}