mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-122445: populate only modified fields in __static_attributes__ (#122446)
(cherry picked from commit 498376d7a7
)
This commit is contained in:
parent
b20893b5c2
commit
545a328eae
5 changed files with 22 additions and 18 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue