lang: codegen: implement variable declaration/resolution support in block generator

This commit is contained in:
2025-09-08 16:20:41 +01:00
parent 6844f498c5
commit 168310033d

View File

@@ -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,
};