summaryrefslogtreecommitdiff
path: root/src/codegen/codegen.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen/codegen.h')
-rw-r--r--src/codegen/codegen.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/codegen/codegen.h b/src/codegen/codegen.h
new file mode 100644
index 0000000..a7f3df3
--- /dev/null
+++ b/src/codegen/codegen.h
@@ -0,0 +1,49 @@
+
+#ifndef CODEGEN_H
+#define CODEGEN_H
+
+#include <stdio.h>
+#include "../zprep.h"
+#include "../ast/ast.h"
+#include "../parser/parser.h"
+
+// Main codegen entry points.
+void codegen_node(ParserContext *ctx, ASTNode *node, FILE *out);
+void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out);
+void codegen_walker(ParserContext *ctx, ASTNode *node, FILE *out);
+void codegen_expression(ParserContext *ctx, ASTNode *node, FILE *out);
+
+// Utility functions (codegen_utils.c).
+char *infer_type(ParserContext *ctx, ASTNode *node);
+ASTNode *find_struct_def_codegen(ParserContext *ctx, const char *name);
+char *get_field_type_str(ParserContext *ctx, const char *struct_name, const char *field_name);
+char *extract_call_args(const char *args);
+void emit_var_decl_type(ParserContext *ctx, FILE *out, const char *type_str, const char *var_name);
+char *replace_string_type(const char *args);
+const char *parse_original_method_name(const char *mangled);
+void emit_auto_type(ParserContext *ctx, ASTNode *init_expr, Token t, FILE *out);
+
+// Declaration emission (codegen_decl.c).
+void emit_preamble(FILE *out);
+void emit_includes_and_aliases(ASTNode *node, FILE *out);
+void emit_struct_defs(ParserContext *ctx, ASTNode *node, FILE *out);
+void emit_trait_defs(ASTNode *node, FILE *out);
+void emit_enum_protos(ASTNode *node, FILE *out);
+void emit_globals(ParserContext *ctx, ASTNode *node, FILE *out);
+void emit_lambda_defs(ParserContext *ctx, FILE *out);
+void emit_protos(ASTNode *node, FILE *out);
+void emit_impl_vtables(ParserContext *ctx, FILE *out);
+void emit_tests_and_runner(ParserContext *ctx, ASTNode *node, FILE *out);
+void print_type_defs(ParserContext *ctx, FILE *out, ASTNode *nodes);
+
+// Global state (shared across modules).
+extern ASTNode *global_user_structs;
+extern char *g_current_impl_type;
+extern int tmp_counter;
+extern int defer_count;
+extern ASTNode *defer_stack[];
+extern ASTNode *g_current_lambda;
+
+#define MAX_DEFER 1024
+
+#endif