try to redo scopes/symtable with passed down scope

This commit is contained in:
janis 2025-10-31 01:15:28 +01:00
parent cd5b714051
commit cd04a5a4ca
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 52 additions and 59 deletions

View file

@ -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

View file

@ -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})"),
}
}
}