lang: codegen: replace codegen_value with a new system for passing different types of values between code generators

This commit is contained in:
2025-09-08 16:17:29 +01:00
parent 7ee2e9dd81
commit 6844f498c5
12 changed files with 114 additions and 91 deletions

View File

@@ -57,6 +57,12 @@ enum code_generator_scope_type {
CODE_GENERATOR_SCOPE_BLOCK,
};
enum code_generator_value_type {
CODE_GENERATOR_VALUE_NONE = 0,
CODE_GENERATOR_VALUE_MIE_VALUE,
CODE_GENERATOR_VALUE_PHI_EDGE,
};
struct code_generator_result {
enum ivy_status r_status;
@@ -66,10 +72,13 @@ struct code_generator_result {
} r_flags;
};
struct codegen_value {
b_queue_entry v_entry;
struct ivy_ast_node *v_node;
struct mie_value *v_value;
struct code_generator_value {
enum code_generator_value_type v_type;
union {
struct mie_value *mie_value;
struct mie_phi_edge *phi_edge;
} v_value;
};
struct code_generator_state;
@@ -77,14 +86,16 @@ struct code_generator_state;
typedef enum ivy_status (*code_generator_state_init_callback)(
struct ivy_codegen *, struct code_generator_state *, uintptr_t, void *);
typedef enum ivy_status (*code_generator_state_fini_callback)(
struct ivy_codegen *, struct code_generator_state *, struct mie_value **);
struct ivy_codegen *, struct code_generator_state *,
struct code_generator_value *);
typedef struct code_generator_result (*code_generator_callback)(
struct ivy_codegen *);
typedef struct code_generator_result (*code_generator_node_callback)(
struct ivy_codegen *, struct code_generator_state *,
struct ivy_ast_node *, size_t);
typedef struct code_generator_result (*code_generator_value_received_callback)(
struct ivy_codegen *, struct code_generator_state *, struct mie_value *);
struct ivy_codegen *, struct code_generator_state *,
struct code_generator_value *);
typedef enum ivy_status (*code_generator_define_variable_callback)(
struct ivy_codegen *, struct code_generator_state *, const char *,
const struct codegen_var *);
@@ -136,14 +147,7 @@ extern enum ivy_status codegen_push_generator(
struct ivy_codegen *gen, enum code_generator_type gen_type,
uintptr_t argv, void *argp);
extern enum ivy_status codegen_pop_generator(
struct ivy_codegen *gen, struct mie_value **result);
extern struct codegen_value *codegen_value_create(
struct ivy_ast_node *node, struct mie_value *val);
extern void codegen_value_destroy(struct codegen_value *val);
extern void codegen_push_value(struct ivy_codegen *gen, struct codegen_value *val);
extern struct codegen_value *codegen_pop_value(struct ivy_codegen *gen);
struct ivy_codegen *gen, struct code_generator_value *result);
extern enum ivy_status codegen_define_variable(
struct ivy_codegen *gen, const char *ident, const struct codegen_var *var);
@@ -151,5 +155,16 @@ extern enum ivy_status codegen_resolve_variable(
struct ivy_codegen *gen, const char *ident, struct codegen_var *out);
extern struct mie_value *codegen_load_variable(
struct ivy_codegen *gen, struct codegen_var *var);
extern void codegen_store_variable(
struct ivy_codegen *gen, struct codegen_var *var, struct mie_value *val);
extern struct mie_value *code_generator_value_get_mie_value(
struct code_generator_value *vp);
extern void code_generator_value_set_mie_value(
struct code_generator_value *vp, struct mie_value *value);
extern struct mie_phi_edge *code_generator_value_get_phi_edge(
struct code_generator_value *vp);
extern void code_generator_value_set_phi_edge(
struct code_generator_value *vp, struct mie_phi_edge *edge);
#endif