refactoring
This commit is contained in:
parent
6eeeca1266
commit
728549c046
|
|
@ -728,39 +728,21 @@ 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:
|
||||
call eval_list
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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()) };
|
||||
|
|
|
|||
Loading…
Reference in a new issue