diff options
Diffstat (limited to 'crates/sloth_bytecode')
| -rw-r--r-- | crates/sloth_bytecode/Cargo.toml | 4 | ||||
| -rw-r--r-- | crates/sloth_bytecode/src/lib.rs | 63 |
2 files changed, 67 insertions, 0 deletions
diff --git a/crates/sloth_bytecode/Cargo.toml b/crates/sloth_bytecode/Cargo.toml new file mode 100644 index 0000000..a302c81 --- /dev/null +++ b/crates/sloth_bytecode/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "sloth_bytecode" +version = "0.1.0" +edition = "2021" diff --git a/crates/sloth_bytecode/src/lib.rs b/crates/sloth_bytecode/src/lib.rs new file mode 100644 index 0000000..f814f86 --- /dev/null +++ b/crates/sloth_bytecode/src/lib.rs @@ -0,0 +1,63 @@ +#![feature(macro_metavar_expr)] +#![allow(dead_code)] +#![warn( + clippy::wildcard_imports, + clippy::string_add, + clippy::string_add_assign, + clippy::manual_ok_or, + unused_lifetimes +)] + +macro_rules! instructions { + ( $( $opcode:literal $name:ident [ $( $v_type:ident ),* ] $doc:literal ),* ) => { + #[repr(u8)] + enum Instruction { + $( + #[doc = $doc] + $name ( $( $v_type ),* ) = $opcode + ),* + } + + impl Instruction { + fn opcode(&self) -> u8 { + match self { + $( + Self::$name ( $( _ ${ignore(v_type)} ),* ) => $opcode + ),* + } + } + + fn from_bytecode(bytecode: &[u8]) -> Option<Self> { + if bytecode.is_empty() { + return None; + } + + let opcode = bytecode[0]; + let instruction = match opcode { + $( + $opcode => { + // TODO: Get the actual values + Some(Self::$name ( $( 0 ${ignore(v_type)} ),* )) + } + ),*, + _ => None, + }; + + instruction + } + } + } +} + +instructions! { + 0x00 Constant [u64] "Push a constant value onto the stack", + + 0x01 Pop [] "Pop a value from the stack", + 0x02 Dup [] "Duplicate a value on the stack", + + 0x10 Add [] "Add the last 2 values on the stack", + 0x11 Sub [] "Subtract the last 2 values on the stack", + 0x12 Mul [] "Multiply the last 2 values on the stack", + 0x13 Div [] "Divide the last 2 values on the stack", + 0x14 Mod [] "Modulo the last 2 values on the stack" +} |
