[3.13] gh-122445: populate only modified fields in __static_attributes__ (#122446) (#122621)

gh-122445: populate only modified fields in __static_attributes__ (#122446)

(cherry picked from commit 498376d7a7)
This commit is contained in:
Irit Katriel 2024-08-02 19:26:57 +01:00 committed by GitHub
parent b20893b5c2
commit 545a328eae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 22 additions and 18 deletions

View file

@ -589,9 +589,17 @@ compiler_unit_free(struct compiler_unit *u)
PyMem_Free(u);
}
static struct compiler_unit *
get_class_compiler_unit(struct compiler *c)
static int
compiler_maybe_add_static_attribute_to_class(struct compiler *c, expr_ty e)
{
assert(e->kind == Attribute_kind);
expr_ty attr_value = e->v.Attribute.value;
if (attr_value->kind != Name_kind ||
e->v.Attribute.ctx != Store ||
!_PyUnicode_EqualToASCIIString(attr_value->v.Name.id, "self"))
{
return SUCCESS;
}
Py_ssize_t stack_size = PyList_GET_SIZE(c->c_stack);
for (Py_ssize_t i = stack_size - 1; i >= 0; i--) {
PyObject *capsule = PyList_GET_ITEM(c->c_stack, i);
@ -599,10 +607,12 @@ get_class_compiler_unit(struct compiler *c)
capsule, CAPSULE_NAME);
assert(u);
if (u->u_scope_type == COMPILER_SCOPE_CLASS) {
return u;
assert(u->u_static_attributes);
RETURN_IF_ERROR(PySet_Add(u->u_static_attributes, e->v.Attribute.attr));
break;
}
}
return NULL;
return SUCCESS;
}
static int
@ -6283,17 +6293,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e)
ADDOP(c, loc, NOP);
return SUCCESS;
}
if (e->v.Attribute.value->kind == Name_kind &&
_PyUnicode_EqualToASCIIString(e->v.Attribute.value->v.Name.id, "self"))
{
struct compiler_unit *class_u = get_class_compiler_unit(c);
if (class_u != NULL) {
assert(class_u->u_scope_type == COMPILER_SCOPE_CLASS);
assert(class_u->u_static_attributes);
RETURN_IF_ERROR(
PySet_Add(class_u->u_static_attributes, e->v.Attribute.attr));
}
}
RETURN_IF_ERROR(compiler_maybe_add_static_attribute_to_class(c, e));
VISIT(c, expr, e->v.Attribute.value);
loc = LOC(e);
loc = update_start_location_to_match_attr(c, loc, e);