block is a scope
This commit is contained in:
parent
94d5d9e15b
commit
402d295fff
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue