From c609fe4ec601f201643ccad067dc78256ca39f47 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 29 Oct 2025 23:31:52 +0100 Subject: [PATCH] fix blocks, increase AstNode by 1 qword --- lang/src/ast.asm | 38 ++++++++++++++++++++------------------ lang/tests/ast.rs | 7 ++++++- lang/tests/shared/defs.rs | 8 +------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/lang/src/ast.asm b/lang/src/ast.asm index 89e23fc..6d9f797 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -58,6 +58,7 @@ global parse_block ;; struct AstNode { ;; kind: u8, ;; data: *const (), +;; extra: usize, ;; } ;; ;; struct Argument { @@ -132,12 +133,13 @@ parse_func: mov rdx, 48 call memcpy mov byte [rsp], AST_FUNCTION ; kind - mov [rsp + 8], rdi ; data - mov rdi, [rsp + 48] ; Ast - lea rsi, [rsp] + mov [rsp + 8], rdi ; data + mov qword [rsp + 16], 0 ; extra + mov rdi, [rsp + 48] ; Ast + lea rsi, [rsp] ; &AstNode call vec_push mov rax, [rsp + 48] ; Ast - mov rax, [rdi + 8] ; return Ast.nodes.len() + mov rax, [rdi + 8] ; return Ast.nodes.len() dec rax add rsp, 48 pop rdi @@ -259,7 +261,7 @@ parse_number: parse_primary_expr: push rbp mov rbp, rsp - sub rsp, 24 + sub rsp, 32 mov [rsp], rdi ; Ast mov dil, TOKEN_NUMBER @@ -274,12 +276,13 @@ parse_primary_expr: mov rdi, [rsp] ; Ast mov byte [rsp + 8], AST_NUMBER ; kind mov [rsp + 16], rax ; data - lea rsi, [rsp + 8] ; AstNode + mov qword [rsp + 24], 0 ; extra + lea rsi, [rsp + 8] ; &AstNode call vec_push mov rdi, [rsp] ; Ast mov rax, [rdi + 8] ; return Ast.nodes.len() dec rax - add rsp, 24 + add rsp, 32 pop rbp ret .panic: @@ -352,6 +355,7 @@ parse_binary_expr: mov byte [rsp + 32], AST_BINARY_OP ; AstNode.kind mov [rsp + 40], rax ; AstNode.data + mov qword [rsp + 48], 0 ; AstNode.extra mov rdi, [rsp] ; Ast lea rsi, [rsp + 32] ; &AstNode call vec_push @@ -386,6 +390,9 @@ parse_expr: parse_statement: push rbp mov rbp, rsp + + ; Ast [24..32] + ; AstNode [0..24] sub rsp, 32 mov [rsp + 24], rdi ; Ast @@ -400,8 +407,9 @@ parse_statement: call parse_expr mov byte [rsp], AST_RETURN_STATEMENT ; kind mov [rsp + 8], rax ; data + mov qword [rsp + 16], 0 ; extra mov rdi, [rsp + 24] ; Ast - lea rsi, [rsp] ; AstNode + lea rsi, [rsp] ; &AstNode call vec_push mov rdi, [rsp + 24] ; Ast mov rax, [rdi + 8] ; Ast.nodes.len() @@ -423,13 +431,6 @@ parse_block: push rbp mov rbp, rsp - ; start-structs - ; struct Block { - ; statements: *const u64, - ; statements_len: usize, - ; } - ; end-structs - ; Ast: *mut Ast [56..64] ; statements: Vec [8..56] ; statement: u64 [0..8] @@ -457,14 +458,15 @@ parse_block: jnz .done mov rdi, [rsp + 56] ; Ast call parse_statement - lea rdi, [rsp + 8] ; vec - mov [rsp], rax ; statement + lea rdi, [rsp + 8] ; vec + mov [rsp], rax ; statement lea rsi, [rsp] call vec_push jmp .loop .done: mov rdi, [rsp + 56] ; Ast - lea rsi, [rsp + 8] ; statements vec-slice + mov qword [rsp], AST_BLOCK ; kind + lea rsi, [rsp] ; &AstNode call vec_push mov rdi, [rsp + 56] ; Ast mov rax, [rdi + 8] ; Ast.nodes.len() diff --git a/lang/tests/ast.rs b/lang/tests/ast.rs index 2883b8e..02f9183 100644 --- a/lang/tests/ast.rs +++ b/lang/tests/ast.rs @@ -40,7 +40,7 @@ fn main() { impl std::fmt::Display for AstNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use util::defs::{ - BinaryExpr, AST_BINARY_OP, AST_FUNCTION, AST_NUMBER, AST_RETURN_STATEMENT, + BinaryExpr, AST_BINARY_OP, AST_BLOCK, AST_FUNCTION, AST_NUMBER, AST_RETURN_STATEMENT, }; match self.kind as u32 { AST_NUMBER => { @@ -74,6 +74,11 @@ impl std::fmt::Display for AstNode { func.body ) } + AST_BLOCK => { + write!(f, "Block(statements: {:?})", unsafe { + std::slice::from_raw_parts(self.data.cast::(), self.extra as usize) + }) + } _ => write!(f, "UnknownNode"), } } diff --git a/lang/tests/shared/defs.rs b/lang/tests/shared/defs.rs index 930fbb2..bd45637 100644 --- a/lang/tests/shared/defs.rs +++ b/lang/tests/shared/defs.rs @@ -70,6 +70,7 @@ pub struct Ast { pub struct AstNode { pub kind: u8, pub data: *const (), + pub extra: usize, } #[repr(C)] @@ -105,11 +106,4 @@ pub struct BinaryExpr { pub right: u64, } -#[repr(C)] -#[derive(Debug)] -pub struct Block { - pub statements: *const u64, - pub statements_len: usize, -} - use super::vec::Vec;