diff options
Diffstat (limited to 'src/semantic/translate.rs')
-rw-r--r-- | src/semantic/translate.rs | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs index f802c3f..08e600f 100644 --- a/src/semantic/translate.rs +++ b/src/semantic/translate.rs @@ -1,3 +1,6 @@ +use std::cell::RefCell; +use std::rc::Rc; + use super::frame; use super::ir; use super::temp; @@ -14,16 +17,18 @@ pub struct Translate<F> { _frametype: ::std::marker::PhantomData<F>, } -pub enum Level<'a, F> - where F: 'a + frame::Frame { +pub enum Level<F> + where F: frame::Frame { Top, Level { - parent: &'a Level<'a, F>, + parent: LevelRef<F>, frame: F, unique_id: usize, }, } +pub type LevelRef<F> = Rc<RefCell<Level<F>>>; + impl<F: frame::Frame> Translate<F> { pub fn new() -> Translate<F> { Translate { @@ -33,17 +38,17 @@ impl<F: frame::Frame> Translate<F> { } } - pub fn make_level<'a>( + pub fn make_level( &mut self, - parent: &'a Level<F>, - formals: Vec<frame::Escape>) -> Level<'a, F> { + parent: LevelRef<F>, + formals: Vec<frame::Escape>) -> LevelRef<F> { let id = self.level_counter; self.level_counter += 1; - Level::Level { + Rc::new(RefCell::new(Level::Level { parent: parent, frame: F::new(self.temp.next_label(), formals), unique_id: id, - } + })) } pub fn make_num(&mut self, num: u64) -> Expression { @@ -61,7 +66,7 @@ impl<F: frame::Frame> Translate<F> { } pub fn alloc_local<'a>(&mut self, - level: &mut Level<'a, F>, + level: &mut Level<F>, escapes: frame::Escape) -> Expression { match level { &mut Level::Top => { |