diff options
Diffstat (limited to 'src/bytecode/compiler.h')
-rwxr-xr-x | src/bytecode/compiler.h | 23 |
1 files changed, 16 insertions, 7 deletions
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) { | |||
608 | return; | 608 | return; |
609 | } break; | 609 | } break; |
610 | case TOKEN_SYMBOL: { | 610 | case TOKEN_SYMBOL: { |
611 | Scope *scope = get_current_scope(compiler); | 611 | size_t depth = compiler->scope_depth - 1; |
612 | ssize_t idx = find_local_index(scope, tok); | 612 | ssize_t idx = -1; |
613 | if (idx < 0) { | 613 | do { |
614 | Scope *scope = &compiler->scopes[depth]; | ||
615 | idx = find_local_index(scope, tok); | ||
616 | if (idx >= 0) { | ||
617 | break; | ||
618 | } | ||
619 | depth--; | ||
620 | } while (depth > 0); | ||
621 | |||
622 | if (idx >= 0) { | ||
623 | emit_constant(chunk, tok, FIXNUM_VAL(depth)); | ||
624 | emit_constant(chunk, tok, FIXNUM_VAL(idx)); | ||
625 | add_code(chunk, OP_LOCAL, tok.line, tok.column); | ||
626 | } else { | ||
614 | Object obj = make_symbol(tok.value); | 627 | Object obj = make_symbol(tok.value); |
615 | emit_constant(chunk, tok, obj); | 628 | emit_constant(chunk, tok, obj); |
616 | add_code(chunk, OP_GET, tok.line, tok.column); | 629 | add_code(chunk, OP_GET, tok.line, tok.column); |
617 | return; | ||
618 | } | 630 | } |
619 | |||
620 | add_code(chunk, OP_LOCAL, tok.line, tok.column); | ||
621 | add_code(chunk, idx, tok.line, tok.column); | ||
622 | return; | 631 | return; |
623 | } break; | 632 | } break; |
624 | case TOKEN_NIL: { | 633 | case TOKEN_NIL: { |