From 3f08a838d23451c834d339fdf26dbec58aa82045 Mon Sep 17 00:00:00 2001 From: NotAFile Date: Wed, 16 Feb 2022 17:38:56 +0100 Subject: [PATCH] switch callable to interning too --- src/frontend.rs | 10 ++++++---- src/frontend/callable.rs | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/frontend.rs b/src/frontend.rs index c216648..55ad308 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -4,7 +4,7 @@ use std::fmt::Write; use super::parser; use crate::rtlil; -pub use callable::Callable; +pub use callable::{Callable, CallableId}; pub use types::{Type, TypeStruct, TypingContext}; mod callable; @@ -64,7 +64,8 @@ impl Signal { pub struct Context { /// map callable name to callable - callables: BTreeMap, + callable_names: BTreeMap, + callables: BTreeMap, /// type names typenames: BTreeMap, types: TypingContext, @@ -92,6 +93,7 @@ impl Context { let tcx = TypingContext::new(); Context { callables: BTreeMap::new(), + callable_names: BTreeMap::new(), signals: BTreeMap::new(), types: TypingContext::new(), typenames: [ @@ -115,8 +117,8 @@ impl Context { }) } - fn try_get_callable(&self, callname: &str) -> Result<&Callable, CompileError> { - self.callables.get(callname).ok_or_else(|| { + fn try_get_callable(&self, callname: &str) -> Result { + self.callable_names.get(callname).copied().ok_or_else(|| { CompileError::new(CompileErrorKind::UndefinedReference(callname.to_owned())) }) } diff --git a/src/frontend/callable.rs b/src/frontend/callable.rs index 3f13138..f81ed33 100644 --- a/src/frontend/callable.rs +++ b/src/frontend/callable.rs @@ -1,5 +1,8 @@ use super::types::Type; +#[derive(Copy, Clone, PartialEq)] +pub struct CallableId(u32); + pub struct Callable { pub name: String, pub args: Vec<(Option, Type)>,