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