about summary refs log tree commit diff
path: root/users/tazjin/rlox/src/bytecode
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-01-18T00·21+0300
committertazjin <mail@tazj.in>2021-01-18T00·24+0000
commit1ff7a2686c2d7e405e597f9ac8a96189ec161d58 (patch)
tree1e6613d559744b9722329fa927dd78ce670581ca /users/tazjin/rlox/src/bytecode
parentd6d3c12efbcec61b3d868bc7d3f861fdb91835a5 (diff)
refactor(tazjin/rlox): Add Interpreter trait for switching impls r/2129
Change-Id: Iae28d64ce879014c5e5d7e145c536c1f16ad307d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2418
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/bytecode')
-rw-r--r--users/tazjin/rlox/src/bytecode/errors.rs8
-rw-r--r--users/tazjin/rlox/src/bytecode/mod.rs34
-rw-r--r--users/tazjin/rlox/src/bytecode/vm.rs9
3 files changed, 33 insertions, 18 deletions
diff --git a/users/tazjin/rlox/src/bytecode/errors.rs b/users/tazjin/rlox/src/bytecode/errors.rs
index 89ab1867a4..c7871bc384 100644
--- a/users/tazjin/rlox/src/bytecode/errors.rs
+++ b/users/tazjin/rlox/src/bytecode/errors.rs
@@ -1,3 +1,5 @@
+use std::fmt;
+
 #[derive(Debug)]
 pub enum ErrorKind {
     // CompileError,
@@ -10,4 +12,10 @@ pub struct Error {
     pub kind: ErrorKind,
 }
 
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "[line NYI] Error: {:?}", self.kind)
+    }
+}
+
 pub type LoxResult<T> = Result<T, Error>;
diff --git a/users/tazjin/rlox/src/bytecode/mod.rs b/users/tazjin/rlox/src/bytecode/mod.rs
index 2d83c42722..31278f8c4b 100644
--- a/users/tazjin/rlox/src/bytecode/mod.rs
+++ b/users/tazjin/rlox/src/bytecode/mod.rs
@@ -9,19 +9,29 @@ mod value;
 mod vm;
 
 use chunk::Chunk;
-use opcode::OpCode;
+pub struct Interpreter {}
 
-pub fn main() {
-    let mut chunk: Chunk = Default::default();
+impl crate::Lox for Interpreter {
+    type Error = errors::Error;
+    type Value = value::Value;
 
-    let constant = chunk.add_constant(1.2);
-    chunk.add_op(OpCode::OpConstant(constant), 1);
+    fn create() -> Self {
+        Interpreter {}
+    }
 
-    let constant = chunk.add_constant(2.0);
-    chunk.add_op(OpCode::OpConstant(constant), 2);
-
-    chunk.add_op(OpCode::OpAdd, 3);
-    chunk.add_op(OpCode::OpReturn, 4);
-
-    vm::interpret(chunk).expect("it should work");
+    fn interpret(&mut self, _: String) -> Result<Self::Value, Vec<Self::Error>> {
+        let chunk: Chunk = Default::default();
+        vm::interpret(chunk).map_err(|e| vec![e])
+    }
 }
+
+// pub fn main() {
+//     let mut chunk: Chunk = Default::default();
+//     let constant = chunk.add_constant(1.2);
+//     chunk.add_op(OpCode::OpConstant(constant), 1);
+//     let constant = chunk.add_constant(2.0);
+//     chunk.add_op(OpCode::OpConstant(constant), 2);
+//     chunk.add_op(OpCode::OpAdd, 3);
+//     chunk.add_op(OpCode::OpReturn, 4);
+//     vm::interpret(chunk).expect("it should work");
+// }
diff --git a/users/tazjin/rlox/src/bytecode/vm.rs b/users/tazjin/rlox/src/bytecode/vm.rs
index fd91cd7be6..33bc358f44 100644
--- a/users/tazjin/rlox/src/bytecode/vm.rs
+++ b/users/tazjin/rlox/src/bytecode/vm.rs
@@ -32,7 +32,7 @@ macro_rules! binary_op {
 }
 
 impl VM {
-    fn run(&mut self) -> LoxResult<()> {
+    fn run(&mut self) -> LoxResult<Value> {
         loop {
             let op = &self.chunk.code[self.ip];
 
@@ -42,10 +42,7 @@ impl VM {
             self.ip += 1;
 
             match op {
-                OpCode::OpReturn => {
-                    println!("{:?}", self.pop());
-                    return Ok(());
-                }
+                OpCode::OpReturn => return Ok(self.pop()),
 
                 OpCode::OpConstant(idx) => {
                     let c = *self.chunk.constant(*idx);
@@ -66,7 +63,7 @@ impl VM {
     }
 }
 
-pub fn interpret(chunk: chunk::Chunk) -> LoxResult<()> {
+pub fn interpret(chunk: chunk::Chunk) -> LoxResult<Value> {
     let mut vm = VM {
         chunk,
         ip: 0,