Skip to content

Commit

Permalink
[3.11] pythongh-106303: Use _PyObject_LookupAttr() instead of PyObjec…
Browse files Browse the repository at this point in the history
…t_GetAttr() (pythonGH-106304)

It simplifies and speed up the code..
(cherry picked from commit 93d292c)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
  • Loading branch information
serhiy-storchaka committed Jul 9, 2023
1 parent 769b7d2 commit 25fd87a
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 20 deletions.
1 change: 1 addition & 0 deletions Include/internal/pycore_global_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(__lshift__)
STRUCT_FOR_ID(__lt__)
STRUCT_FOR_ID(__main__)
STRUCT_FOR_ID(__match_args__)
STRUCT_FOR_ID(__matmul__)
STRUCT_FOR_ID(__missing__)
STRUCT_FOR_ID(__mod__)
Expand Down
1 change: 1 addition & 0 deletions Include/internal/pycore_runtime_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,7 @@ extern "C" {
INIT_ID(__lshift__), \
INIT_ID(__lt__), \
INIT_ID(__main__), \
INIT_ID(__match_args__), \
INIT_ID(__matmul__), \
INIT_ID(__missing__), \
INIT_ID(__mod__), \
Expand Down
15 changes: 5 additions & 10 deletions Objects/funcobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -801,17 +801,12 @@ PyTypeObject PyFunction_Type = {
static int
functools_copy_attr(PyObject *wrapper, PyObject *wrapped, PyObject *name)
{
PyObject *value = PyObject_GetAttr(wrapped, name);
if (value == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
return 0;
}
return -1;
PyObject *value;
int res = _PyObject_LookupAttr(wrapped, name, &value);
if (value != NULL) {
res = PyObject_SetAttr(wrapper, name, value);
Py_DECREF(value);
}

int res = PyObject_SetAttr(wrapper, name, value);
Py_DECREF(value);
return res;
}

Expand Down
16 changes: 6 additions & 10 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -1001,10 +1001,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;
}

Expand Down Expand Up @@ -1039,7 +1037,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)";
Expand All @@ -1049,8 +1049,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
Expand All @@ -1059,9 +1058,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) {
Expand Down

0 comments on commit 25fd87a

Please sign in to comment.