diff options
author | Bad Diode <bd@badd10de.dev> | 2021-11-10 18:16:34 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-11-10 18:16:34 +0100 |
commit | 3821eaa48ca56791cb5c9b85da70dde052d6c7ef (patch) | |
tree | 29ffb560968006159f4a533a76f1d62811af8fdf /src/compiler.h | |
parent | 45920c8340d2aa5a3c40a3c8aad519fa998bb50b (diff) | |
download | bdl-3821eaa48ca56791cb5c9b85da70dde052d6c7ef.tar.gz bdl-3821eaa48ca56791cb5c9b85da70dde052d6c7ef.zip |
Add support for accessing procedure parameters
Diffstat (limited to 'src/compiler.h')
-rw-r--r-- | src/compiler.h | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/compiler.h b/src/compiler.h index 14c6954..2a44220 100644 --- a/src/compiler.h +++ b/src/compiler.h | |||
@@ -515,7 +515,7 @@ void | |||
515 | compile_def(Object *obj) { | 515 | compile_def(Object *obj) { |
516 | context_printf(" ;; --> compile_def\n"); | 516 | context_printf(" ;; --> compile_def\n"); |
517 | compile_object(obj->var_expr); | 517 | compile_object(obj->var_expr); |
518 | ssize_t idx = find_local_index(current_env->locals, obj->var_name); | 518 | ssize_t idx = find_var_index(current_env->locals, obj->var_name); |
519 | context_printf(" pop rax\n"); | 519 | context_printf(" pop rax\n"); |
520 | context_printf(" mov [rbp + %ld], rax\n", 8 * idx); | 520 | context_printf(" mov [rbp + %ld], rax\n", 8 * idx); |
521 | compile_nil(); | 521 | compile_nil(); |
@@ -525,8 +525,19 @@ compile_def(Object *obj) { | |||
525 | void | 525 | void |
526 | compile_symbol(Object *obj) { | 526 | compile_symbol(Object *obj) { |
527 | context_printf(" ;; --> compile_symbol\n"); | 527 | context_printf(" ;; --> compile_symbol\n"); |
528 | ssize_t idx = find_local_index(current_env->locals, obj); | 528 | ssize_t idx = find_var_index(current_env->locals, obj); |
529 | context_printf(" mov rax, [rbp + %ld]\n", 8 * idx); | 529 | if (idx != -1) { |
530 | context_printf(" mov rax, [rbp + %ld]\n", 8 * idx); | ||
531 | context_printf(" push rax\n"); | ||
532 | context_printf(" ;; <-- compile_symbol\n"); | ||
533 | return; | ||
534 | } | ||
535 | idx = find_var_index(current_env->params, obj); | ||
536 | assert(idx != -1 && "unexpected index"); | ||
537 | size_t n_locals = array_size(current_env->locals); | ||
538 | size_t n_params = array_size(current_env->params); | ||
539 | size_t offset = 8 * (n_locals + n_params - idx + 1); | ||
540 | context_printf(" mov rax, [rbp + %ld]\n", offset); | ||
530 | context_printf(" push rax\n"); | 541 | context_printf(" push rax\n"); |
531 | context_printf(" ;; <-- compile_symbol\n"); | 542 | context_printf(" ;; <-- compile_symbol\n"); |
532 | } | 543 | } |