lang: codegen: implement message-send code generation and global var references
This commit is contained in:
@@ -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,
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user