lang: codegen: replace codegen_value with a new system for passing different types of values between code generators
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user