aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-10 18:16:34 +0100
committerBad Diode <bd@badd10de.dev>2021-11-10 18:16:34 +0100
commit3821eaa48ca56791cb5c9b85da70dde052d6c7ef (patch)
tree29ffb560968006159f4a533a76f1d62811af8fdf /src/compiler.h
parent45920c8340d2aa5a3c40a3c8aad519fa998bb50b (diff)
downloadbdl-3821eaa48ca56791cb5c9b85da70dde052d6c7ef.tar.gz
bdl-3821eaa48ca56791cb5c9b85da70dde052d6c7ef.zip
Add support for accessing procedure parameters
Diffstat (limited to 'src/compiler.h')
-rw-r--r--src/compiler.h17
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
515compile_def(Object *obj) { 515compile_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) {
525void 525void
526compile_symbol(Object *obj) { 526compile_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}