Skip to main content

espy_heart/
lib.rs

1//! espy bytecode constants.
2//!
3//! Shared between the compiler and interpreter.
4
5pub mod prelude {
6    pub use super::*;
7}
8
9pub type ProgramCounter = u32;
10pub type StackPointer = i32;
11pub type BlockId = u32;
12pub type StringId = u32;
13
14pub mod instruction {
15    pub const CLONE: u8 = 0;
16    pub const POP: u8 = 1;
17    pub const COLLAPSE: u8 = 2;
18    pub const JUMP: u8 = 3;
19    pub const IF: u8 = 4;
20    pub const PUSH_UNIT: u8 = 5;
21    pub const PUSH_TRUE: u8 = 6;
22    pub const PUSH_FALSE: u8 = 7;
23    pub const PUSH_I64: u8 = 8;
24    pub const PUSH_STRING: u8 = 9;
25    pub const PUSH_FUNCTION: u8 = 10;
26    pub const PUSH_ENUM: u8 = 11;
27    pub const ADD: u8 = 12;
28    pub const SUB: u8 = 13;
29    pub const MUL: u8 = 14;
30    pub const DIV: u8 = 15;
31    pub const PIPE: u8 = 16;
32    pub const BITWISE_AND: u8 = 17;
33    pub const BITWISE_OR: u8 = 18;
34    pub const BITWISE_XOR: u8 = 19;
35    pub const EQUAL_TO: u8 = 20;
36    pub const NOT_EQUAL_TO: u8 = 21;
37    pub const GREATER: u8 = 22;
38    pub const GREATER_EQUAL: u8 = 23;
39    pub const LESSER: u8 = 24;
40    pub const LESSER_EQUAL: u8 = 25;
41    pub const LOGICAL_AND: u8 = 26;
42    pub const LOGICAL_OR: u8 = 27;
43    pub const CALL: u8 = 28;
44    pub const JOIN: u8 = 29;
45    pub const INDEX: u8 = 30;
46    pub const NAME: u8 = 31;
47    pub const LIST: u8 = 32;
48    pub const NEGATIVE: u8 = 33;
49    pub const DEREF: u8 = 34;
50    pub const SET: u8 = 35;
51    pub const MATCHES: u8 = 36;
52    pub const BIND: u8 = 37;
53    pub const YIELD: u8 = 38;
54    pub const TRY_INDEX: u8 = 39;
55}
56
57pub mod builtins {
58    use crate::StackPointer;
59
60    pub const ANY: StackPointer = -1;
61    pub const UNIT: StackPointer = -2;
62    pub const I64: StackPointer = -3;
63    pub const STRING: StackPointer = -4;
64    pub const OPTION: StackPointer = -5;
65    pub const MUT: StackPointer = -6;
66
67    #[must_use]
68    pub fn from_str(s: &str) -> Option<StackPointer> {
69        match s {
70            "Any" => Some(ANY),
71            "Unit" => Some(UNIT),
72            "I64" => Some(I64),
73            "String" => Some(STRING),
74            "Option" => Some(OPTION),
75            "mut" => Some(MUT),
76            _ => None,
77        }
78    }
79}
80
81pub mod debug {
82    pub const SPAN: u8 = 0;
83    pub const DITTO: u8 = 1;
84}