From ee079d193b6644e65543c3fa02dbfcf7b4f2f9c6 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 11 Apr 2023 17:34:11 -0500 Subject: Hehehe --- crates/sloth_vm/src/lib.rs | 230 ++------------------------------------------- 1 file changed, 9 insertions(+), 221 deletions(-) (limited to 'crates/sloth_vm/src/lib.rs') diff --git a/crates/sloth_vm/src/lib.rs b/crates/sloth_vm/src/lib.rs index 68f0406..77f7a25 100644 --- a/crates/sloth_vm/src/lib.rs +++ b/crates/sloth_vm/src/lib.rs @@ -7,111 +7,19 @@ unused_lifetimes )] -use sloth_bytecode::Instruction; +pub mod native; +pub mod obj; +pub mod vm; + +pub use crate::vm::VM; pub struct Chunk { - code: Vec, constants: Vec, + code: Vec, } -pub struct VM { - vm_return: Option, - stack: Stack, -} - -impl VM { - fn new() -> Self { - Self { - vm_return: None, - stack: Stack::default(), - } - } - - fn execute(&mut self) { - loop { - self.execute_once(); - } - } - - fn execute_once(&mut self) { - // - } - - fn run(&mut self, chunk: &Chunk) { - let mut pointer = 0; - - loop { - let instruction = Instruction::disassemble(&chunk.code, &mut pointer); - - match instruction { - Instruction::Constant(idx) => { - let value = chunk.constants[idx as usize]; - self.stack.push(value); - } - Instruction::Load(_) => todo!(), - Instruction::Push(_) => todo!(), - Instruction::Dup => { - let value = self.stack.pop(); - self.stack.push(value); - self.stack.push(value); - } - Instruction::Pop => { - self.stack.pop(); - } - Instruction::Add => { - let value = match self.stack.pop2() { - (Data::Integer(lhs), Data::Integer(rhs)) => Data::Integer(lhs + rhs), - (Data::Float(lhs), Data::Float(rhs)) => Data::Float(lhs + rhs), - _ => panic!(), - }; - - self.stack.push(value); - } - Instruction::Sub => { - let value = match self.stack.pop2() { - (Data::Integer(lhs), Data::Integer(rhs)) => Data::Integer(lhs - rhs), - (Data::Float(lhs), Data::Float(rhs)) => Data::Float(lhs - rhs), - _ => panic!(), - }; - - self.stack.push(value); - } - Instruction::Mul => { - let value = match self.stack.pop2() { - (Data::Integer(lhs), Data::Integer(rhs)) => Data::Integer(lhs * rhs), - (Data::Float(lhs), Data::Float(rhs)) => Data::Float(lhs * rhs), - _ => panic!(), - }; - - self.stack.push(value); - } - Instruction::Div => { - let value = match self.stack.pop2() { - (Data::Integer(lhs), Data::Integer(rhs)) => Data::Integer(lhs / rhs), - (Data::Float(lhs), Data::Float(rhs)) => Data::Float(lhs / rhs), - _ => panic!(), - }; - - self.stack.push(value); - } - Instruction::Mod => { - let value = match self.stack.pop2() { - (Data::Integer(lhs), Data::Integer(rhs)) => Data::Integer(lhs % rhs), - (Data::Float(lhs), Data::Float(rhs)) => Data::Float(lhs % rhs), - _ => panic!(), - }; - - self.stack.push(value); - } - Instruction::VMReturn => { - let value = self.stack.pop(); - self.vm_return = Some(value); - break; - } - Instruction::VMExit => break, - } - } - } +pub struct Function { + chunk: Chunk, } #[derive(Debug, Clone, Copy, PartialEq)] @@ -166,124 +74,4 @@ impl Stack { } } -#[cfg(test)] -mod tests { - use crate::{Chunk, Data, VM}; - - #[test] - fn arithmetic_ops() { - let mut vm = VM::new(); - - // Addition - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x10, // Duplicate - 0x20, // Add - 0xF0, // Return VM - ], - constants: vec![Data::Integer(7)], - }); - - let add1 = vm.vm_return; - - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x00, 0, 0, 0, 0, 0, 0, 0, 1, // Load constant from 1 - 0x20, // Add - 0xF0, // Return VM - ], - constants: vec![Data::Integer(2), Data::Integer(11)], - }); - - let add2 = vm.vm_return; - - // Subtraction - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x10, // Duplicate - 0x21, // Subtraction - 0xF0, // Return VM - ], - constants: vec![Data::Integer(7)], - }); - - let sub1 = vm.vm_return; - - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x00, 0, 0, 0, 0, 0, 0, 0, 1, // Load constant from 1 - 0x21, // Subtraction - 0xF0, // Return VM - ], - constants: vec![Data::Integer(2), Data::Integer(11)], - }); - - let sub2 = vm.vm_return; - - // Multiplication - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x10, // Duplicate - 0x22, // Multiplication - 0xF0, // Return VM - ], - constants: vec![Data::Integer(7)], - }); - - let mul1 = vm.vm_return; - - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x00, 0, 0, 0, 0, 0, 0, 0, 1, // Load constant from 1 - 0x22, // Multiplication - 0xF0, // Return VM - ], - constants: vec![Data::Integer(2), Data::Integer(11)], - }); - - let mul2 = vm.vm_return; - - // Division - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x10, // Duplicate - 0x23, // Division - 0xF0, // Return VM - ], - constants: vec![Data::Integer(7)], - }); - - let div1 = vm.vm_return; - - vm.run(&Chunk { - code: vec![ - 0x00, 0, 0, 0, 0, 0, 0, 0, 0, // Load constant from 0 - 0x00, 0, 0, 0, 0, 0, 0, 0, 1, // Load constant from 1 - 0x23, // Division - 0xF0, // Return VM - ], - constants: vec![Data::Integer(2), Data::Integer(11)], - }); - - let div2 = vm.vm_return; - - assert_eq!(add1, Some(Data::Integer(14))); - assert_eq!(add2, Some(Data::Integer(13))); - - assert_eq!(sub1, Some(Data::Integer(0))); - assert_eq!(sub2, Some(Data::Integer(9))); - - assert_eq!(mul1, Some(Data::Integer(49))); - assert_eq!(mul2, Some(Data::Integer(22))); - - assert_eq!(div1, Some(Data::Integer(1))); - assert_eq!(div2, Some(Data::Integer(5))); - } -} +pub struct ObjectMap {} -- cgit v1.2.3