#include "codegen.h" #include #include #include struct match_codegen_state { struct code_generator_state s_base; }; 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 match_codegen_state *match = (struct match_codegen_state *)state; codegen_push_generator(gen, CODE_GENERATOR_EXPR, 0, NULL); return CODEGEN_RESULT_OK(CODEGEN_R_REPEAT_NODE); } static struct code_generator_result gen_match( 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_block( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) { struct match_codegen_state *match = (struct match_codegen_state *)state; struct mie_func *func = mie_builder_get_current_func(gen->c_builder); codegen_push_generator(gen, CODE_GENERATOR_BLOCK, 0, NULL); return CODEGEN_RESULT_OK(0); } static struct code_generator_result gen_discard( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) { struct match_codegen_state *match = (struct match_codegen_state *)state; return CODEGEN_RESULT_OK(0); } static enum ivy_status state_init( struct ivy_codegen *gen, struct code_generator_state *state, uintptr_t argv, void *argp) { struct match_codegen_state *match = (struct match_codegen_state *)state; return IVY_OK; } static enum ivy_status state_fini( struct ivy_codegen *gen, struct code_generator_state *state, struct code_generator_value *result) { struct match_codegen_state *match = (struct match_codegen_state *)state; 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 match_codegen_state *match = (struct match_codegen_state *)state; struct mie_func *func = mie_builder_get_current_func(gen->c_builder); return CODEGEN_RESULT_OK(0); } struct code_generator match_generator = { .g_type = CODE_GENERATOR_FOR_LOOP, .g_state_size = sizeof(struct match_codegen_state), .g_state_init = state_init, .g_state_fini = state_fini, .g_value_received = value_received, .g_expr_generator = gen_expr, .g_node_generators = { NODE_CODEGEN(MATCH, gen_match), NODE_CODEGEN(BLOCK, gen_block), NODE_CODEGEN(DISCARD, gen_discard), }, };