summaryrefslogtreecommitdiff
path: root/src/semantic/translate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/semantic/translate.rs')
-rw-r--r--src/semantic/translate.rs23
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 => {