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 { ;; struct AstNode {
;; kind: u8, ;; kind: u8,
;; data: *const (), ;; data: *const (),
;; extra: usize,
;; } ;; }
;; ;;
;; struct Argument { ;; struct Argument {
@ -133,8 +134,9 @@ parse_func:
call memcpy call memcpy
mov byte [rsp], AST_FUNCTION ; kind mov byte [rsp], AST_FUNCTION ; kind
mov [rsp + 8], rdi ; data mov [rsp + 8], rdi ; data
mov qword [rsp + 16], 0 ; extra
mov rdi, [rsp + 48] ; Ast mov rdi, [rsp + 48] ; Ast
lea rsi, [rsp] lea rsi, [rsp] ; &AstNode
call vec_push call vec_push
mov rax, [rsp + 48] ; Ast mov rax, [rsp + 48] ; Ast
mov rax, [rdi + 8] ; return Ast.nodes.len() mov rax, [rdi + 8] ; return Ast.nodes.len()
@ -259,7 +261,7 @@ parse_number:
parse_primary_expr: parse_primary_expr:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
sub rsp, 24 sub rsp, 32
mov [rsp], rdi ; Ast mov [rsp], rdi ; Ast
mov dil, TOKEN_NUMBER mov dil, TOKEN_NUMBER
@ -274,12 +276,13 @@ parse_primary_expr:
mov rdi, [rsp] ; Ast mov rdi, [rsp] ; Ast
mov byte [rsp + 8], AST_NUMBER ; kind mov byte [rsp + 8], AST_NUMBER ; kind
mov [rsp + 16], rax ; data mov [rsp + 16], rax ; data
lea rsi, [rsp + 8] ; AstNode mov qword [rsp + 24], 0 ; extra
lea rsi, [rsp + 8] ; &AstNode
call vec_push call vec_push
mov rdi, [rsp] ; Ast mov rdi, [rsp] ; Ast
mov rax, [rdi + 8] ; return Ast.nodes.len() mov rax, [rdi + 8] ; return Ast.nodes.len()
dec rax dec rax
add rsp, 24 add rsp, 32
pop rbp pop rbp
ret ret
.panic: .panic:
@ -352,6 +355,7 @@ parse_binary_expr:
mov byte [rsp + 32], AST_BINARY_OP ; AstNode.kind mov byte [rsp + 32], AST_BINARY_OP ; AstNode.kind
mov [rsp + 40], rax ; AstNode.data mov [rsp + 40], rax ; AstNode.data
mov qword [rsp + 48], 0 ; AstNode.extra
mov rdi, [rsp] ; Ast mov rdi, [rsp] ; Ast
lea rsi, [rsp + 32] ; &AstNode lea rsi, [rsp + 32] ; &AstNode
call vec_push call vec_push
@ -386,6 +390,9 @@ parse_expr:
parse_statement: parse_statement:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
; Ast [24..32]
; AstNode [0..24]
sub rsp, 32 sub rsp, 32
mov [rsp + 24], rdi ; Ast mov [rsp + 24], rdi ; Ast
@ -400,8 +407,9 @@ parse_statement:
call parse_expr call parse_expr
mov byte [rsp], AST_RETURN_STATEMENT ; kind mov byte [rsp], AST_RETURN_STATEMENT ; kind
mov [rsp + 8], rax ; data mov [rsp + 8], rax ; data
mov qword [rsp + 16], 0 ; extra
mov rdi, [rsp + 24] ; Ast mov rdi, [rsp + 24] ; Ast
lea rsi, [rsp] ; AstNode lea rsi, [rsp] ; &AstNode
call vec_push call vec_push
mov rdi, [rsp + 24] ; Ast mov rdi, [rsp + 24] ; Ast
mov rax, [rdi + 8] ; Ast.nodes.len() mov rax, [rdi + 8] ; Ast.nodes.len()
@ -423,13 +431,6 @@ parse_block:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
; start-structs
; struct Block {
; statements: *const u64,
; statements_len: usize,
; }
; end-structs
; Ast: *mut Ast [56..64] ; Ast: *mut Ast [56..64]
; statements: Vec<Statement> [8..56] ; statements: Vec<Statement> [8..56]
; statement: u64 [0..8] ; statement: u64 [0..8]
@ -464,7 +465,8 @@ parse_block:
jmp .loop jmp .loop
.done: .done:
mov rdi, [rsp + 56] ; Ast 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 call vec_push
mov rdi, [rsp + 56] ; Ast mov rdi, [rsp + 56] ; Ast
mov rax, [rdi + 8] ; Ast.nodes.len() mov rax, [rdi + 8] ; Ast.nodes.len()

View file

@ -40,7 +40,7 @@ fn main() {
impl std::fmt::Display for AstNode { impl std::fmt::Display for AstNode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use util::defs::{ 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 { match self.kind as u32 {
AST_NUMBER => { AST_NUMBER => {
@ -74,6 +74,11 @@ impl std::fmt::Display for AstNode {
func.body 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"), _ => write!(f, "UnknownNode"),
} }
} }

View file

@ -70,6 +70,7 @@ pub struct Ast {
pub struct AstNode { pub struct AstNode {
pub kind: u8, pub kind: u8,
pub data: *const (), pub data: *const (),
pub extra: usize,
} }
#[repr(C)] #[repr(C)]
@ -105,11 +106,4 @@ pub struct BinaryExpr {
pub right: u64, pub right: u64,
} }
#[repr(C)]
#[derive(Debug)]
pub struct Block {
pub statements: *const u64,
pub statements_len: usize,
}
use super::vec::Vec; use super::vec::Vec;