Restructure emit so it goes through a method table.
diff --git a/py/scope.c b/py/scope.c
index a715b2b..5773ae0 100644
--- a/py/scope.c
+++ b/py/scope.c
@@ -165,6 +165,46 @@
assert(0); // we should have found the variable in one of the parents
}
+void scope_declare_global(scope_t *scope, qstr qstr) {
+ if (scope->kind == SCOPE_MODULE) {
+ printf("SyntaxError?: can't declare global in outer code\n");
+ return;
+ }
+ bool added;
+ id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added);
+ if (!added) {
+ printf("SyntaxError?: identifier already declared something\n");
+ return;
+ }
+ id_info->kind = ID_INFO_KIND_GLOBAL_EXPLICIT;
+
+ // if the id exists in the global scope, set its kind to EXPLICIT_GLOBAL
+ id_info = scope_find_global(scope, qstr);
+ if (id_info != NULL) {
+ id_info->kind = ID_INFO_KIND_GLOBAL_EXPLICIT;
+ }
+}
+
+void scope_declare_nonlocal(scope_t *scope, qstr qstr) {
+ if (scope->kind == SCOPE_MODULE) {
+ printf("SyntaxError?: can't declare nonlocal in outer code\n");
+ return;
+ }
+ bool added;
+ id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added);
+ if (!added) {
+ printf("SyntaxError?: identifier already declared something\n");
+ return;
+ }
+ id_info_t *id_info2 = scope_find_local_in_parent(scope, qstr);
+ if (id_info2 == NULL || !(id_info2->kind == ID_INFO_KIND_LOCAL || id_info2->kind == ID_INFO_KIND_CELL || id_info2->kind == ID_INFO_KIND_FREE)) {
+ printf("SyntaxError: no binding for nonlocal '%s' found\n", qstr_str(qstr));
+ return;
+ }
+ id_info->kind = ID_INFO_KIND_FREE;
+ scope_close_over_in_parents(scope, qstr);
+}
+
void scope_print_info(scope_t *s) {
if (s->kind == SCOPE_MODULE) {
printf("code <module>\n");