From cd04a5a4cae0deb7b5a3a96db2501fa5f56c61cc Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 31 Oct 2025 01:15:28 +0100 Subject: [PATCH] try to redo scopes/symtable with passed down scope --- lang/src/ast.asm | 71 +++++++++++++++++++++-------------------------- lang/tests/ast.rs | 40 +++++++++++++------------- 2 files changed, 52 insertions(+), 59 deletions(-) diff --git a/lang/src/ast.asm b/lang/src/ast.asm index 97176cc..f632b52 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -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:: 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::> 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, ;; symtable: Vec, ;; } ;; #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 diff --git a/lang/tests/ast.rs b/lang/tests/ast.rs index e2a1699..b0c81cf 100644 --- a/lang/tests/ast.rs +++ b/lang/tests/ast.rs @@ -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::::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::::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})"), } } }