From 03f8742eb7fcd53ed1743bfa4b83d4f13f5bc16a Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Wed, 6 Mar 2024 12:41:18 -0500 Subject: Fix namespace initializers --- compile.c | 32 ++++++++++++++++++++++++++++++++ compile.h | 1 + enums.c | 24 +----------------------- structs.c | 24 +----------------------- 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 -- cgit v1.2.3