aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler.rs')
-rw-r--r--src/compiler.rs40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index 1a6cfc6..ecd0180 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -104,14 +104,33 @@ struct Variable {
typ: Type,
scope: usize,
active: bool,
+ upvalue: bool,
}
struct Frame {
stack: Vec<Variable>,
+ upvalues: Vec<(usize, Variable, bool)>,
scope: usize,
variables_below: usize,
}
+impl Frame {
+ fn find_local(&self, name: &str) -> Option<(usize, Type, usize, bool)> {
+ for (slot, var) in self.stack.iter().enumerate().rev() {
+ if var.name == name && var.active {
+ return Some((slot, var.typ.clone(), var.scope, false));
+ }
+ }
+ None
+ }
+
+ fn find_upvalue(&self, name: &str) -> Option<(usize, Type, usize, bool)> {
+ for (slot, upvalue) in self.upvalues.iter().enumerate() {
+ //TODO ??
+ }
+ }
+}
+
struct Compiler {
curr: usize,
tokens: TokenStream,
@@ -388,11 +407,18 @@ impl Compiler {
}
}
- fn find_local(&self, name: &str, _block: &Block) -> Option<(usize, Type, usize)> {
- let frame = self.frame();
- for (slot, var) in frame.stack.iter().enumerate().rev() {
- if var.name == name && var.active {
- return Some((slot, var.typ.clone(), var.scope));
+ fn find_upvalue(&self, name: &str, start_at: usize) -> Option<(usize, Type, usize, bool)> {
+
+ }
+
+ fn find_variable<I>(&mut self, name: &str, mut iterator: I) -> Option<(usize, Type, usize, bool)>
+ where I: Iterator<Item = Frame> {
+ if let Some(frame) = i.next() {
+ if let Some(res) = frame.find_local(name) {
+ return Some(res);
+ }
+ if let Some(res) = frame.find_upvalue(name) {
+ return Some(res);
}
}
None
@@ -519,7 +545,8 @@ impl Compiler {
name: String::from(name),
typ,
scope,
- active: false
+ active: false,
+ upvalue: false,
});
Ok(slot)
}
@@ -749,6 +776,7 @@ impl Compiler {
typ: Type::Void,
scope: 0,
active: false,
+ upvalue: false,
});
let mut block = Block::new(name, file, 0);