Skip to content

Commit 1d3b5b5

Browse files
gh-17: Fix namespace scoping.
1 parent aad37b7 commit 1d3b5b5

1 file changed

Lines changed: 20 additions & 4 deletions

File tree

src/interpreter.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,7 +1610,11 @@ static ExecResult exec_stmt(Interpreter* interp, Stmt* stmt, Env* env, LabelMap*
16101610
}
16111611

16121612
case STMT_DECL: {
1613-
env_define(env, stmt->as.decl.name, stmt->as.decl.decl_type);
1613+
EnvEntry* existing = env_get_entry(env, stmt->as.decl.name);
1614+
if (!existing) {
1615+
Env* decl_env = env->parent ? env->parent : env;
1616+
env_define(decl_env, stmt->as.decl.name, stmt->as.decl.decl_type);
1617+
}
16141618
return make_ok(value_null());
16151619
}
16161620

@@ -1679,8 +1683,15 @@ static ExecResult exec_stmt(Interpreter* interp, Stmt* stmt, Env* env, LabelMap*
16791683
return make_error(buf, stmt->line, stmt->column);
16801684
}
16811685

1682-
env_define(env, stmt->as.assign.name, expected);
1683-
if (!env_assign(env, stmt->as.assign.name, v, expected, true)) {
1686+
EnvEntry* existing = env_get_entry(env, stmt->as.assign.name);
1687+
Env* assign_env = env;
1688+
if (!existing && env->parent) {
1689+
assign_env = env->parent;
1690+
}
1691+
if (!existing) {
1692+
env_define(assign_env, stmt->as.assign.name, expected);
1693+
}
1694+
if (!env_assign(assign_env, stmt->as.assign.name, v, expected, true)) {
16841695
char buf[256];
16851696
snprintf(buf, sizeof(buf), "Cannot assign to frozen identifier '%s'", stmt->as.assign.name);
16861697
value_free(v);
@@ -1741,7 +1752,12 @@ static ExecResult exec_stmt(Interpreter* interp, Stmt* stmt, Env* env, LabelMap*
17411752
// so that builtins which operate on identifiers (DEL, EXIST, etc.)
17421753
// can find and manipulate the function by name.
17431754
Value fv = value_func(f);
1744-
if (!env_assign(env, f->name, fv, TYPE_FUNC, true)) {
1755+
EnvEntry* existing = env_get_entry(env, f->name);
1756+
Env* bind_env = env;
1757+
if (!existing && env->parent) {
1758+
bind_env = env->parent;
1759+
}
1760+
if (!env_assign(bind_env, f->name, fv, TYPE_FUNC, true)) {
17451761
// If we cannot assign the function into the environment, treat as error
17461762
return make_error("Failed to bind function name in environment", stmt->line, stmt->column);
17471763
}

0 commit comments

Comments
 (0)