lang: codegen: implement variable declaration/resolution support in block generator
This commit is contained in:
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user