use crate::{BinaryOperator, UnaryOperator, Value};
use std::{collections::BTreeMap, hash::Hash};
#[derive(Debug, Clone, PartialEq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bitcode", derive(bitcode::Encode, bitcode::Decode))]
#[non_exhaustive]
pub enum Instruction {
AllocVariables(u16),
LoadConstant(Value),
LoadVariable(u16),
StoreVariable(u16),
UnaryOperator(UnaryOperator),
BinaryOperator(BinaryOperator),
Jump(u32),
#[cfg(feature = "bool_type")]
JumpIfFalse(u32),
CallByName(ReceiverLocation, String, u16),
CallByAddress(u32, u16),
Return,
Pop,
}
#[derive(Debug, Clone, PartialEq, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bitcode", derive(bitcode::Encode, bitcode::Decode))]
#[non_exhaustive]
pub enum ReceiverLocation {
Variable(u16),
Temporary,
None,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bitcode", derive(bitcode::Encode, bitcode::Decode))]
#[allow(unused)]
#[non_exhaustive]
pub struct ProgramBytecode {
pub public_functions: BTreeMap<String, PublicFunction>,
pub instructions: Vec<Instruction>,
}
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bitcode", derive(bitcode::Encode, bitcode::Decode))]
#[allow(unused)]
#[non_exhaustive]
pub struct PublicFunction {
pub address: u32,
pub arguments: u16,
}