mirror of
https://github.com/micropython/micropython.git
synced 2025-09-04 00:40:37 +02:00
py/compile: Fix case of eager implicit conversion of local to nonlocal.
This ensures that implicit variables are only converted to implicit closed-over variables (nonlocals) at the very end of the function scope. If variables are closed-over when first used (read from, as was done prior to this commit) then this can be incorrect because the variable may be assigned to later on in the function which means they are just a plain local, not closed over. Fixes issue #4272.
This commit is contained in:
@@ -130,21 +130,19 @@ STATIC void scope_close_over_in_parents(scope_t *scope, qstr qst) {
|
||||
}
|
||||
}
|
||||
|
||||
void scope_find_local_and_close_over(scope_t *scope, id_info_t *id, qstr qst) {
|
||||
void scope_check_to_close_over(scope_t *scope, id_info_t *id) {
|
||||
if (scope->parent != NULL) {
|
||||
for (scope_t *s = scope->parent; s->parent != NULL; s = s->parent) {
|
||||
id_info_t *id2 = scope_find(s, qst);
|
||||
id_info_t *id2 = scope_find(s, id->qst);
|
||||
if (id2 != NULL) {
|
||||
if (id2->kind == ID_INFO_KIND_LOCAL || id2->kind == ID_INFO_KIND_CELL || id2->kind == ID_INFO_KIND_FREE) {
|
||||
id->kind = ID_INFO_KIND_FREE;
|
||||
scope_close_over_in_parents(scope, qst);
|
||||
return;
|
||||
scope_close_over_in_parents(scope, id->qst);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
id->kind = ID_INFO_KIND_GLOBAL_IMPLICIT;
|
||||
}
|
||||
|
||||
#endif // MICROPY_ENABLE_COMPILER
|
||||
|
Reference in New Issue
Block a user