try to redo scopes/symtable with passed down scope
This commit is contained in:
parent
cd5b714051
commit
cd04a5a4ca
|
|
@ -1120,23 +1120,17 @@ ast_build_symtable:
|
|||
push rbp
|
||||
mov rbp, rsp
|
||||
|
||||
; BuildSymtableCtx [24..104]
|
||||
; BuildSymtableCtx [24..64]
|
||||
; *SymbolTable [16..24]
|
||||
; root_index [8..16]
|
||||
; Ast [0..8]
|
||||
sub rsp, 104
|
||||
sub rsp, 64
|
||||
mov [rsp], rdi ; Ast
|
||||
mov [rsp + 8], rsi ; root_index
|
||||
mov [rsp + 16], rdx ; *SymbolTable
|
||||
|
||||
; initialise scope_stack and symtable vecs
|
||||
lea rdi, [rsp + 24] ; &BuildSymtableCtx.scope_stack
|
||||
mov rsi, 8 ; size of u64
|
||||
mov rdx, 0 ; drop = None
|
||||
mov rcx, 128 ; capacity
|
||||
call vec_init_with
|
||||
|
||||
lea rdi, [rsp + 24 + 40] ; &BuildSymtableCtx.symtable
|
||||
lea rdi, [rsp + 24] ; &BuildSymtableCtx.symtable
|
||||
mov rsi, 56 ; size_of::<SymEntry>
|
||||
mov rdx, 0 ; drop = None
|
||||
mov rcx, 128 ; capacity
|
||||
|
|
@ -1151,11 +1145,11 @@ ast_build_symtable:
|
|||
; memcpy symtable out
|
||||
|
||||
mov rdi, [rsp + 16] ; *SymbolTable
|
||||
lea rsi, [rsp + 24 + 40] ; &BuildSymtableCtx.symtable
|
||||
lea rsi, [rsp + 24] ; &BuildSymtableCtx.symtable
|
||||
mov rdx, 40 ; size_of::<Vec<SymEntry>>
|
||||
call memcpy
|
||||
|
||||
add rsp, 104
|
||||
add rsp, 64
|
||||
pop rbp
|
||||
ret
|
||||
|
||||
|
|
@ -1205,7 +1199,6 @@ ast_build_symtable:
|
|||
;;
|
||||
;; #start-structs
|
||||
;; struct BuildSymtableCtx {
|
||||
;; scope_stack: Vec<u64>,
|
||||
;; symtable: Vec<SymEntry>,
|
||||
;; }
|
||||
;; #end-structs
|
||||
|
|
@ -1216,18 +1209,20 @@ ast_build_symtable:
|
|||
;; rdi: Ctx
|
||||
;; rsi: Ast
|
||||
;; rdx: index
|
||||
;; rcx: scope
|
||||
ast_build_symtable_for_each:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
push rbx
|
||||
|
||||
; scope: u64 [88..96]
|
||||
; SymEntry [32..88]
|
||||
; SymKey [32..72]
|
||||
; *AstNode [24..32]
|
||||
; index [16..24]
|
||||
; ctx [8..16]
|
||||
; ast [0..8]
|
||||
sub rsp, 88
|
||||
sub rsp, 96
|
||||
mov [rsp], rsi ; Ast
|
||||
mov [rsp + 8], rdi ; Ctx
|
||||
mov [rsp + 16], rdx ; index
|
||||
|
|
@ -1263,19 +1258,30 @@ ast_build_symtable_for_each:
|
|||
mov [rsp + 72], rdx ; SymEntry.index
|
||||
mov [rsp + 80], rcx ; SymEntry.extra
|
||||
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
lea rdi, [rdi + 40] ; Ctx.symtable
|
||||
mov rdi, [rsp + 8] ; Ctx.symtable
|
||||
lea rsi, [rsp + 32] ; &SymEntry
|
||||
mov rcx, 0 ; cmp_ctx
|
||||
mov rdx, symkey_cmp ; cmp
|
||||
call vec_insert_sorted
|
||||
|
||||
; push scope index onto scope_stack
|
||||
; add parent scope
|
||||
mov byte [rsp + 32], SYM_KEY_PARENT_SCOPE ; SymKey.kind
|
||||
mov rdx, [rsp + 16] ; index
|
||||
mov qword [rsp + 40], rdx ; SymKey.scope_index
|
||||
mov qword [rsp + 48], 0 ; SymKey.span
|
||||
mov qword [rsp + 56], 1 ; SymKey.ident
|
||||
mov qword [rsp + 64], 0 ; SymKey.ident_len
|
||||
|
||||
mov rdx, [rsp + 88] ; parent scope
|
||||
mov [rsp + 72], rdx ; SymEntry.index
|
||||
mov qword [rsp + 80], 0 ; SymEntry.extra
|
||||
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
lea rdi, [rdi + 0] ; Ctx.scope_stack
|
||||
lea rsi, [rsp + 16] ; &index
|
||||
call vec_push
|
||||
|
||||
lea rsi, [rsp + 32] ; &SymEntry
|
||||
mov rcx, 0 ; cmp_ctx
|
||||
mov rdx, symkey_cmp ; cmp
|
||||
call vec_insert_sorted
|
||||
|
||||
jmp .done
|
||||
.var_decl:
|
||||
; insert variable entry
|
||||
|
|
@ -1296,17 +1302,10 @@ ast_build_symtable_for_each:
|
|||
mov [rsp + 72], rdx ; SymEntry.index
|
||||
mov qword [rsp + 80], 0 ; SymEntry.extra
|
||||
|
||||
mov qword [rsp + 40], 0 ; SymKey.scope_index = default
|
||||
lea rdx, [rsp + 40]
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
mov rsi, [rdi + 8] ; Ctx.scope_stack.len()
|
||||
dec rsi
|
||||
call vec_get_or
|
||||
mov rax, [rax] ; current scope index
|
||||
mov [rsp + 40], rax ; SymKey.scope_index = scope_stack.last_or(0)
|
||||
mov rdx, [rsp + 88] ; current scope
|
||||
mov [rsp + 40], rdx ; SymKey.scope_index = default
|
||||
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
lea rdi, [rdi + 40] ; Ctx.symtable
|
||||
lea rsi, [rsp + 32] ; &SymEntry
|
||||
mov rcx, 0 ; cmp_ctx
|
||||
mov rdx, symkey_cmp ; cmp
|
||||
|
|
@ -1332,24 +1331,18 @@ ast_build_symtable_for_each:
|
|||
mov [rsp + 72], rdx ; SymEntry.index
|
||||
mov qword [rsp + 80], 0 ; SymEntry.extra
|
||||
|
||||
mov qword [rsp + 40], 0 ; SymKey.scope_index = default
|
||||
lea rdx, [rsp + 40]
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
mov rsi, [rdi + 8] ; Ctx.scope_stack.len()
|
||||
dec rsi
|
||||
call vec_get_or
|
||||
mov rax, [rax] ; current scope index
|
||||
mov [rsp + 40], rax ; SymKey.scope_index = scope_stack.last_or(0)
|
||||
mov rdx, [rsp + 88] ; current scope
|
||||
mov [rsp + 40], rdx ; SymKey.scope_index = default
|
||||
|
||||
mov rdi, [rsp + 8] ; *Ctx
|
||||
lea rdi, [rdi + 40] ; Ctx.symtable
|
||||
lea rsi, [rsp + 32] ; &SymEntry
|
||||
mov rcx, 0 ; cmp_ctx
|
||||
mov rdx, symkey_cmp ; cmp
|
||||
call vec_insert_sorted
|
||||
jmp .done
|
||||
|
||||
.done:
|
||||
add rsp, 88
|
||||
add rsp, 96
|
||||
pop rbx
|
||||
pop rbp
|
||||
ret
|
||||
|
|
|
|||
|
|
@ -29,27 +29,27 @@ fn main() {
|
|||
eprintln!("Parsed expression ID: {}", expr_id);
|
||||
println!("{:#}", &ast);
|
||||
|
||||
unsafe extern "C" fn visit_node(
|
||||
_this: *mut (),
|
||||
ast: *mut Ast,
|
||||
node_id: u64,
|
||||
scope: u64,
|
||||
) {
|
||||
let ast = unsafe { &*ast };
|
||||
let node = ast.nodes.get(node_id as usize).unwrap();
|
||||
eprintln!("{scope}: Visiting node {node_id}: {node}");
|
||||
}
|
||||
// unsafe extern "C" fn visit_node(
|
||||
// _this: *mut (),
|
||||
// ast: *mut Ast,
|
||||
// node_id: u64,
|
||||
// scope: u64,
|
||||
// ) {
|
||||
// let ast = unsafe { &*ast };
|
||||
// let node = ast.nodes.get(node_id as usize).unwrap();
|
||||
// eprintln!("{scope}: Visiting node {node_id}: {node}");
|
||||
// }
|
||||
|
||||
util::defs::ast_walk_for_each(&mut ast, expr_id, core::ptr::null_mut(), visit_node);
|
||||
// util::defs::ast_walk_for_each(&mut ast, expr_id, core::ptr::null_mut(), visit_node);
|
||||
|
||||
// let mut symtable = core::mem::MaybeUninit::<util::defs::SymbolTable>::uninit();
|
||||
// util::defs::ast_build_symtable(&mut ast, expr_id, &mut symtable);
|
||||
// let symtable = symtable.assume_init();
|
||||
// use util::DisplayedSliceExt;
|
||||
// println!(
|
||||
// "Symbol Table: {:#?}",
|
||||
// symtable.symtable.as_slice().displayed()
|
||||
// );
|
||||
let mut symtable = core::mem::MaybeUninit::<util::defs::SymbolTable>::uninit();
|
||||
util::defs::ast_build_symtable(&mut ast, expr_id, &mut symtable);
|
||||
let symtable = symtable.assume_init();
|
||||
use util::DisplayedSliceExt;
|
||||
println!(
|
||||
"Symbol Table: {:#?}",
|
||||
symtable.symtable.as_slice().displayed()
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -189,7 +189,7 @@ impl std::fmt::Display for AstNode {
|
|||
AST_VALUE_TO_PLACE => {
|
||||
write!(f, "ValueToPlace(value: {})", self.data as usize)
|
||||
}
|
||||
_ => write!(f, "UnknownNode"),
|
||||
kind => write!(f, "UnknownNode(kind: {kind})"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue