diff --git a/a.out b/a.out index 5ea17b9..b3b2912 100755 Binary files a/a.out and b/a.out differ diff --git a/build/t.asm b/build/t.asm index f74035a..7e46e8e 100644 --- a/build/t.asm +++ b/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 diff --git a/build/t.o b/build/t.o index c1e8527..0ea6b00 100644 Binary files a/build/t.o and b/build/t.o differ diff --git a/build/test.asm b/build/test.asm index d8efd13..90ffe3c 100644 --- a/build/test.asm +++ b/build/test.asm @@ -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: diff --git a/build/test.o b/build/test.o index 8ab8ab8..bdfbac0 100644 Binary files a/build/test.o and b/build/test.o differ diff --git a/fn.sl b/fn.sl index b2914a6..9c011a3 100644 --- a/fn.sl +++ b/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 diff --git a/t.sl b/t.sl index 4833ba2..7eee533 100644 --- a/t.sl +++ b/t.sl @@ -1,13 +1,15 @@ import stdlib.sl import fn.sl -fn foo(int a){ - return a + 1; +fn foo(int a, int b){ + 1 + puts + return a b +; } : main extend-syntax - foo(1) + foo(3, 2) puts 0 ; \ No newline at end of file