mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
gh-106303: Use _PyObject_LookupAttr() instead of PyObject_GetAttr() (GH-106304)
It simplifies and speed up the code.
This commit is contained in:
parent
d137c2cae2
commit
93d292c2b3
6 changed files with 17 additions and 20 deletions
|
@ -418,10 +418,8 @@ match_class_attr(PyThreadState *tstate, PyObject *subject, PyObject *type,
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
PyObject *attr = PyObject_GetAttr(subject, name);
|
||||
if (attr == NULL && _PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
|
||||
_PyErr_Clear(tstate);
|
||||
}
|
||||
PyObject *attr;
|
||||
(void)_PyObject_LookupAttr(subject, name, &attr);
|
||||
return attr;
|
||||
}
|
||||
|
||||
|
@ -456,7 +454,9 @@ match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
|
|||
// First, the positional subpatterns:
|
||||
if (nargs) {
|
||||
int match_self = 0;
|
||||
match_args = PyObject_GetAttrString(type, "__match_args__");
|
||||
if (_PyObject_LookupAttr(type, &_Py_ID(__match_args__), &match_args) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
if (match_args) {
|
||||
if (!PyTuple_CheckExact(match_args)) {
|
||||
const char *e = "%s.__match_args__ must be a tuple (got %s)";
|
||||
|
@ -466,8 +466,7 @@ match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
|
|||
goto fail;
|
||||
}
|
||||
}
|
||||
else if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
|
||||
_PyErr_Clear(tstate);
|
||||
else {
|
||||
// _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not
|
||||
// define __match_args__. This is natural behavior for subclasses:
|
||||
// it's as if __match_args__ is some "magic" value that is lost as
|
||||
|
@ -476,9 +475,6 @@ match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
|
|||
match_self = PyType_HasFeature((PyTypeObject*)type,
|
||||
_Py_TPFLAGS_MATCH_SELF);
|
||||
}
|
||||
else {
|
||||
goto fail;
|
||||
}
|
||||
assert(PyTuple_CheckExact(match_args));
|
||||
Py_ssize_t allowed = match_self ? 1 : PyTuple_GET_SIZE(match_args);
|
||||
if (allowed < nargs) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue