add fancy errors
This commit is contained in:
parent
6759fbd2ab
commit
b72f0afe84
23
Cargo.lock
generated
23
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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<dyn Error>> {
|
||||
|
@ -8,14 +11,30 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||
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 a = colors.next();
|
||||
|
||||
Report::build(ReportKind::Error, "engine_internal", 12)
|
||||
.with_code(e_code)
|
||||
.with_message(format!("{:?}", e.kind))
|
||||
.with_label(
|
||||
Label::new(("engine_internal", e.span.clone()))
|
||||
.with_message(format!("{:?}", e.kind))
|
||||
.with_color(a),
|
||||
)
|
||||
.finish()
|
||||
.eprint(("engine_internal", Source::from(&code)))
|
||||
.unwrap();
|
||||
}
|
||||
stdout().write_all(&buf)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -97,10 +97,6 @@ pub struct Vm<'a, T> {
|
|||
|
||||
/// Program
|
||||
program: &'a [u8],
|
||||
|
||||
pub last_tick_count: u32,
|
||||
pub tick_callback: Option<fn() -> u32>,
|
||||
pub tick_limit: u32,
|
||||
}
|
||||
|
||||
impl<'a, T: HandleTrap> Vm<'a, T> {
|
||||
|
@ -115,9 +111,6 @@ impl<'a, T: HandleTrap> Vm<'a, T> {
|
|||
traph,
|
||||
pc: 0,
|
||||
program,
|
||||
last_tick_count: 0,
|
||||
tick_callback: None,
|
||||
tick_limit: 32,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,12 +123,12 @@ impl<'a, T: HandleTrap> Vm<'a, T> {
|
|||
/// Execute program
|
||||
///
|
||||
/// Program can return [`VmRunError`] if a trap handling failed
|
||||
pub fn run(&mut self) -> Result<u32, VmRunError> {
|
||||
pub fn run(&mut self) -> Result<(), VmRunError> {
|
||||
use hbbytecode::opcode::*;
|
||||
loop {
|
||||
// Fetch instruction
|
||||
let Some(&opcode) = self.program.get(self.pc)
|
||||
else { return Ok(2) };
|
||||
else { return Ok(()) };
|
||||
|
||||
// Big match
|
||||
unsafe {
|
||||
|
@ -325,15 +318,7 @@ impl<'a, T: HandleTrap> Vm<'a, T> {
|
|||
}
|
||||
}
|
||||
}
|
||||
if self.tick_callback.is_some() {
|
||||
let ret = self.tick_callback.unwrap()();
|
||||
if (ret - self.last_tick_count) >= self.tick_limit {
|
||||
return Ok(0);
|
||||
}
|
||||
}
|
||||
return Ok(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Read register
|
||||
|
|
Loading…
Reference in a new issue