lang: codegen: implement message-send code generation and global var references
This commit is contained in:
@@ -6,6 +6,12 @@
|
||||
#include <ivy/lang/lex.h>
|
||||
#include <mie/builder.h>
|
||||
|
||||
struct ivy_codegen;
|
||||
struct ivy_ast_node;
|
||||
|
||||
struct mie_value;
|
||||
struct mie_func;
|
||||
|
||||
#define CODEGEN_RESULT_OK(flags) \
|
||||
(struct code_generator_result) \
|
||||
{ \
|
||||
@@ -17,11 +23,8 @@
|
||||
.r_status = (status), .r_flags = (0) \
|
||||
}
|
||||
|
||||
struct ivy_codegen;
|
||||
struct ivy_ast_node;
|
||||
|
||||
struct mie_value;
|
||||
struct mie_func;
|
||||
#define __AST_INDEX(type) IVY_AST_##type
|
||||
#define NODE_CODEGEN(type, func) [__AST_INDEX(type)] = func
|
||||
|
||||
struct codegen_value {
|
||||
b_queue_entry v_entry;
|
||||
@@ -35,11 +38,16 @@ struct codegen_var {
|
||||
struct mie_value *v_ptr;
|
||||
};
|
||||
|
||||
enum code_generator_flags {
|
||||
CODEGEN_F_IGNORE_RESULT = 0x01u,
|
||||
};
|
||||
|
||||
enum code_generator_type {
|
||||
CODE_GENERATOR_NONE = 0,
|
||||
CODE_GENERATOR_UNIT,
|
||||
CODE_GENERATOR_EXPR,
|
||||
CODE_GENERATOR_VAR,
|
||||
CODE_GENERATOR_MSG,
|
||||
};
|
||||
|
||||
enum code_generator_scope_type {
|
||||
@@ -53,15 +61,15 @@ struct code_generator_result {
|
||||
enum ivy_status r_status;
|
||||
|
||||
enum code_generator_result_flags {
|
||||
CODEGEN_REPEAT_NODE = 0x01u,
|
||||
CODEGEN_POP_GENERATOR = 0x02u,
|
||||
CODEGEN_R_REPEAT_NODE = 0x01u,
|
||||
CODEGEN_R_POP_GENERATOR = 0x02u,
|
||||
} r_flags;
|
||||
};
|
||||
|
||||
struct code_generator_state;
|
||||
|
||||
typedef enum ivy_status (*code_generator_state_init_callback)(
|
||||
struct ivy_codegen *, struct code_generator_state *);
|
||||
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 **);
|
||||
typedef struct code_generator_result (*code_generator_callback)(
|
||||
@@ -79,12 +87,14 @@ struct code_generator {
|
||||
code_generator_state_init_callback g_state_init;
|
||||
code_generator_state_fini_callback g_state_fini;
|
||||
code_generator_node_callback g_node_generators[IVY_AST_TYPE_COUNT];
|
||||
code_generator_node_callback g_expr_generator;
|
||||
code_generator_value_received_callback g_value_received;
|
||||
};
|
||||
|
||||
struct code_generator_state {
|
||||
b_queue_entry s_entry;
|
||||
void *s_arg;
|
||||
uintptr_t s_argv;
|
||||
void *s_argp;
|
||||
const struct code_generator *s_gen;
|
||||
struct ivy_ast_node *s_root;
|
||||
size_t s_depth;
|
||||
@@ -112,7 +122,8 @@ extern const struct code_generator *get_root_code_generator(
|
||||
enum ivy_ast_node_type type);
|
||||
|
||||
extern enum ivy_status codegen_push_generator(
|
||||
struct ivy_codegen *gen, enum code_generator_type gen_type, void *arg);
|
||||
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user