From 928be75fafa5cef4db49749e01f9c500a72d0dc3 Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 30 Oct 2025 23:00:36 +0100 Subject: [PATCH] sort symkey by ident before span --- lang/src/ast.asm | 31 ++++++++++++++++++++++++++----- lang/tests/ast.rs | 36 ++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/lang/src/ast.asm b/lang/src/ast.asm index b8974f7..0bd8166 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -1043,21 +1043,21 @@ symkey_cmp: mov rbp, rsp push rbx + sub rsp, 16 + mov [rsp], rsi + mov [rsp + 8], rdx + mov al, byte [rsi] ; a.kind mov bl, byte [rdx] ; b.kind cmp al, bl jl .a_less jg .a_greater + mov rax, [rsi + 8] ; a.scope_index mov rbx, [rdx + 8] ; b.scope_index cmp rax, rbx jl .a_less jg .a_greater - mov rax, [rsi + 16] ; a.span - mov rbx, [rdx + 16] ; b.span - cmp rax, rbx - jl .a_less - jg .a_greater mov rdi, [rsi + 24] ; a.ident mov rsi, [rsi + 32] ; a.ident_len @@ -1067,6 +1067,15 @@ symkey_cmp: cmp rax, 0 jl .a_less jg .a_greater + + mov rsi, [rsp] + mov rdx, [rsp + 8] + mov rax, [rsi + 16] ; a.span + mov rbx, [rdx + 16] ; b.span + cmp rax, rbx + jl .a_less + jg .a_greater + xor rax, rax jmp .epilogue .a_less: @@ -1075,6 +1084,7 @@ symkey_cmp: .a_greater: mov rax, 1 .epilogue: + add rsp, 16 pop rbx pop rbp ret @@ -1468,6 +1478,17 @@ ast_walk_for_each: pop rbp ret +;; rdi: Ctx +;; rsi: Ast +;; rdx: node_index +ast_resolve_var_refs_for_each: + push rbp + mov rbp, rsp + +.epilogue: + pop rbp + ret + ;; rdi: Ast ;; define-fn: fn ast_resolve_var_refs(ast: *mut Ast) ast_resolve_var_refs: diff --git a/lang/tests/ast.rs b/lang/tests/ast.rs index 0b42a40..a0af80f 100644 --- a/lang/tests/ast.rs +++ b/lang/tests/ast.rs @@ -49,31 +49,31 @@ fn main() { } print_ast(b"3 + 4", |ast| unsafe { parse_expr(ast) }); - // print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe { - // parse_func(ast) - // }); - // print_ast(b"fn main() -> void { return (1 + (2)); }", |ast| unsafe { - // parse_func(ast) - // }); - // print_ast( - // b"fn main() -> void { return (1 + (2 * 3)) / 4; }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe { - // parse_func(ast) - // }); + print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe { + parse_func(ast) + }); + print_ast(b"fn main() -> void { return (1 + (2)); }", |ast| unsafe { + parse_func(ast) + }); + print_ast( + b"fn main() -> void { return (1 + (2 * 3)) / 4; }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe { + parse_func(ast) + }); - // print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe { - // parse_func(ast) - // }); + print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe { + parse_func(ast) + }); print_ast( b"fn main(a: u32) -> void { let x: u32 = a + 4; }", |ast| unsafe { parse_func(ast) }, ); print_ast( b"fn main(a: u32) -> void { -let x: u32 = a + 4; -let y: *u32 = &x; +let y: u32 = a + 4; +let y: *u32 = &y; return *y; }", |ast| unsafe { parse_func(ast) },