zen_expression/compiler/
opcode.rs

1use crate::functions::{FunctionKind, MethodKind};
2use crate::lexer::Bracket;
3use rust_decimal::Decimal;
4use std::sync::Arc;
5use strum_macros::Display;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum FetchFastTarget {
9    Root,
10    Begin,
11    String(Arc<str>),
12    Number(u32),
13}
14
15/// Machine code interpreted by VM
16#[derive(Debug, PartialEq, Eq, Clone, Display)]
17pub enum Opcode {
18    PushNull,
19    PushBool(bool),
20    PushString(Arc<str>),
21    PushNumber(Decimal),
22    Pop,
23    Flatten,
24    Join,
25    Fetch,
26    FetchRootEnv,
27    FetchEnv(Arc<str>),
28    FetchFast(Vec<FetchFastTarget>),
29    Negate,
30    Not,
31    Equal,
32    Jump(Jump, u32),
33    In,
34    Compare(Compare),
35    Add,
36    Subtract,
37    Multiply,
38    Divide,
39    Modulo,
40    Exponent,
41    Slice,
42    Array,
43    Object,
44    AssignedObjectBegin,
45    AssignedObjectStep,
46    AssignedObjectEnd {
47        with_return: bool,
48    },
49    Len,
50    IncrementIt,
51    IncrementCount,
52    GetCount,
53    GetLen,
54    /// The u32 is the depth from innermost scope (0 = innermost, 1 = parent, etc.)
55    Pointer(u32),
56    Begin,
57    End,
58    CallFunction {
59        kind: FunctionKind,
60        arg_count: u32,
61    },
62    CallMethod {
63        kind: MethodKind,
64        arg_count: u32,
65    },
66    Interval {
67        left_bracket: Bracket,
68        right_bracket: Bracket,
69    },
70}
71
72#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
73pub enum Jump {
74    Forward,
75    Backward,
76    IfTrue,
77    IfFalse,
78    IfNotNull,
79    IfEnd,
80}
81
82#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
83pub enum Compare {
84    More,
85    Less,
86    MoreOrEqual,
87    LessOrEqual,
88}