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    Pointer,
55    Begin,
56    End,
57    CallFunction {
58        kind: FunctionKind,
59        arg_count: u32,
60    },
61    CallMethod {
62        kind: MethodKind,
63        arg_count: u32,
64    },
65    Interval {
66        left_bracket: Bracket,
67        right_bracket: Bracket,
68    },
69}
70
71#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
72pub enum Jump {
73    Forward,
74    Backward,
75    IfTrue,
76    IfFalse,
77    IfNotNull,
78    IfEnd,
79}
80
81#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
82pub enum Compare {
83    More,
84    Less,
85    MoreOrEqual,
86    LessOrEqual,
87}