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