@@ -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