From 11d8cd54c992eee55f27d3779738626bdc095c03 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Wed, 9 Apr 2014 14:42:51 +0100
Subject: [PATCH] py, compiler: Turn id_info_t.param into a set of flags.

So we can add more flags.
---
 py/compile.c | 12 ++++++------
 py/scope.c   |  4 ++--
 py/scope.h   |  6 +++++-
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/py/compile.c b/py/compile.c
index 1b826b448..49dddb0bd 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2208,7 +2208,7 @@ STATIC void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_t pn_ar
         // get first argument to function
         bool found = false;
         for (int i = 0; i < comp->scope_cur->id_info_len; i++) {
-            if (comp->scope_cur->id_info[i].param) {
+            if (comp->scope_cur->id_info[i].flags && ID_FLAG_IS_PARAM) {
                 EMIT_ARG(load_fast, MP_QSTR_, comp->scope_cur->id_info[i].local_num);
                 found = true;
                 break;
@@ -2761,8 +2761,8 @@ void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_ki
             compile_syntax_error(comp, pn, "same name used for parameter");
             return;
         }
-        id_info->param = true;
         id_info->kind = ID_INFO_KIND_LOCAL;
+        id_info->flags |= ID_FLAG_IS_PARAM;
     }
 }
 
@@ -3097,7 +3097,7 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
             id->kind = ID_INFO_KIND_GLOBAL_EXPLICIT;
         }
         // note: params always count for 1 local, even if they are a cell
-        if (id->param || id->kind == ID_INFO_KIND_LOCAL) {
+        if (id->kind == ID_INFO_KIND_LOCAL || (id->flags & ID_FLAG_IS_PARAM)) {
             id->local_num = scope->num_locals;
             scope->num_locals += 1;
         }
@@ -3119,7 +3119,7 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
         // in Micro Python the cells come right after the fast locals
         // parameters are not counted here, since they remain at the start
         // of the locals, even if they are cell vars
-        if (!id->param && id->kind == ID_INFO_KIND_CELL) {
+        if (id->kind == ID_INFO_KIND_CELL && !(id->flags & ID_FLAG_IS_PARAM)) {
             id->local_num = scope->num_locals;
             scope->num_locals += 1;
         }
@@ -3136,7 +3136,7 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
                 for (int j = 0; j < scope->id_info_len; j++) {
                     id_info_t *id2 = &scope->id_info[j];
                     if (id2->kind == ID_INFO_KIND_FREE && id->qstr == id2->qstr) {
-                        assert(!id2->param); // free vars should not be params
+                        assert(!(id2->flags & ID_FLAG_IS_PARAM)); // free vars should not be params
 #if MICROPY_EMIT_CPYTHON
                         // in CPython the frees are numbered after the cells
                         id2->local_num = num_cell + num_free;
@@ -3154,7 +3154,7 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
         if (num_free > 0) {
             for (int i = 0; i < scope->id_info_len; i++) {
                 id_info_t *id = &scope->id_info[i];
-                if (id->param || id->kind != ID_INFO_KIND_FREE) {
+                if (id->kind != ID_INFO_KIND_FREE || (id->flags && ID_FLAG_IS_PARAM)) {
                     id->local_num += num_free;
                 }
             }
diff --git a/py/scope.c b/py/scope.c
index d55a4ddea..51701727e 100644
--- a/py/scope.c
+++ b/py/scope.c
@@ -73,10 +73,10 @@ id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added) {
     // handled by the compiler because it adds arguments before compiling the body
     id_info_t *id_info = &scope->id_info[scope->id_info_len++];
 
-    id_info->param = false;
     id_info->kind = 0;
-    id_info->qstr = qstr;
+    id_info->flags = 0;
     id_info->local_num = 0;
+    id_info->qstr = qstr;
     *added = true;
     return id_info;
 }
diff --git a/py/scope.h b/py/scope.h
index daba296dc..68f55e0d0 100644
--- a/py/scope.h
+++ b/py/scope.h
@@ -6,9 +6,13 @@ enum {
     ID_INFO_KIND_FREE,  // in a function f, belongs to the parent of f
 };
 
+enum {
+    ID_FLAG_IS_PARAM = 0x01,
+};
+
 typedef struct _id_info_t {
-    uint8_t param;
     uint8_t kind;
+    uint8_t flags;
     // when it's an ID_INFO_KIND_LOCAL this is the unique number of the local
     // whet it's an ID_INFO_KIND_CELL/FREE this is the unique number of the closed over variable
     uint16_t local_num;
-- 
GitLab