use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Op {
Nop,
LoadInt(i64),
LoadFloat(f64),
LoadConst(u16), LoadTrue,
LoadFalse,
LoadUndef,
Pop,
Dup,
Dup2,
Swap,
Rot,
GetVar(u16),
SetVar(u16),
DeclareVar(u16),
GetSlot(u16),
SetSlot(u16),
GetArray(u16),
SetArray(u16),
DeclareArray(u16),
ArrayGet(u16), ArraySet(u16), ArrayPush(u16), ArrayPop(u16), ArrayShift(u16), ArrayLen(u16), MakeArray(u16),
GetHash(u16),
SetHash(u16),
DeclareHash(u16),
HashGet(u16), HashSet(u16), HashDelete(u16), HashExists(u16), HashKeys(u16), HashValues(u16), MakeHash(u16),
Add,
Sub,
Mul,
Div,
Mod,
Pow,
Negate,
Inc,
Dec,
Concat,
StringRepeat,
StringLen,
NumEq,
NumNe,
NumLt,
NumGt,
NumLe,
NumGe,
Spaceship,
StrEq,
StrNe,
StrLt,
StrGt,
StrLe,
StrGe,
StrCmp,
LogNot,
LogAnd, LogOr,
BitAnd,
BitOr,
BitXor,
BitNot,
Shl,
Shr,
Jump(usize),
JumpIfTrue(usize),
JumpIfFalse(usize),
JumpIfTrueKeep(usize), JumpIfFalseKeep(usize),
Call(u16, u8),
Return,
ReturnValue,
PushFrame,
PopFrame,
Print(u8),
PrintLn(u8),
ReadLine,
Range,
RangeStep,
MapBlock(u16),
GrepBlock(u16),
SortBlock(u16),
SortDefault, ForEachBlock(u16),
PreIncSlot(u16),
SlotLtIntJumpIfFalse(u16, i32, usize),
SlotIncLtIntJumpBack(u16, i32, usize),
AccumSumLoop(u16, u16, i32),
ConcatConstLoop(u16, u16, u16, i32),
PushIntRangeLoop(u16, u16, i32),
AddAssignSlotVoid(u16, u16),
PreIncSlotVoid(u16),
CallBuiltin(u16, u8),
Extended(u16, u8),
ExtendedWide(u16, usize),
Exec(u8),
ExecBg(u8),
PipelineBegin(u8),
PipelineStage,
PipelineEnd,
Redirect(u8, u8),
HereDoc(u16),
HereString,
CmdSubst(u16), SubshellBegin,
SubshellEnd,
ProcessSubIn(u16),
ProcessSubOut(u16),
Glob,
GlobRecursive,
TestFile(u8),
SetStatus,
GetStatus,
TrapSet(u16),
TrapCheck,
ExpandParam(u8),
WordSplit,
BraceExpand,
TildeExpand,
}
pub mod file_test {
pub const IS_FILE: u8 = 0;
pub const IS_DIR: u8 = 1;
pub const IS_READABLE: u8 = 2;
pub const IS_WRITABLE: u8 = 3;
pub const IS_EXECUTABLE: u8 = 4;
pub const EXISTS: u8 = 5;
pub const IS_NONEMPTY: u8 = 6;
pub const IS_SYMLINK: u8 = 7;
pub const IS_SOCKET: u8 = 8;
pub const IS_FIFO: u8 = 9;
pub const IS_BLOCK_DEV: u8 = 10;
pub const IS_CHAR_DEV: u8 = 11;
}
pub mod redirect_op {
pub const WRITE: u8 = 0;
pub const APPEND: u8 = 1;
pub const READ: u8 = 2;
pub const READ_WRITE: u8 = 3;
pub const CLOBBER: u8 = 4;
pub const DUP_READ: u8 = 5;
pub const DUP_WRITE: u8 = 6;
pub const WRITE_BOTH: u8 = 7;
pub const APPEND_BOTH: u8 = 8;
}
pub mod param_mod {
pub const DEFAULT: u8 = 0; pub const ASSIGN: u8 = 1; pub const ERROR: u8 = 2; pub const ALTERNATE: u8 = 3; pub const LENGTH: u8 = 4; pub const STRIP_SHORT: u8 = 5; pub const STRIP_LONG: u8 = 6; pub const RSTRIP_SHORT: u8 = 7; pub const RSTRIP_LONG: u8 = 8; pub const SUBST_FIRST: u8 = 9; pub const SUBST_ALL: u8 = 10; pub const UPPER: u8 = 11; pub const LOWER: u8 = 12; pub const UPPER_FIRST: u8 = 13; pub const LOWER_FIRST: u8 = 14; pub const INDIRECT: u8 = 15; pub const KEYS: u8 = 16; pub const SLICE: u8 = 17; }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_op_size() {
assert!(
std::mem::size_of::<Op>() <= 24,
"Op too large: {} bytes",
std::mem::size_of::<Op>()
);
}
}