aboutsummaryrefslogtreecommitdiff
path: root/src/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-04-01 15:15:28 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-04-01 15:15:28 -0400
commitd888bec4095170d159c488292ba098b243c0a44e (patch)
tree0d0ff7c2e2c4ed75519ee32ec6482e04b1e68b3d /src/compile.c
parent354ed77535d17f2fc71780f1aaeb7ebfb80307d4 (diff)
Clean up and improve patterns
Diffstat (limited to 'src/compile.c')
-rw-r--r--src/compile.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/compile.c b/src/compile.c
index 2cc20f39..43b9ef1e 100644
--- a/src/compile.c
+++ b/src/compile.c
@@ -4200,8 +4200,12 @@ CORD compile_top_level_code(env_t *env, ast_t *ast)
case Extend: {
auto extend = Match(ast, Extend);
env_t *ns_env = namespace_env(env, extend->name);
- ns_env->libname = env->libname;
- return compile_top_level_code(ns_env, extend->body);
+ env_t *extended = new(env_t);
+ *extended = *ns_env;
+ extended->locals = new(Table_t, .fallback=env->locals);
+ extended->namespace_bindings = new(Table_t, .fallback=env->namespace_bindings);
+ extended->libname = env->libname;
+ return compile_top_level_code(extended, extend->body);
}
case Extern: return CORD_EMPTY;
case Block: {
@@ -4358,30 +4362,38 @@ CORD compile_statement_type_header(env_t *env, Path_t header_path, ast_t *ast)
CORD compile_statement_namespace_header(env_t *env, Path_t header_path, ast_t *ast)
{
- const char *ns_name = NULL;
+ env_t *ns_env = NULL;
ast_t *block = NULL;
switch (ast->tag) {
case LangDef: {
auto def = Match(ast, LangDef);
- ns_name = def->name;
+ ns_env = namespace_env(env, def->name);
block = def->namespace;
break;
}
case Extend: {
auto extend = Match(ast, Extend);
- ns_name = extend->name;
+ ns_env = namespace_env(env, extend->name);
+
+ env_t *extended = new(env_t);
+ *extended = *ns_env;
+ extended->locals = new(Table_t, .fallback=env->locals);
+ extended->namespace_bindings = new(Table_t, .fallback=env->namespace_bindings);
+ extended->libname = env->libname;
+ ns_env = extended;
+
block = extend->body;
break;
}
case StructDef: {
auto def = Match(ast, StructDef);
- ns_name = def->name;
+ ns_env = namespace_env(env, def->name);
block = def->namespace;
break;
}
case EnumDef: {
auto def = Match(ast, EnumDef);
- ns_name = def->name;
+ ns_env = namespace_env(env, def->name);
block = def->namespace;
break;
}
@@ -4465,7 +4477,7 @@ CORD compile_statement_namespace_header(env_t *env, Path_t header_path, ast_t *a
}
default: return CORD_EMPTY;
}
- env_t *ns_env = namespace_env(env, ns_name);
+ assert(ns_env);
CORD header = CORD_EMPTY;
for (ast_list_t *stmt = block ? Match(block, Block)->statements : NULL; stmt; stmt = stmt->next) {
header = CORD_all(header, compile_statement_namespace_header(ns_env, header_path, stmt->ast));