Skip to main content

lunar_lang/rite/
bytecode.rs

1// FIXME: use mrubyedge?
2
3#[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                // should be truncated into u24...
42                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, // for fetcher table
162}
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), // u24 in real layout
174}