From 7073e571230072554ff787ca65f530f1a2c19b4d Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Tue, 11 Oct 2022 14:04:37 -0700 Subject: [PATCH] mu --- README.md | 1 + rust/Cargo.lock | 65 +++++++++++++++++++++++++++++++++++++++++++++++ rust/Cargo.toml | 2 ++ rust/src/chunk.rs | 9 +++---- rust/src/main.rs | 7 ++++- rust/src/vm.rs | 33 ++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 rust/src/vm.rs diff --git a/README.md b/README.md index c9e94c0..fe14bab 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Crafting Interpreters - [Crafting Interpreters](https://craftinginterpreters.com/) +- [Source repo](https://github.com/munificent/craftinginterpreters) ## Installing Lox diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 661ac0d..dc38768 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -2,6 +2,71 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anyhow" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" + [[package]] name = "lox" version = "0.1.0" +dependencies = [ + "anyhow", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index f6e02e9..f3c3d52 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +anyhow = "1.0.62" +thiserror = "1.0.32" diff --git a/rust/src/chunk.rs b/rust/src/chunk.rs index 934c51e..688764f 100644 --- a/rust/src/chunk.rs +++ b/rust/src/chunk.rs @@ -15,7 +15,7 @@ type Value = f32; #[derive(Default)] pub struct Chunk { - code: Vec, + pub code: Vec, constants: Vec, lines: Lines, } @@ -74,7 +74,7 @@ impl Chunk { } fn constant_instruction(&self, name: &str, offset: usize) -> usize { - let constant_index = self.code[offset+1]; + let constant_index = self.code[offset + 1]; let value = self.constants[constant_index as usize]; println!("{:<16} {:>4} '{}'", name, constant_index, value); offset + 2 @@ -82,7 +82,7 @@ impl Chunk { fn constant_long_instruction(&self, name: &str, offset: usize) -> usize { let index_len = mem::size_of::(); - let index_bytes = &self.code[offset+1..offset+1+index_len]; + let index_bytes = &self.code[offset + 1..offset + 1 + index_len]; let (int_bytes, _) = index_bytes.split_at(std::mem::size_of::()); let constant_index = usize::from_ne_bytes(int_bytes.try_into().unwrap()); @@ -108,7 +108,7 @@ fn test_constant_long() { // Lines are stored using run-length encoding, where the first element is the line and the second // element the number of instructions that are associated with that line -#[derive(Default, Debug)] +#[derive(Debug, Default)] struct Lines(std::vec::Vec<(usize, usize)>); impl Lines { @@ -146,4 +146,3 @@ fn test_get_line() { assert_eq!(lines.get(2), (2, true)); assert_eq!(lines.get(3), (2, false)); } - diff --git a/rust/src/main.rs b/rust/src/main.rs index 6ed152f..2ec0252 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -1,7 +1,9 @@ use chunk::{Chunk, OpCode}; +use vm::VM; pub mod chunk; pub mod vec; +pub mod vm; fn main() { let mut chunk = Chunk::default(); @@ -16,5 +18,8 @@ fn main() { // chunk.write_constant(0.0, 123); - chunk.disassemble("test chunk"); + // chunk.disassemble("test chunk"); + + let vm = VM::new(chunk); + vm.interpret(); } diff --git a/rust/src/vm.rs b/rust/src/vm.rs new file mode 100644 index 0000000..8b61340 --- /dev/null +++ b/rust/src/vm.rs @@ -0,0 +1,33 @@ +use std::ptr; + +use anyhow::Result; +use thiserror::Error; + +use crate::chunk::Chunk; + +pub struct VM { + chunk: Chunk, + ip: *const u8, +} + +#[derive(Error, Debug)] +pub enum DataStoreError { + #[error("")] + CompileError, + #[error("")] + RuntimeError, +} + +impl VM { + pub fn new(chunk: Chunk) -> Self { + VM { chunk, ip: &chunk.code.ptr } + } + + pub fn interpret(&self) -> Result<()> { + self.run() + } + + fn run(&self) -> Result<()> { + todo!() + } +}