aboutsummaryrefslogtreecommitdiff
path: root/environment.c
diff options
context:
space:
mode:
Diffstat (limited to 'environment.c')
-rw-r--r--environment.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/environment.c b/environment.c
index d5f6a15c..0c37c525 100644
--- a/environment.c
+++ b/environment.c
@@ -235,6 +235,29 @@ env_t *new_compilation_unit(void)
return env;
}
+env_t *load_module_env(env_t *env, ast_t *ast)
+{
+ const char *name = file_base_name(ast->file->filename);
+ env_t *cached = Table$str_get(*env->imports, name);
+ if (cached) return cached;
+ env = fresh_scope(env);
+ env->file_prefix = heap_strf("%s$", name);
+ Table$str_set(env->imports, name, env);
+
+ for (ast_list_t *stmt = Match(ast, Block)->statements; stmt; stmt = stmt->next)
+ prebind_statement(env, stmt->ast);
+
+ for (ast_list_t *stmt = Match(ast, Block)->statements; stmt; stmt = stmt->next) {
+ // Hack: make sure global variables are bound as foo$var:
+ if (stmt->ast->tag == Declare && Match(Match(stmt->ast, Declare)->var, Var)->name[0] != '_')
+ env->scope_prefix = heap_strf("%s$", name);
+ bind_statement(env, stmt->ast);
+ env->scope_prefix = NULL;
+ }
+ Table$str_set(env->imports, name, env);
+ return env;
+}
+
env_t *global_scope(env_t *env)
{
env_t *scope = new(env_t);