py/scope: Optimise scope_find_or_add_id to not need "added" arg.

Taking the address of a local variable is mildly expensive, in code size
and stack usage.  So optimise scope_find_or_add_id() to not need to take a
pointer to the "added" variable, and instead take the kind to use for newly
added identifiers.
This commit is contained in:
Damien George
2018-10-27 22:41:21 +11:00
parent ba92c79841
commit e328a5d469
5 changed files with 23 additions and 46 deletions

View File

@@ -30,26 +30,10 @@
#if MICROPY_ENABLE_COMPILER
void mp_emit_common_get_id_for_load(scope_t *scope, qstr qst) {
// name adding/lookup
bool added;
id_info_t *id = scope_find_or_add_id(scope, qst, &added);
if (added) {
id->kind = ID_INFO_KIND_GLOBAL_IMPLICIT;
}
}
void mp_emit_common_get_id_for_modification(scope_t *scope, qstr qst) {
// name adding/lookup
bool added;
id_info_t *id = scope_find_or_add_id(scope, qst, &added);
if (added) {
if (SCOPE_IS_FUNC_LIKE(scope->kind)) {
id->kind = ID_INFO_KIND_LOCAL;
} else {
id->kind = ID_INFO_KIND_GLOBAL_IMPLICIT;
}
} else if (SCOPE_IS_FUNC_LIKE(scope->kind) && id->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) {
id_info_t *id = scope_find_or_add_id(scope, qst, ID_INFO_KIND_GLOBAL_IMPLICIT);
if (SCOPE_IS_FUNC_LIKE(scope->kind) && id->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) {
// rebind as a local variable
id->kind = ID_INFO_KIND_LOCAL;
}