aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c32
-rw-r--r--compile.h1
-rw-r--r--enums.c24
-rw-r--r--structs.c24
4 files changed, 35 insertions, 46 deletions
diff --git a/compile.c b/compile.c
index 04397691..4d489c6b 100644
--- a/compile.c
+++ b/compile.c
@@ -1088,6 +1088,38 @@ CORD compile(env_t *env, ast_t *ast)
return NULL;
}
+void compile_namespace(env_t *env, const char *ns_name, ast_t *block)
+{
+ env_t *ns_env = namespace_env(env, ns_name);
+ for (ast_list_t *stmt = block ? Match(block, Block)->statements : NULL; stmt; stmt = stmt->next) {
+ ast_t *ast = stmt->ast;
+ switch (ast->tag) {
+ case FunctionDef:
+ CORD code = compile_statement(ns_env, ast);
+ env->code->funcs = CORD_cat(env->code->funcs, code);
+ break;
+ case Declare: {
+ auto decl = Match(ast, Declare);
+ type_t *t = get_type(ns_env, decl->value);
+
+ CORD var_decl = CORD_all(compile_type(t), " ", compile(ns_env, decl->var), ";\n");
+ env->code->staticdefs = CORD_cat(env->code->staticdefs, var_decl);
+
+ CORD init = CORD_all(compile(ns_env, decl->var), " = ", compile(ns_env, decl->value), ";\n");
+ env->code->main = CORD_cat(env->code->main, init);
+
+ env->code->fndefs = CORD_all(env->code->fndefs, "extern ", compile_type(t), " ", compile(ns_env, decl->var), ";\n");
+ break;
+ }
+ default: {
+ CORD code = compile_statement(ns_env, ast);
+ env->code->main = CORD_cat(env->code->main, code);
+ break;
+ }
+ }
+ }
+}
+
CORD compile_type_info(env_t *env, type_t *t)
{
switch (t->tag) {
diff --git a/compile.h b/compile.h
index df7464b7..6ae5cb07 100644
--- a/compile.h
+++ b/compile.h
@@ -17,6 +17,7 @@ module_code_t compile_file(ast_t *ast);
CORD compile_type_ast(type_ast_t *t);
CORD compile_type(type_t *t);
CORD compile(env_t *env, ast_t *ast);
+void compile_namespace(env_t *env, const char *ns_name, ast_t *block);
CORD compile_statement(env_t *env, ast_t *ast);
CORD compile_type_info(env_t *env, type_t *t);
diff --git a/enums.c b/enums.c
index 38e5444b..b12559e4 100644
--- a/enums.c
+++ b/enums.c
@@ -153,29 +153,7 @@ void compile_enum_def(env_t *env, ast_t *ast)
typeinfo = CORD_cat(typeinfo, "}}};\n");
env->code->typeinfos = CORD_all(env->code->typeinfos, typeinfo);
- env_t *ns_env = namespace_env(env, def->name);
- for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next) {
- ast_t *ast = stmt->ast;
- switch (ast->tag) {
- case FunctionDef:
- CORD code = compile_statement(ns_env, ast);
- env->code->funcs = CORD_cat(env->code->funcs, code);
- break;
- case Declare: {
- CORD code = compile_statement(ns_env, ast);
- env->code->staticdefs = CORD_cat(env->code->staticdefs, code);
- auto decl = Match(ast, Declare);
- type_t *t = get_type(ns_env, decl->value);
- env->code->fndefs = CORD_all(env->code->fndefs, "extern ", compile_type(t), " ", compile(ns_env, decl->var), ";\n");
- break;
- }
- default: {
- CORD code = compile_statement(ns_env, ast);
- env->code->main = CORD_cat(env->code->main, code);
- break;
- }
- }
- }
+ compile_namespace(env, def->name, def->namespace);
}
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0
diff --git a/structs.c b/structs.c
index 42bf291b..e117cdb7 100644
--- a/structs.c
+++ b/structs.c
@@ -161,29 +161,7 @@ void compile_struct_def(env_t *env, ast_t *ast)
typeinfo = CORD_cat(typeinfo, "}}};\n");
env->code->typeinfos = CORD_all(env->code->typeinfos, typeinfo);
- env_t *ns_env = namespace_env(env, def->name);
- for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next) {
- ast_t *ast = stmt->ast;
- switch (ast->tag) {
- case FunctionDef:
- CORD code = compile_statement(ns_env, ast);
- env->code->funcs = CORD_cat(env->code->funcs, code);
- break;
- case Declare: {
- CORD code = compile_statement(ns_env, ast);
- env->code->staticdefs = CORD_cat(env->code->staticdefs, code);
- auto decl = Match(ast, Declare);
- type_t *t = get_type(ns_env, decl->value);
- env->code->fndefs = CORD_all(env->code->fndefs, "extern ", compile_type(t), " ", compile(ns_env, decl->var), ";\n");
- break;
- }
- default: {
- CORD code = compile_statement(ns_env, ast);
- env->code->main = CORD_cat(env->code->main, code);
- break;
- }
- }
- }
+ compile_namespace(env, def->name, def->namespace);
}
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0