2020-09-17 13:09:37 -07:00
|
|
|
use crate::{obj::prelude::*, vm::consts::*};
|
2020-09-24 15:29:44 -07:00
|
|
|
use shredder::EmptyScan;
|
2020-09-01 17:32:48 -07:00
|
|
|
|
2020-09-14 16:32:00 -07:00
|
|
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
2020-09-01 17:32:48 -07:00
|
|
|
pub enum Inst {
|
|
|
|
|
/// Push a literal symbol object to the stack.
|
|
|
|
|
PushSym(Sym),
|
|
|
|
|
|
2020-09-14 14:09:29 -07:00
|
|
|
/// Push a const value reference to the stack.
|
|
|
|
|
PushConst(ConstHandle),
|
|
|
|
|
|
|
|
|
|
/// Looks up and pushes a local value.
|
2020-09-27 19:33:18 -07:00
|
|
|
LoadLocal(Name),
|
|
|
|
|
|
|
|
|
|
/// Looks up and pushes a global value.
|
|
|
|
|
LoadGlobal(Name),
|
2020-09-14 14:09:29 -07:00
|
|
|
|
2020-09-01 17:32:48 -07:00
|
|
|
/// Pop a value from the stack, possibly into a local symbol.
|
2020-09-27 19:33:18 -07:00
|
|
|
PopLocal(Option<Name>),
|
|
|
|
|
|
|
|
|
|
/// Pop a value from the stack, possibly into a global symbol.
|
|
|
|
|
PopGlobal(Option<Name>),
|
2020-09-01 17:32:48 -07:00
|
|
|
|
|
|
|
|
/// Pops a symbol value and an object reference.
|
|
|
|
|
///
|
|
|
|
|
/// This will get an attr from the object reference pointed to by the symbol.
|
2020-09-14 14:09:29 -07:00
|
|
|
GetAttr(Sym),
|
2020-09-01 17:32:48 -07:00
|
|
|
|
2020-09-24 15:29:44 -07:00
|
|
|
/// Pops a target reference and a source reference from the stack.
|
2020-09-01 17:32:48 -07:00
|
|
|
///
|
2020-09-14 14:09:29 -07:00
|
|
|
/// The target reference will have the given symbol attribute assigned to the source.
|
2020-09-01 17:32:48 -07:00
|
|
|
///
|
2020-09-14 14:09:29 -07:00
|
|
|
/// In code, it would look like this:
|
|
|
|
|
///
|
2020-09-16 17:18:31 -07:00
|
|
|
/// `target.symbol = source`
|
2020-09-14 14:09:29 -07:00
|
|
|
///
|
|
|
|
|
SetAttr(Sym),
|
2020-09-01 17:32:48 -07:00
|
|
|
|
|
|
|
|
/// Jump to a given address in the current function unconditionally.
|
|
|
|
|
Jump(usize),
|
|
|
|
|
|
|
|
|
|
/// Jump to a given address in the current function if the condition flag is true.
|
|
|
|
|
///
|
|
|
|
|
/// The condition flag may be set by an internal function.
|
|
|
|
|
JumpTrue(usize),
|
|
|
|
|
|
2020-09-14 14:09:29 -07:00
|
|
|
/// Calls a function with the supplied number of arguments.
|
|
|
|
|
///
|
|
|
|
|
/// The stack, from bottom to top, should contain the function followed by the arguments.
|
|
|
|
|
///
|
|
|
|
|
/// After the function has returned, the VM will have popped the arguments and function
|
|
|
|
|
/// pointer, and the return value will be on top of the stack.
|
2020-09-01 17:32:48 -07:00
|
|
|
Call(usize),
|
|
|
|
|
|
2020-09-14 14:09:29 -07:00
|
|
|
/// Indexes a value, e.g. a list or a dict.
|
|
|
|
|
///
|
|
|
|
|
/// The stack, from bottom to top, should have the expression being indexed, and then the
|
|
|
|
|
/// indexed value.
|
|
|
|
|
Index,
|
|
|
|
|
|
2020-09-01 17:32:48 -07:00
|
|
|
/// Pops the top value from the stack, and returns from the function, using the popped value as
|
|
|
|
|
/// a return value.
|
|
|
|
|
Return,
|
2020-09-14 14:09:29 -07:00
|
|
|
|
|
|
|
|
/// Replaces the top stack value with its negation applied.
|
|
|
|
|
UnNeg,
|
|
|
|
|
|
|
|
|
|
/// Replaces the top stack value with its absolute value applied.
|
|
|
|
|
UnPos,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary addition operator to them,
|
|
|
|
|
/// pushing the result to the stack.
|
|
|
|
|
BinPlus,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary subtraction operator to
|
|
|
|
|
/// them, pushing the result to the stack.
|
|
|
|
|
BinMinus,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary multiplication operator to
|
|
|
|
|
/// them, pushing the result to the stack.
|
|
|
|
|
BinMul,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary division operator to them,
|
|
|
|
|
/// pushing the result to the stack.
|
|
|
|
|
BinDiv,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean equality operator to them,
|
|
|
|
|
/// pushing the result to the stack.
|
|
|
|
|
BinEq,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean inequality operator to
|
|
|
|
|
/// them, pushing the result to the stack.
|
|
|
|
|
BinNeq,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean less-than operator to
|
|
|
|
|
/// them, pushing the result to the stack.
|
|
|
|
|
BinLt,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary less-than or equals
|
|
|
|
|
/// operator to them, pushing the result to the stack.
|
|
|
|
|
BinLe,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean greater-than operator to
|
|
|
|
|
/// them, pushing the result to the stack.
|
|
|
|
|
BinGt,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the binary greater-than or equals
|
|
|
|
|
/// operator to them, pushing the result to the stack.
|
|
|
|
|
BinGe,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean and operator to them,
|
|
|
|
|
/// pushing the result to the stack.
|
|
|
|
|
BinAnd,
|
|
|
|
|
|
|
|
|
|
/// Pops the top two items off of the stack, and applies the boolean or operator to them,
|
|
|
|
|
/// pushing the result to the stack.
|
|
|
|
|
BinOr,
|
2020-09-01 17:32:48 -07:00
|
|
|
}
|
2020-09-17 13:09:37 -07:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// impl Inst
|
|
|
|
|
//
|
|
|
|
|
impl Inst {
|
|
|
|
|
pub fn name(&self) -> &'static str {
|
|
|
|
|
match self {
|
|
|
|
|
Inst::PushSym(_) => "PUSH_SYM",
|
|
|
|
|
Inst::PushConst(_) => "PUSH_CONST",
|
2020-09-27 19:33:18 -07:00
|
|
|
Inst::LoadLocal(_) => "LOAD_LOCAL",
|
|
|
|
|
Inst::LoadGlobal(_) => "LOAD_GLOBAL",
|
|
|
|
|
Inst::PopLocal(_) => "POP_LOCAL",
|
|
|
|
|
Inst::PopGlobal(_) => "POP_GLOBAL",
|
2020-09-17 13:09:37 -07:00
|
|
|
Inst::GetAttr(_) => "GET_ATTR",
|
|
|
|
|
Inst::SetAttr(_) => "SET_ATTR",
|
|
|
|
|
Inst::Jump(_) => "JUMP",
|
|
|
|
|
Inst::JumpTrue(_) => "JUMP_TRUE",
|
|
|
|
|
Inst::Call(_) => "CALL",
|
|
|
|
|
Inst::Index => "INDEX",
|
|
|
|
|
Inst::Return => "RETURN",
|
|
|
|
|
Inst::UnNeg => "UN_NEG",
|
|
|
|
|
Inst::UnPos => "UN_POS",
|
|
|
|
|
Inst::BinPlus => "BIN_PLUS",
|
|
|
|
|
Inst::BinMinus => "BIN_MINUS",
|
|
|
|
|
Inst::BinMul => "BIN_MUL",
|
|
|
|
|
Inst::BinDiv => "BIN_DIV",
|
|
|
|
|
Inst::BinEq => "BIN_EQ",
|
|
|
|
|
Inst::BinNeq => "BIN_NEQ",
|
|
|
|
|
Inst::BinLt => "BIN_LT",
|
|
|
|
|
Inst::BinLe => "BIN_LE",
|
|
|
|
|
Inst::BinGt => "BIN_GT",
|
|
|
|
|
Inst::BinGe => "BIN_GE",
|
|
|
|
|
Inst::BinAnd => "BIN_AND",
|
|
|
|
|
Inst::BinOr => "BIN_OR",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-24 15:29:44 -07:00
|
|
|
|
2020-10-20 16:21:50 -07:00
|
|
|
impl EmptyScan for Inst {}
|