refactoring

This commit is contained in:
janis 2026-06-30 20:27:06 +02:00
parent 6eeeca1266
commit 728549c046
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 45 additions and 85 deletions

View file

@ -728,38 +728,20 @@ p_str_decompose:
call obj_tag_part call obj_tag_part
cmp al, OBJ_STR cmp al, OBJ_STR
jne do_panic_abort jne do_panic_abort
sub rsp, 16 sub rsp, 8
call obj_addr_part call obj_addr_part
mov edi, dword [rax + 4] ; length movzx rdi, dword [rax + 4] ; length
mov rsi, qword [rax + 8] ; ptr mov rsi, qword [rax + 8] ; ptr
mov dword [rsp], edi mov qword [rsp], rsi
mov qword [rsp + 8], rsi call make_num
mov rdi, 16 mov rdi, qword [rsp] ; ptr
mov rsi, 8
call alloc
mov rdi, rax
mov dword [rdi], 1 ; refcount = 1
movzx rax, dword [rsp] ; length
mov qword [rdi + 8], rax ; value = length
mov rsi, OBJ_NUM
call obj_set_tag
mov qword [rsp], rax ; length number mov qword [rsp], rax ; length number
call make_num
mov rdi, 16 mov rdi, rax ; ptr number
mov rsi, 8
call alloc
mov rdi, rax
mov dword [rdi], 1 ; refcount = 1
mov rax, qword [rsp + 8] ; ptr
mov qword [rdi + 8], rax ; value = ptr
mov rsi, OBJ_NUM
call obj_set_tag
mov rdi, rax
mov rsi, qword [rsp] ; length number mov rsi, qword [rsp] ; length number
call cons call cons
add rsp, 16 add rsp, 8
ret ret
;; returns the ascii value of the char ;; returns the ascii value of the char
p_char_code: p_char_code:
@ -772,16 +754,8 @@ p_char_code:
jne do_panic_abort jne do_panic_abort
shr rax, 8 shr rax, 8
and rax, 0xFF and rax, 0xFF
push rax
mov rdi, 16
mov rsi, 8
call alloc
mov dword [rax], 1 ; refcount = 1
mov rdi, rax mov rdi, rax
pop rax call make_num
mov qword [rdi + 8], rax ; value = char code
mov rsi, OBJ_NUM
call obj_set_tag
ret ret
;; returns a char object representing the ascii value ;; returns a char object representing the ascii value
@ -790,11 +764,7 @@ p_make_char:
mov rdi, rax mov rdi, rax
call get_car call get_car
mov rdi, rax mov rdi, rax
call obj_tag_part call unwrap_num
cmp al, OBJ_NUM
jne do_panic_abort
call obj_addr_part
mov rcx, qword [rax + 8] ; char code
xor rax, rax xor rax, rax
mov ah, cl mov ah, cl
mov al, 0 ; OBJ_BYTE mov al, 0 ; OBJ_BYTE
@ -804,12 +774,14 @@ p_make_char:
;; (syscall num arg1 arg2 arg3) -> syscall(num, arg1, arg2, arg3) ;; (syscall num arg1 arg2 arg3) -> syscall(num, arg1, arg2, arg3)
p_syscall: p_syscall:
push r12 push r12
push r13
call eval_list call eval_list
mov rdi, rax mov rdi, rax
; r11 = syscall num ; r11 = syscall num
; r12 = arg0 ; r12 = arg0
xor r11, r11 xor r11, r11
xor r12, r12 xor r12, r12
xor r13, r13
call ._next_arg ; syacall num call ._next_arg ; syacall num
jnz .do_syscall jnz .do_syscall
mov r11, rcx mov r11, rcx
@ -821,30 +793,24 @@ p_syscall:
mov rsi, rcx mov rsi, rcx
call ._next_arg ; arg2 call ._next_arg ; arg2
jnz .do_syscall jnz .do_syscall
mov rdx, rcx mov r13, rcx
call ._next_arg ; arg3 call ._next_arg ; arg3
jz .do_syscall jnz .do_syscall
mov r10, rcx mov r10, rcx
call ._next_arg ; arg4 call ._next_arg ; arg4
jz .do_syscall jnz .do_syscall
mov r8, rcx mov r8, rcx
call ._next_arg ; arg5 call ._next_arg ; arg5
jz .do_syscall jnz .do_syscall
mov r9, rcx mov r9, rcx
.do_syscall: .do_syscall:
mov rax, r11 ; syscall num mov rax, r11 ; syscall num
mov rdi, r12 ; arg0 mov rdi, r12 ; arg0
mov rdx, r13 ; arg2
syscall syscall
push rax
mov rdi, 16
mov rsi, 8
call alloc
mov rdi, rax mov rdi, rax
mov dword [rdi], 1 ; refcount = 1 call make_num
pop rax pop r13
mov qword [rdi + 8], rax ; value = syscall result
mov rsi, OBJ_NUM
call obj_set_tag
pop r12 pop r12
ret ret
;; fn _next_arg(list) -> ($rcx=arg, $rdi=rest) ;; fn _next_arg(list) -> ($rcx=arg, $rdi=rest)
@ -852,17 +818,11 @@ p_syscall:
call is_nil call is_nil
test al, al test al, al
jnz ._next_arg_done jnz ._next_arg_done
call get_car call car_cdr
mov rcx, rax ; arg mov rdi, rax ; arg
call get_cdr call unwrap_num
mov rdi, rax ; rest mov rdi, rdx ; rest
xchg rdi, rcx mov rcx, rax ; arg value
call obj_tag_part
cmp al, OBJ_NUM
jne do_panic_abort
call obj_addr_part
mov rdi, qword [rax + 8] ; arg value
xchg rdi, rcx
mov al, 0 mov al, 0
test al, al test al, al
._next_arg_done: ._next_arg_done:

View file

@ -161,27 +161,27 @@ fn test_parse_list() {
println!("env: {:?}\n", env); println!("env: {:?}\n", env);
// let input = b"(let ((x 10) (y 20)) (+ x y))"; // let input = b"(let ((x 10) (y 20)) (+ x y))";
// let input = b"(if () 1 2)"; let input = b"(if () 1 2)";
// let hello_world = b"(let* ( let hello_world = b"(let* (
// (msg \"hello world\\n\") (msg \"hello world\\n\")
// (msg-parts (str-parts msg)) (msg-parts (str-parts msg))
// (ptr (car msg-parts)) (ptr (car msg-parts))
// (len (cdr msg-parts)) (len (cdr msg-parts))
// (fd 1)) (fd 1))
// (syscall 1 fd ptr len))"; (syscall 1 fd ptr len))";
let math = br#" // let math = br#"
(let ( // (let (
(a (< 1 2)) // (a (< 1 2))
(b (< 2 1)) // (b (< 2 1))
(c (+ 1 2 3)) // (c (+ 1 2 3))
(d (* 2 3 4)) // (d (* 2 3 4))
(e (/ 10 2)) // (e (/ 10 2))
(f (% 10 3)) // (f (% 10 3))
) // )
(print-env) // (print-env)
) // )
"#; // "#;
let mut src = Source::from(&math[..]); let mut src = Source::from(&hello_world[..]);
let sexp = unsafe { parse_next_token(&raw mut src) }; let sexp = unsafe { parse_next_token(&raw mut src) };
println!("> {:?}", sexp); println!("> {:?}", sexp);
let result = unsafe { eval(sexp, get_env()) }; let result = unsafe { eval(sexp, get_env()) };