added support for raw l2 statementrs inside 'fn' decls
This commit is contained in:
27
build/t.asm
27
build/t.asm
@@ -362,7 +362,34 @@ word_rpick:
|
||||
sub r12, 8
|
||||
mov [r12], rax
|
||||
ret
|
||||
word_foo:
|
||||
call word__3er
|
||||
call word__3er
|
||||
; push 1
|
||||
sub r12, 8
|
||||
mov qword [r12], 1
|
||||
call word_puts
|
||||
; push 0
|
||||
sub r12, 8
|
||||
mov qword [r12], 0
|
||||
call word_rpick
|
||||
; push 1
|
||||
sub r12, 8
|
||||
mov qword [r12], 1
|
||||
call word_rpick
|
||||
call word__2b
|
||||
call word_rdrop
|
||||
call word_rdrop
|
||||
ret
|
||||
word_main:
|
||||
; push 3
|
||||
sub r12, 8
|
||||
mov qword [r12], 3
|
||||
; push 2
|
||||
sub r12, 8
|
||||
mov qword [r12], 2
|
||||
call word_foo
|
||||
call word_puts
|
||||
; push 0
|
||||
sub r12, 8
|
||||
mov qword [r12], 0
|
||||
|
||||
@@ -594,18 +594,18 @@ word_test_2dif:
|
||||
mov rax, [r12]
|
||||
add r12, 8
|
||||
test rax, rax
|
||||
jz L_if_false_34
|
||||
jz L_if_false_40
|
||||
; push 111
|
||||
sub r12, 8
|
||||
mov qword [r12], 111
|
||||
call word_puts
|
||||
jmp L_if_end_35
|
||||
L_if_false_34:
|
||||
jmp L_if_end_41
|
||||
L_if_false_40:
|
||||
; push 222
|
||||
sub r12, 8
|
||||
mov qword [r12], 222
|
||||
call word_puts
|
||||
L_if_end_35:
|
||||
L_if_end_41:
|
||||
ret
|
||||
word_test_2delse_2dif:
|
||||
; push 2
|
||||
@@ -619,13 +619,13 @@ word_test_2delse_2dif:
|
||||
mov rax, [r12]
|
||||
add r12, 8
|
||||
test rax, rax
|
||||
jz L_if_false_36
|
||||
jz L_if_false_42
|
||||
; push 50
|
||||
sub r12, 8
|
||||
mov qword [r12], 50
|
||||
call word_puts
|
||||
jmp L_if_end_37
|
||||
L_if_false_36:
|
||||
jmp L_if_end_43
|
||||
L_if_false_42:
|
||||
call word_dup
|
||||
; push 2
|
||||
sub r12, 8
|
||||
@@ -634,19 +634,19 @@ L_if_false_36:
|
||||
mov rax, [r12]
|
||||
add r12, 8
|
||||
test rax, rax
|
||||
jz L_if_false_38
|
||||
jz L_if_false_44
|
||||
; push 60
|
||||
sub r12, 8
|
||||
mov qword [r12], 60
|
||||
call word_puts
|
||||
jmp L_if_end_39
|
||||
L_if_false_38:
|
||||
jmp L_if_end_45
|
||||
L_if_false_44:
|
||||
; push 70
|
||||
sub r12, 8
|
||||
mov qword [r12], 70
|
||||
call word_puts
|
||||
L_if_end_39:
|
||||
L_if_end_37:
|
||||
L_if_end_45:
|
||||
L_if_end_43:
|
||||
call word_drop
|
||||
ret
|
||||
word_test_2dfor:
|
||||
@@ -659,10 +659,10 @@ word_test_2dfor:
|
||||
mov rax, [r12]
|
||||
add r12, 8
|
||||
cmp rax, 0
|
||||
jle L_for_end_41
|
||||
jle L_for_end_47
|
||||
sub r13, 8
|
||||
mov [r13], rax
|
||||
L_for_loop_40:
|
||||
L_for_loop_46:
|
||||
; push 1
|
||||
sub r12, 8
|
||||
mov qword [r12], 1
|
||||
@@ -670,9 +670,9 @@ L_for_loop_40:
|
||||
mov rax, [r13]
|
||||
dec rax
|
||||
mov [r13], rax
|
||||
jg L_for_loop_40
|
||||
jg L_for_loop_46
|
||||
add r13, 8
|
||||
L_for_end_41:
|
||||
L_for_end_47:
|
||||
call word_puts
|
||||
ret
|
||||
word_test_2dfor_2dzero:
|
||||
@@ -685,17 +685,17 @@ word_test_2dfor_2dzero:
|
||||
mov rax, [r12]
|
||||
add r12, 8
|
||||
cmp rax, 0
|
||||
jle L_for_end_43
|
||||
jle L_for_end_49
|
||||
sub r13, 8
|
||||
mov [r13], rax
|
||||
L_for_loop_42:
|
||||
L_for_loop_48:
|
||||
call word_drop
|
||||
mov rax, [r13]
|
||||
dec rax
|
||||
mov [r13], rax
|
||||
jg L_for_loop_42
|
||||
jg L_for_loop_48
|
||||
add r13, 8
|
||||
L_for_end_43:
|
||||
L_for_end_49:
|
||||
call word_puts
|
||||
ret
|
||||
word_test_2dstruct:
|
||||
|
||||
BIN
build/test.o
BIN
build/test.o
Binary file not shown.
43
fn.sl
43
fn.sl
@@ -128,6 +128,46 @@ compile-only
|
||||
;
|
||||
compile-only
|
||||
|
||||
|
||||
: fn-filter-raw-body # bodyLexemes -- tokens
|
||||
list-new swap # out body
|
||||
begin
|
||||
dup list-empty? if
|
||||
drop # out
|
||||
exit
|
||||
then
|
||||
list-pop-front # out body' tok
|
||||
swap >r # out tok (r: body')
|
||||
dup "return" string= if
|
||||
drop
|
||||
r>
|
||||
continue
|
||||
then
|
||||
dup ";" string= if
|
||||
drop
|
||||
r>
|
||||
continue
|
||||
then
|
||||
list-append # out'
|
||||
r> # out' body'
|
||||
continue
|
||||
again
|
||||
;
|
||||
compile-only
|
||||
|
||||
|
||||
: fn-body->tokens # bodyLexemes -- tokens
|
||||
dup list-length 0 == if "empty function body" parse-error then
|
||||
dup 0 list-get token-lexeme "return" string= if
|
||||
fn-validate-body # expr
|
||||
shunt # postfix
|
||||
exit
|
||||
then
|
||||
fn-filter-raw-body
|
||||
dup list-length 0 == if "empty function body" parse-error then
|
||||
;
|
||||
compile-only
|
||||
|
||||
: fn-emit-prologue # params out -- params out
|
||||
over list-length # params out n
|
||||
begin
|
||||
@@ -322,8 +362,7 @@ compile-only
|
||||
fn-collect-body # params bodyTokens
|
||||
swap >r # bodyTokens (r: params)
|
||||
fn-lexemes-from-tokens # lexemes
|
||||
fn-validate-body # expr
|
||||
shunt # postfix
|
||||
fn-body->tokens # tokens
|
||||
r> # postfix params
|
||||
fn-build-body # body
|
||||
r> drop # drop name string
|
||||
|
||||
Reference in New Issue
Block a user