fix blocks, increase AstNode by 1 qword

This commit is contained in:
janis 2025-10-29 23:31:52 +01:00
parent d2597d2de7
commit c609fe4ec6
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
3 changed files with 27 additions and 26 deletions

View file

@ -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<Statement> [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()

View file

@ -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::<u64>(), self.extra as usize)
})
}
_ => write!(f, "UnknownNode"),
}
}

View file

@ -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;