From 168310033d24d00841c20de34fa3bd61e09d792c Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 8 Sep 2025 16:20:41 +0100 Subject: [PATCH] lang: codegen: implement variable declaration/resolution support in block generator --- lang/codegen/block.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lang/codegen/block.c b/lang/codegen/block.c index 7f6607e..a9af1e3 100644 --- a/lang/codegen/block.c +++ b/lang/codegen/block.c @@ -7,6 +7,7 @@ struct block_codegen_state { struct code_generator_state s_base; struct code_generator_scope *s_scope; + struct codegen_var_map s_vars; }; static struct code_generator_result gen_expr( @@ -63,6 +64,8 @@ static enum ivy_status state_init( uintptr_t argv, void *argp) { struct block_codegen_state *block = (struct block_codegen_state *)state; + codegen_var_map_init(&block->s_vars); + return IVY_OK; } @@ -73,6 +76,31 @@ static enum ivy_status state_fini( return IVY_OK; } +static enum ivy_status define_var( + struct ivy_codegen *gen, struct code_generator_state *state, + const char *ident, const struct codegen_var *var) +{ + struct block_codegen_state *block = (struct block_codegen_state *)state; + return codegen_var_map_put(&block->s_vars, ident, var); +} + +static enum ivy_status resolve_var( + struct ivy_codegen *gen, struct code_generator_state *state, + const char *ident, struct codegen_var *var) +{ + struct block_codegen_state *block = (struct block_codegen_state *)state; + struct codegen_var *result = NULL; + enum ivy_status status + = codegen_var_map_get(&block->s_vars, ident, &result); + + if (status != IVY_OK) { + return status; + } + + memcpy(var, result, sizeof *var); + return IVY_OK; +} + struct code_generator block_generator = { .g_type = CODE_GENERATOR_BLOCK, .g_state_size = sizeof(struct block_codegen_state), @@ -82,4 +110,6 @@ struct code_generator block_generator = { NODE_CODEGEN(RETURN, gen_return), }, .g_expr_generator = gen_expr, + .g_define_var = define_var, + .g_resolve_var = resolve_var, };