summaryrefslogtreecommitdiff
path: root/boot/stage1.s
diff options
context:
space:
mode:
Diffstat (limited to 'boot/stage1.s')
-rw-r--r--boot/stage1.s101
1 files changed, 85 insertions, 16 deletions
diff --git a/boot/stage1.s b/boot/stage1.s
index b39f5bc..efbd521 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -989,6 +989,90 @@ _compile_variable:
addi sp, sp, 48
ret
+.type _compile_type_expression, @function
+_compile_type_expression:
+ # Prologue.
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+.Lcompile_type_expression_type:
+ mv a0, s1
+ addi a1, sp, 12
+ call _tokenize_next
+ mv s1, a0
+ lw t0, 12(sp)
+
+ # Skip the pointer designator and handle the rest of the type.
+ li t1, TOKEN_HAT
+ beq t0, t1, .Lcompile_type_expression_type
+
+ /* DEBUG */
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _write_error
+
+ # Epilogue.
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
+ ret
+
+.type _compile_parameters, @function
+_compile_parameters:
+ # Prologue.
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+ mv a0, s1
+ addi a1, sp, 12
+ call _tokenize_next
+ mv s1, a0 # Skip the opening paren.
+
+ mv a0, s1
+ addi a1, sp, 12
+ call _tokenize_next
+
+ lw t0, 12(sp)
+ li t1, TOKEN_RIGHT_PAREN
+ beq t0, t1, .Lcompile_parameters_end
+ # When this is not the right paren, it is an identifier.
+ mv s1, a0
+
+.Lcompile_parameters_parameter:
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+ mv s1, a0 # Skip the ":" in front of the type.
+
+ call _compile_type_expression
+ # Read the comma between the parameters or a closing paren.
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+
+ lw t0, 0(sp)
+ li t1, TOKEN_COMMA
+ bne t0, t1, .Lcompile_parameters_end
+ # If it is a comma, read the name of the next parameter.
+ addi a1, sp, 12
+ call _tokenize_next
+ mv s1, a0
+
+ j .Lcompile_parameters_parameter
+
+.Lcompile_parameters_end:
+ mv s1, a0 # Skip the closing paren.
+
+ # Epilogue.
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
+ ret
+
.type _compile_procedure, @function
_compile_procedure:
# Prologue.
@@ -1008,6 +1092,7 @@ _compile_procedure:
lw a1, 20(sp)
call _write_procedure_head
+ call _compile_parameters
# Skip all declarations until we find the "begin" keyword, denoting the
# beginning of the procedure body.
.Lcompile_procedure_begin:
@@ -1033,22 +1118,6 @@ _compile_procedure:
call _compile_statements
mv s1, a0 # Skip end.
- /* DEBUG
- sw a0, 8(sp)
- lw a1, 12(sp)
- li a2, TOKEN_END
- sub a1, a1, a2
- seqz a1, a1
- seqz a0, a0
- addi a0, a0, '0'
- addi a1, a1, '0'
- sb a0, 4(sp)
- sb a1, 5(sp)
- addi a0, sp, 4
- li a1, 2
- call _write_error
- lw a0, 8(sp) */
-
# Generate the procedure epilogue with a predefined stack size.
la a0, epilogue
li a1, EPILOGUE_SIZE