mirror of
https://github.com/Noratrieb/dilaria.git
synced 2026-01-14 09:25:02 +01:00
add parse only mode
This commit is contained in:
parent
aab4d95b21
commit
3ac2746658
4 changed files with 19 additions and 8 deletions
|
|
@ -25,3 +25,6 @@ insta = "1.9.0"
|
|||
[[bench]]
|
||||
name = "parser"
|
||||
harness = false
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
|
|
@ -36,6 +36,7 @@ type HashSet<T> = rustc_hash::FxHashSet<T>;
|
|||
pub struct Config<'io> {
|
||||
pub debug: bool,
|
||||
pub step: bool,
|
||||
pub parse_only: bool,
|
||||
pub stdout: &'io mut dyn Write,
|
||||
}
|
||||
|
||||
|
|
@ -53,7 +54,12 @@ pub fn run_program(program: &str, cfg: &mut Config) {
|
|||
let ast = parse::parse(lexer, &ast_alloc);
|
||||
|
||||
match ast {
|
||||
Ok(ast) => process_ast(program, &ast, runtime, cfg),
|
||||
Ok(ast) => {
|
||||
if cfg.parse_only {
|
||||
return;
|
||||
}
|
||||
process_ast(program, &ast, runtime, cfg)
|
||||
}
|
||||
Err(err) => errors::display_error(program, err),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ fn main() {
|
|||
let mut cfg = Config {
|
||||
debug: false,
|
||||
step: false,
|
||||
parse_only: false,
|
||||
stdout: &mut stdout,
|
||||
};
|
||||
|
||||
|
|
@ -18,6 +19,7 @@ fn main() {
|
|||
match &*arg {
|
||||
"--debug" => cfg.debug = true,
|
||||
"--step" => cfg.step = true,
|
||||
"--parse-only" => cfg.parse_only = true,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,28 +89,28 @@ enum HeapObjectKind {
|
|||
|
||||
#[derive(Debug)]
|
||||
pub struct RtAlloc {
|
||||
symbols: HashSet<NonNullStrWrapper>,
|
||||
symbols: HashSet<NonNullStrStructuralEq>,
|
||||
objects: LinkedList<HeapObject>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct NonNullStrWrapper(NonNull<str>);
|
||||
struct NonNullStrStructuralEq(NonNull<str>);
|
||||
|
||||
impl Hash for NonNullStrWrapper {
|
||||
impl Hash for NonNullStrStructuralEq {
|
||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||
// SAFETY: Assume the ptr is valid, same rules as `Gc<T>`
|
||||
unsafe { self.0.as_ref().hash(state) }
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for NonNullStrWrapper {
|
||||
impl PartialEq for NonNullStrStructuralEq {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
// SAFETY: Assume the ptr is valid, same rules as `Gc<T>`
|
||||
unsafe { self.0.as_ref().eq(other.0.as_ref()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for NonNullStrWrapper {}
|
||||
impl Eq for NonNullStrStructuralEq {}
|
||||
|
||||
impl RtAlloc {
|
||||
/// # Safety
|
||||
|
|
@ -153,11 +153,11 @@ impl RtAlloc {
|
|||
pub fn intern_string(&mut self, str: &str) -> Symbol {
|
||||
let original_nonnull = NonNull::from(str);
|
||||
|
||||
if let Some(interned) = self.symbols.get(&NonNullStrWrapper(original_nonnull)) {
|
||||
if let Some(interned) = self.symbols.get(&NonNullStrStructuralEq(original_nonnull)) {
|
||||
Symbol::new(Gc { ptr: interned.0 })
|
||||
} else {
|
||||
let allocated = self.alloc_str(str);
|
||||
self.symbols.insert(NonNullStrWrapper(allocated.ptr));
|
||||
self.symbols.insert(NonNullStrStructuralEq(allocated.ptr));
|
||||
Symbol::new(allocated)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue