aboutsummaryrefslogtreecommitdiff
path: root/environment.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-08 21:55:15 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-08 21:55:15 -0400
commita4fff5cb49b25aca4c889ec312ddf4c6c530c69b (patch)
tree0ba91f8fcc500383db55fdde1012c19b4d703cb9 /environment.c
parenteb47f61450349b1be4e72ffe6f36273a1d01a428 (diff)
Bugfix for default arguments not supporting enclosing types
Diffstat (limited to 'environment.c')
-rw-r--r--environment.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/environment.c b/environment.c
index be0db696..3cb47b90 100644
--- a/environment.c
+++ b/environment.c
@@ -347,6 +347,7 @@ env_t *load_module_env(env_t *env, ast_t *ast)
env_t *module_env = fresh_scope(env);
module_env->code = new(compilation_unit_t);
module_env->namespace = new(namespace_t, .name=file_base_name(name));
+ module_env->namespace_bindings = module_env->locals;
Table$str_set(module_env->imports, name, module_env);
for (ast_list_t *stmt = Match(ast, Block)->statements; stmt; stmt = stmt->next)
@@ -366,6 +367,14 @@ env_t *global_scope(env_t *env)
return scope;
}
+env_t *namespace_scope(env_t *env)
+{
+ env_t *scope = new(env_t);
+ *scope = *env;
+ scope->locals = new(Table_t, .fallback=env->namespace_bindings ? env->namespace_bindings : env->globals);
+ return scope;
+}
+
env_t *fresh_scope(env_t *env)
{
env_t *scope = new(env_t);
@@ -491,6 +500,7 @@ env_t *namespace_env(env_t *env, const char *namespace_name)
*ns_env = *env;
ns_env->locals = new(Table_t, .fallback=env->locals);
ns_env->namespace = new(namespace_t, .name=namespace_name, .parent=env->namespace);
+ ns_env->namespace_bindings = ns_env->locals;
return ns_env;
}