args are var syms, recursively search parent scopes for symbols
This commit is contained in:
parent
d754f8c4b9
commit
555f79f00e
|
|
@ -1356,7 +1356,7 @@ ast_build_symtable_for_each:
|
||||||
|
|
||||||
.arg:
|
.arg:
|
||||||
; insert variable entry
|
; insert variable entry
|
||||||
mov byte [rsp + 32], SYM_KEY_ARG ; SymKey.kind
|
mov byte [rsp + 32], SYM_KEY_VAR ; SymKey.kind
|
||||||
|
|
||||||
mov rdx, [rax + 24] ; AstNode.span
|
mov rdx, [rax + 24] ; AstNode.span
|
||||||
mov qword [rsp + 48], rdx ; SymKey.span
|
mov qword [rsp + 48], rdx ; SymKey.span
|
||||||
|
|
@ -1606,14 +1606,21 @@ ast_resolve_var_refs_for_each:
|
||||||
cmp bl, AST_VAR_REF
|
cmp bl, AST_VAR_REF
|
||||||
jne .epilogue
|
jne .epilogue
|
||||||
|
|
||||||
|
.var_ref:
|
||||||
; lookup variable in symbol table
|
; lookup variable in symbol table
|
||||||
|
|
||||||
; binary search lower bound
|
; binary search lower bound
|
||||||
mov byte [rsp + 24 + 0], SYM_KEY_START_LOCALS ; SymKey.kind
|
mov byte [rsp + 24 + 0], SYM_KEY_START_LOCALS ; SymKey.kind
|
||||||
mov qword [rsp + 24 + 8], 0 ; SymKey.scope_index
|
mov rax, [rsp + 80] ; scope
|
||||||
|
mov [rsp + 24 + 8], rax ; SymKey.scope_index
|
||||||
mov qword [rsp + 24 + 16], 0 ; SymKey.span
|
mov qword [rsp + 24 + 16], 0 ; SymKey.span
|
||||||
mov qword [rsp + 24 + 24], 1 ; SymKey.name
|
; name
|
||||||
mov qword [rsp + 24 + 32], 0 ; SymKey.name_len
|
mov rax, [rsp + 16] ; *AstNode
|
||||||
|
mov rbx, [rax + 8] ; AstNode.data
|
||||||
|
mov rax, [rbx + 8] ; AstVarRef.name
|
||||||
|
mov rbx, [rbx + 16] ; AstVarRef.name_len
|
||||||
|
mov [rsp + 24 + 24], rax ; SymKey.ident
|
||||||
|
mov [rsp + 24 + 32], rbx ; SymKey.ident_len
|
||||||
|
|
||||||
; binary search in symbol table
|
; binary search in symbol table
|
||||||
mov rdi, [rsp + 8] ; *Ctx
|
mov rdi, [rsp + 8] ; *Ctx
|
||||||
|
|
@ -1630,11 +1637,6 @@ ast_resolve_var_refs_for_each:
|
||||||
mov rax, [rsp + 16] ; *AstNode
|
mov rax, [rsp + 16] ; *AstNode
|
||||||
mov rbx, [rax + 24] ; AstNode.span
|
mov rbx, [rax + 24] ; AstNode.span
|
||||||
mov [rsp + 24 + 16], rbx ; SymKey.span
|
mov [rsp + 24 + 16], rbx ; SymKey.span
|
||||||
mov rbx, [rax + 8] ; AstNode.data
|
|
||||||
mov rax, [rbx + 8] ; AstVarRef.name
|
|
||||||
mov rbx, [rbx + 16] ; AstVarRef.name_len
|
|
||||||
mov [rsp + 24 + 24], rax ; SymKey.ident
|
|
||||||
mov [rsp + 24 + 32], rbx ; SymKey.ident_len
|
|
||||||
|
|
||||||
; binary search in symbol table
|
; binary search in symbol table
|
||||||
mov rdi, [rsp + 8] ; *Ctx
|
mov rdi, [rsp + 8] ; *Ctx
|
||||||
|
|
@ -1648,16 +1650,60 @@ ast_resolve_var_refs_for_each:
|
||||||
|
|
||||||
.fixup:
|
.fixup:
|
||||||
cmp rax, [rsp + 88] ; lower_bound
|
cmp rax, [rsp + 88] ; lower_bound
|
||||||
jl .panic
|
jl .parent
|
||||||
|
|
||||||
mov rdi, [rsp + 8] ; *Ctx
|
mov rdi, [rsp + 8] ; *Ctx
|
||||||
mov rsi, rax ; index
|
mov rsi, rax ; index
|
||||||
call vec_get
|
call vec_get
|
||||||
mov rax, [rax + 40] ; SymEntry.index
|
mov rbx, rax ; *SymEntry
|
||||||
|
|
||||||
|
; compare symbol ident with var_ref ident
|
||||||
|
mov rdi, [rbx + 24] ; SymEntry.key.ident
|
||||||
|
mov rsi, [rbx + 32] ; SymEntry.key.ident_len
|
||||||
|
|
||||||
|
mov rax, [rsp + 16] ; *AstNode
|
||||||
|
mov rax, [rax + 8] ; AstNode.data
|
||||||
|
mov rdx, [rax + 8] ; AstVarRef.name
|
||||||
|
mov rcx, [rax + 16] ; AstVarRef.name_len
|
||||||
|
call strcmp
|
||||||
|
test rax, rax
|
||||||
|
jnz .parent
|
||||||
|
|
||||||
|
; load SymEntry.index
|
||||||
|
mov rax, [rbx + 40] ; SymEntry.index
|
||||||
|
|
||||||
mov rdx, [rsp + 16] ; *AstNode
|
mov rdx, [rsp + 16] ; *AstNode
|
||||||
mov rdx, [rdx + 8] ; AstNode.data
|
mov rdx, [rdx + 8] ; AstNode.data
|
||||||
mov [rdx + 0], rax ; AstVarRef.resolved_index
|
mov [rdx + 0], rax ; AstVarRef.resolved_index
|
||||||
|
jmp .epilogue
|
||||||
|
|
||||||
|
.parent:
|
||||||
|
; binary search for parent scope
|
||||||
|
mov byte [rsp + 24 + 0], SYM_KEY_PARENT_SCOPE ; SymKey.kind
|
||||||
|
mov rax, [rsp + 80] ; scope
|
||||||
|
mov [rsp + 24 + 8], rax ; SymKey.scope_index
|
||||||
|
mov qword [rsp + 24 + 16], 0 ; SymKey.span
|
||||||
|
mov qword [rsp + 24 + 24], 1 ; SymKey.ident
|
||||||
|
mov qword [rsp + 24 + 32], 0 ; SymKey.ident_len
|
||||||
|
|
||||||
|
; binary search in symbol table
|
||||||
|
mov rdi, [rsp + 8] ; *Ctx
|
||||||
|
lea rsi, [rsp + 24] ; &SymKey
|
||||||
|
mov rdx, symkey_cmp ; cmp
|
||||||
|
mov rcx, 0 ; cmp_ctx
|
||||||
|
call vec_binary_search_by
|
||||||
|
test rdx, rdx
|
||||||
|
jnz .panic ; can't find the symbol entry for this var-ref
|
||||||
|
|
||||||
|
; load parent scope sym entry
|
||||||
|
mov rdi, [rsp + 8] ; *Ctx
|
||||||
|
mov rsi, rax ; index
|
||||||
|
call vec_get
|
||||||
|
mov rbx, rax ; *SymEntry
|
||||||
|
|
||||||
|
mov rdx, [rax + 40] ; SymEntry.index (parent scope)
|
||||||
|
mov [rsp + 80], rdx ; update scope
|
||||||
|
jmp .var_ref
|
||||||
|
|
||||||
.epilogue:
|
.epilogue:
|
||||||
add rsp, 96
|
add rsp, 96
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue