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 {
|
;; 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()
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue