diff --git a/Cargo.lock b/Cargo.lock index 32c620df..e77351ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,6 +19,16 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9" +[[package]] +name = "ariadne" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72fe02fc62033df9ba41cba57ee19acf5e742511a140c7dbc3a873e19a19a1bd" +dependencies = [ + "unicode-width", + "yansi", +] + [[package]] name = "beef" version = "0.5.2" @@ -90,6 +100,7 @@ dependencies = [ name = "hbasm" version = "0.1.0" dependencies = [ + "ariadne", "hashbrown 0.14.0", "hbbytecode", "lasso", @@ -250,8 +261,20 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" diff --git a/hbasm/Cargo.toml b/hbasm/Cargo.toml index 755d32da..1f983785 100644 --- a/hbasm/Cargo.toml +++ b/hbasm/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" hbbytecode = { path = "../hbbytecode" } paste = "1.0" hashbrown = "0.14.0" +ariadne = "0.3.0" [dependencies.lasso] version = "0.7" diff --git a/hbasm/src/macros.rs b/hbasm/src/macros.rs index d041ab20..0a3c93b6 100644 --- a/hbasm/src/macros.rs +++ b/hbasm/src/macros.rs @@ -66,7 +66,6 @@ macro_rules! impl_asm { }; } - pub(super) use {impl_asm, impl_asm_opcodes}; #[allow(clippy::single_component_path_imports)] diff --git a/hbasm/src/main.rs b/hbasm/src/main.rs index 046e92f5..d59a873b 100644 --- a/hbasm/src/main.rs +++ b/hbasm/src/main.rs @@ -1,6 +1,9 @@ -use std::{ - error::Error, - io::{stdin, stdout, Read, Write}, +use { + ariadne::{ColorGenerator, Label, Report, ReportKind, Source}, + std::{ + error::Error, + io::{stdin, Read}, + }, }; fn main() -> Result<(), Box> { @@ -8,14 +11,36 @@ fn main() -> Result<(), Box> { stdin().read_to_string(&mut code)?; let mut buf = vec![]; + if let Err(e) = hbasm::text::assembly(&code, &mut buf) { - eprintln!( - "Error {:?} at {:?} (`{}`)", - e.kind, - e.span.clone(), - &code[e.span], - ); + let mut colors = ColorGenerator::new(); + + let e_code = match e.kind { + hbasm::text::ErrorKind::UnexpectedToken => 1, + hbasm::text::ErrorKind::InvalidToken => 2, + hbasm::text::ErrorKind::UnexpectedEnd => 3, + hbasm::text::ErrorKind::InvalidSymbol => 4, + }; + let message = match e.kind { + hbasm::text::ErrorKind::UnexpectedToken => "This token is not expected!", + hbasm::text::ErrorKind::InvalidToken => "The token is not valid!", + hbasm::text::ErrorKind::UnexpectedEnd => "The assembler reached the end of input unexpectedly!", + hbasm::text::ErrorKind::InvalidSymbol => "This referenced symbol doesn't have a corresponding label!", + }; + let a = colors.next(); + + Report::build(ReportKind::Error, "engine_internal", e.span.clone().start) + .with_code(e_code) + .with_message(format!("{:?}", e.kind)) + .with_label( + Label::new(("engine_internal", e.span.clone())) + .with_message(message) + .with_color(a), + ) + .finish() + .eprint(("engine_internal", Source::from(&code))) + .unwrap(); } - stdout().write_all(&buf)?; + Ok(()) } diff --git a/hbvm/src/vm/mem/mod.rs b/hbvm/src/vm/mem/mod.rs index dd92875b..65f58001 100644 --- a/hbvm/src/vm/mem/mod.rs +++ b/hbvm/src/vm/mem/mod.rs @@ -2,11 +2,13 @@ pub mod paging; -use self::paging::{PageTable, Permission, PtEntry}; -use super::{trap::HandleTrap, VmRunError}; -use alloc::boxed::Box; -use core::mem::MaybeUninit; -use derive_more::Display; +use { + self::paging::{PageTable, Permission, PtEntry}, + super::{trap::HandleTrap, VmRunError}, + alloc::boxed::Box, + core::mem::MaybeUninit, + derive_more::Display, +}; /// HoleyBytes virtual memory #[derive(Clone, Debug)] diff --git a/hbvm/src/vm/mem/paging.rs b/hbvm/src/vm/mem/paging.rs index b1979ebb..c621ab4b 100644 --- a/hbvm/src/vm/mem/paging.rs +++ b/hbvm/src/vm/mem/paging.rs @@ -1,12 +1,14 @@ //! Page table and associated structures implementation -use core::{ - fmt::Debug, - mem::MaybeUninit, - ops::{Index, IndexMut}, - slice::SliceIndex, +use { + core::{ + fmt::Debug, + mem::MaybeUninit, + ops::{Index, IndexMut}, + slice::SliceIndex, + }, + delegate::delegate, }; -use delegate::delegate; /// Page entry permission #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] @@ -30,7 +32,7 @@ pub enum Permission { pub struct PtEntry(u64); impl PtEntry { /// Create new - /// + /// /// # Safety /// - `ptr` has to point to valid data and shall not be deallocated /// troughout the entry lifetime @@ -61,7 +63,6 @@ impl Debug for PtEntry { } } - /// Page table #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[repr(align(4096))] @@ -145,7 +146,7 @@ impl Default for PageTable { #[repr(C, align(4096))] pub union PtPointedData { /// Node - next page table - pub pt: PageTable, + pub pt: PageTable, /// Leaf pub page: u8, }