From 67f0debc923dc97fd79554678435f113c9f761d1 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 27 Oct 2021 15:15:04 +0200 Subject: Fix an issue with reading local variables when nested --- src/bytecode/compiler.h | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'src/bytecode/compiler.h') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index f9e1da1..27ff312 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -608,17 +608,26 @@ parse_tree(Chunk *chunk, Compiler *compiler) { return; } break; case TOKEN_SYMBOL: { - Scope *scope = get_current_scope(compiler); - ssize_t idx = find_local_index(scope, tok); - if (idx < 0) { + size_t depth = compiler->scope_depth - 1; + ssize_t idx = -1; + do { + Scope *scope = &compiler->scopes[depth]; + idx = find_local_index(scope, tok); + if (idx >= 0) { + break; + } + depth--; + } while (depth > 0); + + if (idx >= 0) { + emit_constant(chunk, tok, FIXNUM_VAL(depth)); + emit_constant(chunk, tok, FIXNUM_VAL(idx)); + add_code(chunk, OP_LOCAL, tok.line, tok.column); + } else { Object obj = make_symbol(tok.value); emit_constant(chunk, tok, obj); add_code(chunk, OP_GET, tok.line, tok.column); - return; } - - add_code(chunk, OP_LOCAL, tok.line, tok.column); - add_code(chunk, idx, tok.line, tok.column); return; } break; case TOKEN_NIL: { -- cgit v1.2.1