From 728549c046b2ff5dddde63bba10e20bfe0e803e7 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 30 Jun 2026 20:27:06 +0200 Subject: [PATCH] refactoring --- stages/lisp0/lisp.asm | 88 ++++++++++++------------------------------- stages/lisp0/lisp.rs | 42 ++++++++++----------- 2 files changed, 45 insertions(+), 85 deletions(-) diff --git a/stages/lisp0/lisp.asm b/stages/lisp0/lisp.asm index 6c616e9..886d108 100644 --- a/stages/lisp0/lisp.asm +++ b/stages/lisp0/lisp.asm @@ -728,38 +728,20 @@ p_str_decompose: call obj_tag_part cmp al, OBJ_STR jne do_panic_abort - sub rsp, 16 + sub rsp, 8 call obj_addr_part - mov edi, dword [rax + 4] ; length + movzx rdi, dword [rax + 4] ; length mov rsi, qword [rax + 8] ; ptr - mov dword [rsp], edi - mov qword [rsp + 8], rsi - mov rdi, 16 - 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], rsi + call make_num + mov rdi, qword [rsp] ; ptr mov qword [rsp], rax ; length number - - mov rdi, 16 - 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 + call make_num + mov rdi, rax ; ptr number mov rsi, qword [rsp] ; length number call cons - add rsp, 16 + add rsp, 8 ret - ;; returns the ascii value of the char p_char_code: @@ -772,16 +754,8 @@ p_char_code: jne do_panic_abort shr rax, 8 and rax, 0xFF - push rax - mov rdi, 16 - mov rsi, 8 - call alloc - mov dword [rax], 1 ; refcount = 1 mov rdi, rax - pop rax - mov qword [rdi + 8], rax ; value = char code - mov rsi, OBJ_NUM - call obj_set_tag + call make_num ret ;; returns a char object representing the ascii value @@ -790,11 +764,7 @@ p_make_char: mov rdi, rax call get_car mov rdi, rax - call obj_tag_part - cmp al, OBJ_NUM - jne do_panic_abort - call obj_addr_part - mov rcx, qword [rax + 8] ; char code + call unwrap_num xor rax, rax mov ah, cl mov al, 0 ; OBJ_BYTE @@ -804,12 +774,14 @@ p_make_char: ;; (syscall num arg1 arg2 arg3) -> syscall(num, arg1, arg2, arg3) p_syscall: push r12 + push r13 call eval_list mov rdi, rax ; r11 = syscall num ; r12 = arg0 xor r11, r11 xor r12, r12 + xor r13, r13 call ._next_arg ; syacall num jnz .do_syscall mov r11, rcx @@ -821,30 +793,24 @@ p_syscall: mov rsi, rcx call ._next_arg ; arg2 jnz .do_syscall - mov rdx, rcx + mov r13, rcx call ._next_arg ; arg3 - jz .do_syscall + jnz .do_syscall mov r10, rcx call ._next_arg ; arg4 - jz .do_syscall + jnz .do_syscall mov r8, rcx call ._next_arg ; arg5 - jz .do_syscall + jnz .do_syscall mov r9, rcx .do_syscall: mov rax, r11 ; syscall num mov rdi, r12 ; arg0 + mov rdx, r13 ; arg2 syscall - push rax - mov rdi, 16 - mov rsi, 8 - call alloc mov rdi, rax - mov dword [rdi], 1 ; refcount = 1 - pop rax - mov qword [rdi + 8], rax ; value = syscall result - mov rsi, OBJ_NUM - call obj_set_tag + call make_num + pop r13 pop r12 ret ;; fn _next_arg(list) -> ($rcx=arg, $rdi=rest) @@ -852,17 +818,11 @@ p_syscall: call is_nil test al, al jnz ._next_arg_done - call get_car - mov rcx, rax ; arg - call get_cdr - mov rdi, rax ; rest - xchg rdi, rcx - 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 + call car_cdr + mov rdi, rax ; arg + call unwrap_num + mov rdi, rdx ; rest + mov rcx, rax ; arg value mov al, 0 test al, al ._next_arg_done: diff --git a/stages/lisp0/lisp.rs b/stages/lisp0/lisp.rs index ba83d2b..2fe7778 100644 --- a/stages/lisp0/lisp.rs +++ b/stages/lisp0/lisp.rs @@ -161,27 +161,27 @@ fn test_parse_list() { println!("env: {:?}\n", env); // let input = b"(let ((x 10) (y 20)) (+ x y))"; - // let input = b"(if () 1 2)"; - // let hello_world = b"(let* ( - // (msg \"hello world\\n\") - // (msg-parts (str-parts msg)) - // (ptr (car msg-parts)) - // (len (cdr msg-parts)) - // (fd 1)) - // (syscall 1 fd ptr len))"; - let math = br#" -(let ( - (a (< 1 2)) - (b (< 2 1)) - (c (+ 1 2 3)) - (d (* 2 3 4)) - (e (/ 10 2)) - (f (% 10 3)) - ) - (print-env) -) -"#; - let mut src = Source::from(&math[..]); + let input = b"(if () 1 2)"; + let hello_world = b"(let* ( + (msg \"hello world\\n\") + (msg-parts (str-parts msg)) + (ptr (car msg-parts)) + (len (cdr msg-parts)) + (fd 1)) + (syscall 1 fd ptr len))"; + // let math = br#" + // (let ( + // (a (< 1 2)) + // (b (< 2 1)) + // (c (+ 1 2 3)) + // (d (* 2 3 4)) + // (e (/ 10 2)) + // (f (% 10 3)) + // ) + // (print-env) + // ) + // "#; + let mut src = Source::from(&hello_world[..]); let sexp = unsafe { parse_next_token(&raw mut src) }; println!("> {:?}", sexp); let result = unsafe { eval(sexp, get_env()) };