diff --git a/lang/src/ast.asm b/lang/src/ast.asm index a42caa3..012ceaf 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -1175,6 +1175,11 @@ ast_build_symtable: pop rbp ret +section .rdata + ANONYMOUS_SCOPE_NAME db "" + 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