Compare commits

..

No commits in common. "e79af0192535d7f2a9513bd2f700c873f6e57f6f" and "56354237c63066ef40ecfc5606e0ac5266e55eeb" have entirely different histories.

3 changed files with 166 additions and 393 deletions

File diff suppressed because it is too large Load diff

View file

@ -29,31 +29,22 @@ 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 (), ast: *mut Ast, node_id: u64) {
// _this: *mut (),
// ast: *mut Ast,
// node_id: 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!("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 mut 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()
); );
util::defs::ast_resolve_var_refs(&mut ast, &mut symtable, expr_id);
println!("{:#}", &ast);
}; };
} }
@ -75,14 +66,14 @@ fn main() {
// print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe { // print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe {
// parse_func(ast) // parse_func(ast)
// }); // });
// print_ast( print_ast(
// b"fn main(a: u32) -> void { let x: u32 = a + 4; }", b"fn main(a: u32) -> void { let x: u32 = a + 4; }",
// |ast| unsafe { parse_func(ast) }, |ast| unsafe { parse_func(ast) },
// ); );
print_ast( print_ast(
b"fn main(a: u32) -> void { b"fn main(a: u32) -> void {
let y: u32 = a + 4; let x: u32 = a + 4;
let y: *u32 = &y; let y: *u32 = &x;
return *y; return *y;
}", }",
|ast| unsafe { parse_func(ast) }, |ast| unsafe { parse_func(ast) },
@ -119,7 +110,7 @@ impl std::fmt::Display for AstNode {
} }
AST_VAR_REF => { AST_VAR_REF => {
let var_ref = unsafe { self.data.cast::<util::defs::AstVarRef>().read() }; let var_ref = unsafe { self.data.cast::<util::defs::AstVarRef>().read() };
if var_ref.resolved != u64::MAX { if var_ref.resolved != 0 {
write!(f, "VarRef({})", var_ref.resolved) write!(f, "VarRef({})", var_ref.resolved)
} else { } else {
write!(f, "VarRef(name: {:?})", unsafe { write!(f, "VarRef(name: {:?})", unsafe {
@ -193,7 +184,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)
} }
kind => write!(f, "UnknownNode(kind: {kind})"), _ => write!(f, "UnknownNode"),
} }
} }
} }

View file

@ -15,8 +15,8 @@ unsafe extern "C" {
pub unsafe fn ast_parse_let(ast: *mut Ast) -> (u64, bool); pub unsafe fn ast_parse_let(ast: *mut Ast) -> (u64, bool);
pub unsafe fn symkey_cmp(a: *const SymKey, b: *const SymKey) -> i32; pub unsafe fn symkey_cmp(a: *const SymKey, b: *const SymKey) -> i32;
pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit<SymbolTable>); pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit<SymbolTable>);
pub unsafe fn ast_walk_for_each(ast: *mut Ast, start_index: u64, ctx: *mut (), for_each: unsafe extern "C" fn(ctx: *mut (), *mut Ast, node_index: u64, scope: u64)); pub unsafe fn ast_walk_for_each(ast: *mut Ast, start_index: u64, ctx: *mut (), for_each: unsafe extern "C" fn(ctx: *mut (), *mut Ast, node_index: u64));
pub unsafe fn ast_resolve_var_refs(ast: *mut Ast, ctx: *mut SymbolTable, root_index: u64); pub unsafe fn ast_resolve_var_refs(ast: *mut Ast);
} }
pub const AST_FUNCTION: u8 = 1; pub const AST_FUNCTION: u8 = 1;
@ -106,7 +106,6 @@ pub struct AstNode {
pub kind: u8, pub kind: u8,
pub data: *const (), pub data: *const (),
pub extra: usize, pub extra: usize,
pub span: u64,
} }
#[repr(C)] #[repr(C)]