fix blocks, increase AstNode by 1 qword
This commit is contained in:
parent
d2597d2de7
commit
c609fe4ec6
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue