diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler.rs | 13 | ||||
| -rw-r--r-- | src/lib.rs | 1 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index f84f9f8..b7e946c 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -380,9 +380,14 @@ impl Compiler { } } + //TODO de-complexify fn for_loop(&mut self, block: &mut Block) { expect!(self, Token::For, "Expected 'for' at start of for-loop."); + // push outer scope for loop variable + self.level += 1; + let h = self.stack.len(); + // Definition match self.peek_four() { (Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual, ..) => { @@ -433,8 +438,12 @@ impl Compiler { block.patch(Op::JmpFalse(block.curr()), cond_out); - // Loop variable - block.add(Op::Pop, self.line()); + // pop outer scope + self.level -= 1; + for _ in h..self.stack.len() { + block.add(Op::Pop, self.line()); + } + self.stack.truncate(h); } fn statement(&mut self, block: &mut Block) { @@ -64,4 +64,5 @@ mod tests { test_file!(variables, "tests/variables.tdy"); test_file!(scoping, "tests/scoping.tdy"); test_file!(if_, "tests/if.tdy"); + test_file!(for_, "tests/for.tdy"); } |
