dlang 0.1.3

Programing language from scratch
Documentation
use super::instruction::{CLOSURE, CONST, JUMP, NO_ARG};

/// Raw opcode
#[derive(Debug)]
pub enum OpCode {
    PUSH,
    POP,
    CONST,
    /// Define global
    DEFGLB,
    /// Get global
    GETGLB,
    /// Define local
    DEFLCL,
    /// Get local
    GETLCL,
    GETFREE,
    ADD,
    SUB,
    PRODUCT,
    DIVIDE,
    MOD,
    BANG,
    NEG,
    CGT,
    CGTE,
    CLT,
    CLTE,
    CEQ,
    CNEQ,
    /// Logical AND
    AND,
    /// Logical OR
    OR,
    /// Bit AND
    BAND,
    /// Bit OR
    BOR,
    JMP,
    /// jump if state
    JIS,
    /// jump if not state
    JNS,
    JEQ,
    JNEQ,
    ARRAY,
    INDEX,
    CALL,
    /// Return
    RETN,
    /// Return with value
    RETV,
    /// Create a closure
    CLOSURE,
    /// Get current function
    GETCUR,
}

impl OpCode {
    pub fn arg_len(&self) -> &'static [usize] {
        match self {
            OpCode::PUSH
            | OpCode::POP
            | OpCode::ADD
            | OpCode::SUB
            | OpCode::PRODUCT
            | OpCode::DIVIDE
            | OpCode::MOD
            | OpCode::BANG
            | OpCode::NEG
            | OpCode::CGT
            | OpCode::CGTE
            | OpCode::CLT
            | OpCode::CLTE
            | OpCode::CEQ
            | OpCode::CNEQ
            | OpCode::AND
            | OpCode::OR
            | OpCode::BAND
            | OpCode::BOR
            | OpCode::RETN
            | OpCode::RETV
            | OpCode::GETCUR => NO_ARG.arg_size,

            OpCode::CONST
            | OpCode::DEFGLB
            | OpCode::GETGLB
            | OpCode::DEFLCL
            | OpCode::GETLCL
            | OpCode::GETFREE
            | OpCode::CALL
            | OpCode::ARRAY
            | OpCode::INDEX => CONST.arg_size,

            OpCode::JMP
            | OpCode::JIS
            | OpCode::JNS
            | OpCode::JEQ
            | OpCode::JNEQ => JUMP.arg_size,

            OpCode::CLOSURE => CLOSURE.arg_size,
        }
    }
    pub fn length(&self) -> usize {
        match self {
            OpCode::PUSH
            | OpCode::POP
            | OpCode::ADD
            | OpCode::SUB
            | OpCode::PRODUCT
            | OpCode::DIVIDE
            | OpCode::MOD
            | OpCode::BANG
            | OpCode::NEG
            | OpCode::CGT
            | OpCode::CGTE
            | OpCode::CLT
            | OpCode::CLTE
            | OpCode::CEQ
            | OpCode::CNEQ
            | OpCode::AND
            | OpCode::OR
            | OpCode::BAND
            | OpCode::BOR
            | OpCode::RETN
            | OpCode::RETV
            | OpCode::GETCUR => NO_ARG.length,

            OpCode::CONST
            | OpCode::DEFGLB
            | OpCode::GETGLB
            | OpCode::DEFLCL
            | OpCode::GETLCL
            | OpCode::GETFREE
            | OpCode::CALL
            | OpCode::ARRAY
            | OpCode::INDEX => CONST.length,

            OpCode::JMP
            | OpCode::JIS
            | OpCode::JNS
            | OpCode::JEQ
            | OpCode::JNEQ => JUMP.length,

            OpCode::CLOSURE => CLOSURE.length,
        }
    }
}