mf_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 { with_return: bool },
47    Len,
48    IncrementIt,
49    IncrementCount,
50    GetCount,
51    GetLen,
52    Pointer,
53    Begin,
54    End,
55    CallFunction { kind: FunctionKind, arg_count: u32 },
56    CallMethod { kind: MethodKind, arg_count: u32 },
57    Interval { left_bracket: Bracket, right_bracket: Bracket },
58}
59
60#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
61pub enum Jump {
62    Forward,
63    Backward,
64    IfTrue,
65    IfFalse,
66    IfNotNull,
67    IfEnd,
68}
69
70#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
71pub enum Compare {
72    More,
73    Less,
74    MoreOrEqual,
75    LessOrEqual,
76}