From 3821eaa48ca56791cb5c9b85da70dde052d6c7ef Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 10 Nov 2021 18:16:34 +0100 Subject: Add support for accessing procedure parameters --- src/compiler.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'src/compiler.h') 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 compile_def(Object *obj) { context_printf(" ;; --> compile_def\n"); compile_object(obj->var_expr); - ssize_t idx = find_local_index(current_env->locals, obj->var_name); + ssize_t idx = find_var_index(current_env->locals, obj->var_name); context_printf(" pop rax\n"); context_printf(" mov [rbp + %ld], rax\n", 8 * idx); compile_nil(); @@ -525,8 +525,19 @@ compile_def(Object *obj) { void compile_symbol(Object *obj) { context_printf(" ;; --> compile_symbol\n"); - ssize_t idx = find_local_index(current_env->locals, obj); - context_printf(" mov rax, [rbp + %ld]\n", 8 * idx); + ssize_t idx = find_var_index(current_env->locals, obj); + if (idx != -1) { + context_printf(" mov rax, [rbp + %ld]\n", 8 * idx); + context_printf(" push rax\n"); + context_printf(" ;; <-- compile_symbol\n"); + return; + } + idx = find_var_index(current_env->params, obj); + assert(idx != -1 && "unexpected index"); + size_t n_locals = array_size(current_env->locals); + size_t n_params = array_size(current_env->params); + size_t offset = 8 * (n_locals + n_params - idx + 1); + context_printf(" mov rax, [rbp + %ld]\n", offset); context_printf(" push rax\n"); context_printf(" ;; <-- compile_symbol\n"); } -- cgit v1.2.1