aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-03-07 16:35:54 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-03-07 16:35:54 +0100
commitbc547d051d8f0a214224cf19363b1265508e4448 (patch)
treed58b4a41f4d8bfbb441344c32495b03f882b4ba2 /src/compiler.rs
parentd96ca7b986573a98cefdb67026516fd014a93c71 (diff)
downloadsylt-bc547d051d8f0a214224cf19363b1265508e4448.tar.gz
look for outermost variables correctly
Diffstat (limited to 'src/compiler.rs')
-rw-r--r--src/compiler.rs18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index b5d05d6..d383d47 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -285,6 +285,17 @@ impl Frame {
}
}
+ fn find_outer(&self, name: &str) -> Option<Variable> {
+ // Only really makes sense in the outermost frame
+ // where declaration order doesn't matter
+ for var in self.stack.iter().rev() {
+ if var.name == name {
+ return Some(var.clone());
+ }
+ }
+ None
+ }
+
fn find_local(&self, name: &str) -> Option<Variable> {
for var in self.stack.iter().rev() {
if var.name == name && var.active {
@@ -1145,7 +1156,7 @@ impl Compiler {
fn definition_statement(&mut self, name: &str, typ: Type, block: &mut Block) {
if self.frames().len() <= 1 {
// Global
- let var = self.find_variable(name)
+ let var = self.frame().find_outer(name)
.expect(&format!("Couldn't find variable '{}' during prepass.", name));
assert!(var.mutable);
@@ -1184,7 +1195,7 @@ impl Compiler {
if self.frames().len() <= 1 {
// Global
- let var = self.find_variable(name)
+ let var = self.frame().find_outer(name)
.expect(&format!("Couldn't find constant '{}' during prepass.", name));
assert!(!var.mutable);
@@ -1722,7 +1733,6 @@ impl Compiler {
let is_mut = self.peek() == Token::Equal;
let var = Variable::new(&name, is_mut, ty);
let slot = self.define(var).unwrap();
- self.frame_mut().stack[slot].active = true;
} else {
error!(self, format!("Failed to parse type global '{}'.", name));
}
@@ -1732,14 +1742,12 @@ impl Compiler {
Some((Token::ColonColon, _)), ..) => {
let var = Variable::new(name, false, Type::Unknown);
let slot = self.define(var).unwrap();
- self.frame_mut().stack[slot].active = true;
}
(Some((Token::Identifier(name), _)),
Some((Token::ColonEqual, _)), ..) => {
let var = Variable::new(name, true, Type::Unknown);
let slot = self.define(var).unwrap();
- self.frame_mut().stack[slot].active = true;
}