use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Instruction {
Push(Constant),
Pop,
Dup,
LoadLocal(usize),
StoreLocal(usize),
LoadGlobal(String),
StoreGlobal(String),
DeclareLocal(String),
Add,
Sub,
Mul,
Div,
Rem,
Pow,
Neg,
BitNot,
BitAnd,
BitOr,
BitXor,
Shl,
Shr,
Ushr,
Eq,
Neq,
StrictEq,
StrictNeq,
Lt,
Lte,
Gt,
Gte,
Not,
CreateArray(usize),
CreateObject(usize),
GetProperty(String),
SetProperty(String),
GetIndex,
SetIndex,
Spread,
In,
InstanceOf,
CreateClosure(usize),
Call(usize),
Return,
CallExternal(String, usize),
Jump(usize),
JumpIfFalse(usize),
JumpIfTrue(usize),
JumpIfNullish(usize),
SetupLoop,
Break,
Continue,
GetIterator,
IteratorNext,
IteratorDone,
SetupTry(usize, Option<usize>),
Throw,
EndTry,
TypeOf,
Void,
Increment,
Decrement,
ConcatStrings(usize),
DestructureObject(Vec<String>),
DestructureArray(usize),
CreateClass {
name: String,
n_methods: usize,
n_statics: usize,
has_super: bool,
},
Construct(usize),
LoadThis,
StoreThis,
CallSuper(usize),
CreateGenerator(usize),
Yield,
Await,
Nop,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Constant {
Undefined,
Null,
Bool(bool),
Int(i64),
Float(f64),
String(String),
}