Skip to content

Commit 90cf9b3

Browse files
Optimize.
1 parent 944d540 commit 90cf9b3

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

Objects/classobject.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -135,23 +135,31 @@ method___reduce___impl(PyMethodObject *self)
135135
PyObject *funcself = PyMethod_GET_SELF(self);
136136
PyObject *func = PyMethod_GET_FUNCTION(self);
137137
PyObject *funcname = PyObject_GetAttr(func, &_Py_ID(__name__));
138+
Py_ssize_t len;
138139
if (funcname == NULL) {
139140
return NULL;
140141
}
141-
PyObject *name = PyObject_GetAttr((PyObject *)Py_TYPE(funcself),
142-
&_Py_ID(__name__));
143-
if (name == NULL) {
144-
Py_DECREF(funcname);
145-
return NULL;
146-
}
147-
PyObject *mangled = _Py_Mangle(name, funcname);
148-
Py_DECREF(name);
149-
Py_DECREF(funcname);
150-
if (mangled == NULL) {
151-
return NULL;
142+
if (PyUnicode_Check(funcname) &&
143+
(len = PyUnicode_GET_LENGTH(funcname)) > 2 &&
144+
PyUnicode_READ_CHAR(funcname, 0) == '_' &&
145+
PyUnicode_READ_CHAR(funcname, 1) == '_' &&
146+
!(PyUnicode_READ_CHAR(funcname, len-1) == '_' &&
147+
PyUnicode_READ_CHAR(funcname, len-2) == '_'))
148+
{
149+
PyObject *name = PyObject_GetAttr((PyObject *)Py_TYPE(funcself),
150+
&_Py_ID(__name__));
151+
if (name == NULL) {
152+
Py_DECREF(funcname);
153+
return NULL;
154+
}
155+
Py_SETREF(funcname, _Py_Mangle(name, funcname));
156+
Py_DECREF(name);
157+
if (funcname == NULL) {
158+
return NULL;
159+
}
152160
}
153161
return Py_BuildValue(
154-
"N(ON)", _PyEval_GetBuiltin(&_Py_ID(getattr)), funcself, mangled);
162+
"N(ON)", _PyEval_GetBuiltin(&_Py_ID(getattr)), funcself, funcname);
155163
}
156164

157165
static PyMethodDef method_methods[] = {

0 commit comments

Comments
 (0)