1#[derive(Debug, Clone)]
4pub struct Bytecode {
5 pub op: OpCode,
6 pub operand: Operand,
7}
8
9impl Bytecode {
10 pub fn new(op: OpCode, operand: Operand) -> Self {
11 Bytecode { op, operand }
12 }
13
14 pub fn to_bytes_vec(&self) -> Vec<u8> {
15 let mut bytes = vec![self.op as u8];
16 match self.operand {
17 Operand::Z => {}
18 Operand::B(b) => bytes.push(b),
19 Operand::BB(b1, b2) => {
20 bytes.push(b1);
21 bytes.push(b2);
22 }
23 Operand::BBB(b1, b2, b3) => {
24 bytes.push(b1);
25 bytes.push(b2);
26 bytes.push(b3);
27 }
28 Operand::BS(b1, s) => {
29 bytes.push(b1);
30 bytes.extend_from_slice(&s.to_be_bytes());
31 }
32 Operand::BSS(b1, s1, s2) => {
33 bytes.push(b1);
34 bytes.extend_from_slice(&s1.to_be_bytes());
35 bytes.extend_from_slice(&s2.to_be_bytes());
36 }
37 Operand::S(s) => {
38 bytes.extend_from_slice(&s.to_be_bytes());
39 }
40 Operand::W(w) => {
41 let operand: [u8; 4] = w.to_be_bytes();
43 bytes.extend_from_slice(&operand[1..=3]);
44 }
45 }
46 bytes
47 }
48}
49
50#[allow(non_camel_case_types)]
51#[repr(u8)]
52#[derive(Debug, Copy, Clone, PartialEq, Eq)]
53pub enum OpCode {
54 NOP,
55 MOVE,
56 LOADL,
57 LOADI,
58 LOADINEG,
59 LOADI__1,
60 LOADI_0,
61 LOADI_1,
62 LOADI_2,
63 LOADI_3,
64 LOADI_4,
65 LOADI_5,
66 LOADI_6,
67 LOADI_7,
68 LOADI16,
69 LOADI32,
70 LOADSYM,
71 LOADNIL,
72 LOADSELF,
73 LOADT,
74 LOADF,
75 GETGV,
76 SETGV,
77 GETSV,
78 SETSV,
79 GETIV,
80 SETIV,
81 GETCV,
82 SETCV,
83 GETCONST,
84 SETCONST,
85 GETMCNST,
86 SETMCNST,
87 GETUPVAR,
88 SETUPVAR,
89 GETIDX,
90 SETIDX,
91 JMP,
92 JMPIF,
93 JMPNOT,
94 JMPNIL,
95 JMPUW,
96 EXCEPT,
97 RESCUE,
98 RAISEIF,
99 SSEND,
100 SSENDB,
101 SEND,
102 SENDB,
103 CALL,
104 SUPER,
105 ARGARY,
106 ENTER,
107 KEY_P,
108 KEYEND,
109 KARG,
110 RETURN,
111 RETURN_BLK,
112 BREAK,
113 BLKPUSH,
114 ADD,
115 ADDI,
116 SUB,
117 SUBI,
118 MUL,
119 DIV,
120 EQ,
121 LT,
122 LE,
123 GT,
124 GE,
125 ARRAY,
126 ARRAY2,
127 ARYCAT,
128 ARYPUSH,
129 ARYSPLAT,
130 AREF,
131 ASET,
132 APOST,
133 INTERN,
134 SYMBOL,
135 STRING,
136 STRCAT,
137 HASH,
138 HASHADD,
139 HASHCAT,
140 LAMBDA,
141 BLOCK,
142 METHOD,
143 RANGE_INC,
144 RANGE_EXC,
145 OCLASS,
146 CLASS,
147 MODULE,
148 EXEC,
149 DEF,
150 ALIAS,
151 UNDEF,
152 SCLASS,
153 TCLASS,
154 DEBUG,
155 ERR,
156 EXT1,
157 EXT2,
158 EXT3,
159 STOP,
160
161 NumberOfOpcode, }
163
164#[derive(Debug, Copy, Clone)]
165pub enum Operand {
166 Z,
167 B(u8),
168 BB(u8, u8),
169 BBB(u8, u8, u8),
170 BS(u8, u16),
171 BSS(u8, u16, u16),
172 S(u16),
173 W(u32), }