#include "codegen.h" #include #include struct cascade_codegen_state { struct code_generator_state s_base; struct mie_value *s_recipient; struct mie_value *s_result; }; static struct code_generator_result gen_cascade( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) { return CODEGEN_RESULT_OK(0); } static struct code_generator_result gen_msg( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) { struct cascade_codegen_state *cascade = (struct cascade_codegen_state *)state; codegen_push_generator( gen, CODE_GENERATOR_MSG, CODEGEN_F_IGNORE_RESULT, cascade->s_recipient); return CODEGEN_RESULT_OK(CODEGEN_R_REPEAT_NODE); } static struct code_generator_result gen_expr( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) { struct cascade_codegen_state *cascade = (struct cascade_codegen_state *)state; if (cascade->s_recipient) { return CODEGEN_RESULT_ERR(IVY_ERR_BAD_SYNTAX); } codegen_push_generator( gen, CODE_GENERATOR_EXPR, CODEGEN_F_IGNORE_RESULT, NULL); return CODEGEN_RESULT_OK(CODEGEN_R_REPEAT_NODE); } static enum ivy_status state_fini( struct ivy_codegen *gen, struct code_generator_state *state, struct code_generator_value *result) { struct cascade_codegen_state *cascade = (struct cascade_codegen_state *)state; code_generator_value_set_mie_value(result, cascade->s_result); return IVY_OK; } static struct code_generator_result value_received( struct ivy_codegen *gen, struct code_generator_state *state, struct code_generator_value *value) { struct cascade_codegen_state *cascade = (struct cascade_codegen_state *)state; struct mie_value *mie_value = code_generator_value_get_mie_value(value); if (!cascade->s_recipient) { cascade->s_recipient = mie_value; } cascade->s_result = mie_value; return CODEGEN_RESULT_OK(0); } struct code_generator cascade_generator = { .g_type = CODE_GENERATOR_CASCADE, .g_state_size = sizeof(struct cascade_codegen_state), .g_state_fini = state_fini, .g_value_received = value_received, .g_node_generators = { NODE_CODEGEN(CASCADE, gen_cascade), NODE_CODEGEN(MSG, gen_msg), }, .g_expr_generator = gen_expr, };