@@ -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
157165static PyMethodDef method_methods [] = {
0 commit comments