lang: codegen: implement message-send code generation and global var references

This commit is contained in:
2025-04-17 21:44:38 +01:00
parent a4504c0507
commit 7b8d77a264
7 changed files with 359 additions and 55 deletions

View File

@@ -27,14 +27,27 @@ static struct code_generator_result gen_var(
return CODEGEN_RESULT_OK(0);
}
static struct code_generator_result gen_value_expr(
struct ivy_codegen *gen, struct code_generator_state *state,
struct ivy_ast_node *node, size_t depth)
{
struct var_codegen_state *var = (struct var_codegen_state *)state;
if (var->s_prev_node != IVY_AST_IDENT && var->s_prev_node != IVY_AST_TUPLE) {
return CODEGEN_RESULT_ERR(IVY_ERR_BAD_SYNTAX);
}
codegen_push_generator(gen, CODE_GENERATOR_EXPR, 0, NULL);
return CODEGEN_RESULT_OK(CODEGEN_R_REPEAT_NODE);
}
static struct code_generator_result gen_ident(
struct ivy_codegen *gen, struct code_generator_state *state,
struct ivy_ast_node *node, size_t depth)
{
struct var_codegen_state *var = (struct var_codegen_state *)state;
if (var->s_prev_node != IVY_AST_VAR) {
/* TODO support tuple assignment */
return CODEGEN_RESULT_ERR(IVY_ERR_BAD_SYNTAX);
return gen_value_expr(gen, state, node, depth);
}
struct ivy_ast_ident_node *ident = (struct ivy_ast_ident_node *)node;
@@ -52,20 +65,6 @@ static struct code_generator_result gen_ident(
return CODEGEN_RESULT_OK(0);
}
static struct code_generator_result gen_value_expr(
struct ivy_codegen *gen, struct code_generator_state *state,
struct ivy_ast_node *node, size_t depth)
{
struct var_codegen_state *var = (struct var_codegen_state *)state;
if (var->s_prev_node != IVY_AST_IDENT && var->s_prev_node != IVY_AST_TUPLE) {
return CODEGEN_RESULT_ERR(IVY_ERR_BAD_SYNTAX);
}
codegen_push_generator(gen, CODE_GENERATOR_EXPR, 0);
return CODEGEN_RESULT_OK(CODEGEN_REPEAT_NODE);
}
#if 0
static struct code_generator_result gen_var_ref(
struct ivy_codegen *gen, struct code_generator_state *state,
@@ -93,9 +92,10 @@ static struct code_generator_result gen_var_ref(
#endif
static enum ivy_status state_init(
struct ivy_codegen *gen, struct code_generator_state *state)
struct ivy_codegen *gen, struct code_generator_state *state,
uintptr_t argv, void *argp)
{
printf("codegen: start of var decl\n");
debug_printf("codegen: start of var decl\n");
return IVY_OK;
}
@@ -103,7 +103,7 @@ static enum ivy_status state_fini(
struct ivy_codegen *gen, struct code_generator_state *state,
struct mie_value **result)
{
printf("codegen: end of var decl\n");
debug_printf("codegen: end of var decl\n");
struct var_codegen_state *var = (struct var_codegen_state *)state;
struct code_generator_scope *scope = codegen_get_current_scope(gen);
@@ -112,6 +112,7 @@ static enum ivy_status state_fini(
if (var->s_value) {
mie_builder_store(gen->c_builder, var->s_value, var->s_var_ptr);
}
return IVY_OK;
}
@@ -119,7 +120,7 @@ static struct code_generator_result value_received(
struct ivy_codegen *gen, struct code_generator_state *state,
struct mie_value *value)
{
printf("codegen: var decl value received\n");
debug_printf("codegen: var decl value received\n");
struct var_codegen_state *var = (struct var_codegen_state *)state;
if (!var->s_var_ptr) {
@@ -128,7 +129,7 @@ static struct code_generator_result value_received(
var->s_value = value;
return CODEGEN_RESULT_OK(CODEGEN_POP_GENERATOR);
return CODEGEN_RESULT_OK(CODEGEN_R_POP_GENERATOR);
}
struct code_generator var_generator = {
@@ -137,10 +138,9 @@ struct code_generator var_generator = {
.g_state_init = state_init,
.g_state_fini = state_fini,
.g_value_received = value_received,
.g_expr_generator = gen_value_expr,
.g_node_generators = {
[IVY_AST_VAR] = gen_var,
[IVY_AST_IDENT] = gen_ident,
[IVY_AST_INT] = gen_value_expr,
[IVY_AST_OP] = gen_value_expr,
},
};