diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-01-12 23:35:47 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-01-12 23:35:47 +0100 |
| commit | 4db5a471562130947830ad3edc127a7a994f8e7d (patch) | |
| tree | bf05efc8fd5173e1073e70c8157c63a22bbab6b4 /src | |
| parent | b9710f5de083e8205dbb51921f43d96b17fd43cf (diff) | |
| download | sylt-4db5a471562130947830ad3edc127a7a994f8e7d.tar.gz | |
test for-loops and scope loop variables
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"); } |
