block is a scope

This commit is contained in:
janis 2025-10-31 14:26:23 +01:00
parent 94d5d9e15b
commit 402d295fff
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -1175,6 +1175,11 @@ ast_build_symtable:
pop rbp
ret
section .rdata
ANONYMOUS_SCOPE_NAME db "<anonymous>"
ANONYMOUS_SCOPE_NAME_LEN equ $ - ANONYMOUS_SCOPE_NAME
section .text
;; symtable is a sorted vec pretending to be a b-tree:
;; entries are sorted by a key in order to get the following ordering:
;; scope (index0) -> (ident0)
@ -1263,8 +1268,29 @@ ast_build_symtable_for_each:
je .var_decl
cmp bl, AST_ARG
je .arg
cmp bl, AST_BLOCK
je .block
jmp .done
.block:
; insert scope entry
lea rdx, [rel ANONYMOUS_SCOPE_NAME]
mov rcx, ANONYMOUS_SCOPE_NAME_LEN
mov [rsp + 72], rdx ; SymEntry.index
mov [rsp + 80], rcx ; SymEntry.extra
jmp .insert_scope
.func:
; use function name as scope name
mov rbx, [rax + 8] ; AstNode.data
mov rdx, [rbx + 0] ; Func.name
mov rcx, [rbx + 8] ; Func.name_len
mov [rsp + 72], rdx ; SymEntry.index
mov [rsp + 80], rcx ; SymEntry.extra
.insert_scope:
; insert scope entry
mov byte [rsp + 32], SYM_KEY_SCOPE ; SymKey.kind
mov rdx, [rsp + 16] ; index
@ -1274,13 +1300,6 @@ ast_build_symtable_for_each:
mov qword [rsp + 56], 1 ; SymKey.ident
mov qword [rsp + 64], 0 ; SymKey.ident_len
mov rbx, [rax + 8] ; AstNode.data
mov rdx, [rbx + 0] ; Func.name
mov rcx, [rbx + 8] ; Func.name_len
mov [rsp + 72], rdx ; SymEntry.index
mov [rsp + 80], rcx ; SymEntry.extra
mov rdi, [rsp + 8] ; Ctx.symtable
lea rsi, [rsp + 32] ; &SymEntry
mov rcx, 0 ; cmp_ctx
@ -1480,6 +1499,12 @@ ast_walk_for_each:
jmp .check_scope
.block:
; push scope
push qword [rbp + 32] ; scope-ptr
push qword [rbp + 40] ; current_index
mov [rbp + 32], rsp ; update current_scope
; push statements onto stack
mov rbx, [rax + 8] ; AstNode.data
mov r15, [rax + 16] ; AstNode.extra
@ -1488,7 +1513,7 @@ ast_walk_for_each:
jle .stmt_loop_done
dec r15
mov rdx, [rbx + r15*8] ; statement index
push rdx ; push statement index
push rdx ; push statement index
jmp .stmt_loop
.stmt_loop_done:
jmp .check_scope