From 3526f9d59de429a2795a7a6fbe4f43eb34dfea22 Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 3 Nov 2025 17:04:11 +0100 Subject: [PATCH] fix stack var logic error --- lang/src/codegen.asm | 12 ++++++------ lang/tests/codegen.rs | 3 ++- lang/tests/vec.rs | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lang/src/codegen.asm b/lang/src/codegen.asm index 46b0906..239d991 100644 --- a/lang/src/codegen.asm +++ b/lang/src/codegen.asm @@ -224,7 +224,7 @@ codegen_arg_to_operand: jmp .epilogue .stack_arg: - ; TODO: use these offsets in stack-vars instead of copying into new stack slots + ; TODO: use these offsets in stack_vars instead of copying into new stack slots sub rdi, 6 mov rax, 8 mul rdi @@ -256,7 +256,7 @@ stackvar_cmp: mov rax, [rsi + 0] ; a.index mov rcx, [rdx + 0] ; b.index - cmp rax, 0 + cmp rax, rcx jl .less jg .greater xor rax, rax @@ -493,7 +493,7 @@ codegen_function: ; scratch2 [80..104] ; dirtied-register-bitset [76..80] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15] ; register-bitset [72..76] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15] - ; stack-vars: Vec<(index, offset)> [32..72] + ; stack_vars: Vec<(index, offset)> [32..72] ; max_stack_size: [28..32] ; current_stack_size: [24..28] ; func_idx [16..24] @@ -506,7 +506,7 @@ codegen_function: mov [rsp + 16], rsi ; func_idx mov qword [rsp + 24], 0 ; current_stack_size = 0, max_stack_size = 0 - lea rdi, [rsp + 32] ; stack-vars + lea rdi, [rsp + 32] ; stack_vars mov rsi, 16 ; size_of::<(u64, u64)> mov rdx, 0 ; drop = None mov rcx, 16 ; initial capacity @@ -609,7 +609,7 @@ codegen_function: neg rdx mov [rsp + 112], rdx ; &(_, offset) - lea rdi, [rsp + 32] ; stack-vars + lea rdi, [rsp + 32] ; stack_vars lea rsi, [rsp + 104] ; &scratch: &(index, offset) mov rdx, stackvar_cmp mov rcx, 0 @@ -1330,7 +1330,7 @@ codegen_expr: mov [rsp + 24], rdx ; &(_, offset) mov rdi, [rsp + 8] ; &function_ctx - lea rdi, [rsp + 8] ; stack_vars + lea rdi, [rdi + 8] ; stack_vars lea rsi, [rsp + 16] ; &(index, offset) mov rdx, stackvar_cmp mov rcx, 0 diff --git a/lang/tests/codegen.rs b/lang/tests/codegen.rs index f36a75d..5ffad10 100644 --- a/lang/tests/codegen.rs +++ b/lang/tests/codegen.rs @@ -93,7 +93,8 @@ fn main() { print_ast( b"fn main(a: u32) -> void { - return 5 + &a; +let b: *u32 = &a; + return 5 + *b; }", |ast| unsafe { parse_func(ast) }, ); diff --git a/lang/tests/vec.rs b/lang/tests/vec.rs index 733b57e..ed401ba 100644 --- a/lang/tests/vec.rs +++ b/lang/tests/vec.rs @@ -118,4 +118,18 @@ fn main() { let elements = Box::new([6, 7, 8]); vec.insert_many(2, elements); assert_eq!(vec.as_slice(), &[50, 1, 6, 7, 8, 2, 3, 4, 5]); + + let mut vec = Vec::::new_with(100); + assert_eq!(vec.len(), 0); + vec.insert_sorted(5, cmp); + assert_eq!(vec.len(), 1); + assert_eq!(vec.as_slice(), &[5]); + + vec.insert_sorted(2, cmp); + assert_eq!(vec.len(), 2); + assert_eq!(vec.as_slice(), &[2, 5]); + + vec.insert_sorted(7, cmp); + assert_eq!(vec.len(), 3); + assert_eq!(vec.as_slice(), &[2, 5, 7]); }