diff options
Diffstat (limited to 'boot/stage1.s')
| -rw-r--r-- | boot/stage1.s | 101 |
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 |
