mirror of https://github.com/python/cpython
gh-111178: Fix function signatures in methodobject.c (#124902)
This commit is contained in:
parent
1ea6672a6f
commit
29951c8471
|
@ -156,8 +156,9 @@ PyCMethod_GetClass(PyObject *op)
|
||||||
/* Methods (the standard built-in methods, that is) */
|
/* Methods (the standard built-in methods, that is) */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meth_dealloc(PyCFunctionObject *m)
|
meth_dealloc(PyObject *self)
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
// The Py_TRASHCAN mechanism requires that we be able to
|
// The Py_TRASHCAN mechanism requires that we be able to
|
||||||
// call PyObject_GC_UnTrack twice on an object.
|
// call PyObject_GC_UnTrack twice on an object.
|
||||||
PyObject_GC_UnTrack(m);
|
PyObject_GC_UnTrack(m);
|
||||||
|
@ -175,8 +176,9 @@ meth_dealloc(PyCFunctionObject *m)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_reduce(PyCFunctionObject *m, PyObject *Py_UNUSED(ignored))
|
meth_reduce(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
if (m->m_self == NULL || PyModule_Check(m->m_self))
|
if (m->m_self == NULL || PyModule_Check(m->m_self))
|
||||||
return PyUnicode_FromString(m->m_ml->ml_name);
|
return PyUnicode_FromString(m->m_ml->ml_name);
|
||||||
|
|
||||||
|
@ -185,32 +187,35 @@ meth_reduce(PyCFunctionObject *m, PyObject *Py_UNUSED(ignored))
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef meth_methods[] = {
|
static PyMethodDef meth_methods[] = {
|
||||||
{"__reduce__", (PyCFunction)meth_reduce, METH_NOARGS, NULL},
|
{"__reduce__", meth_reduce, METH_NOARGS, NULL},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_get__text_signature__(PyCFunctionObject *m, void *closure)
|
meth_get__text_signature__(PyObject *self, void *closure)
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
return _PyType_GetTextSignatureFromInternalDoc(m->m_ml->ml_name,
|
return _PyType_GetTextSignatureFromInternalDoc(m->m_ml->ml_name,
|
||||||
m->m_ml->ml_doc,
|
m->m_ml->ml_doc,
|
||||||
m->m_ml->ml_flags);
|
m->m_ml->ml_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_get__doc__(PyCFunctionObject *m, void *closure)
|
meth_get__doc__(PyObject *self, void *closure)
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
return _PyType_GetDocFromInternalDoc(m->m_ml->ml_name, m->m_ml->ml_doc);
|
return _PyType_GetDocFromInternalDoc(m->m_ml->ml_name, m->m_ml->ml_doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_get__name__(PyCFunctionObject *m, void *closure)
|
meth_get__name__(PyObject *self, void *closure)
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
return PyUnicode_FromString(m->m_ml->ml_name);
|
return PyUnicode_FromString(m->m_ml->ml_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_get__qualname__(PyCFunctionObject *m, void *closure)
|
meth_get__qualname__(PyObject *self, void *closure)
|
||||||
{
|
{
|
||||||
/* If __self__ is a module or NULL, return m.__name__
|
/* If __self__ is a module or NULL, return m.__name__
|
||||||
(e.g. len.__qualname__ == 'len')
|
(e.g. len.__qualname__ == 'len')
|
||||||
|
@ -220,14 +225,15 @@ meth_get__qualname__(PyCFunctionObject *m, void *closure)
|
||||||
|
|
||||||
Otherwise return type(m.__self__).__qualname__ + '.' + m.__name__
|
Otherwise return type(m.__self__).__qualname__ + '.' + m.__name__
|
||||||
(e.g. [].append.__qualname__ == 'list.append') */
|
(e.g. [].append.__qualname__ == 'list.append') */
|
||||||
PyObject *type, *type_qualname, *res;
|
|
||||||
|
|
||||||
if (m->m_self == NULL || PyModule_Check(m->m_self))
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
|
if (m->m_self == NULL || PyModule_Check(m->m_self)) {
|
||||||
return PyUnicode_FromString(m->m_ml->ml_name);
|
return PyUnicode_FromString(m->m_ml->ml_name);
|
||||||
|
}
|
||||||
|
|
||||||
type = PyType_Check(m->m_self) ? m->m_self : (PyObject*)Py_TYPE(m->m_self);
|
PyObject *type = PyType_Check(m->m_self) ? m->m_self : (PyObject*)Py_TYPE(m->m_self);
|
||||||
|
|
||||||
type_qualname = PyObject_GetAttr(type, &_Py_ID(__qualname__));
|
PyObject *type_qualname = PyObject_GetAttr(type, &_Py_ID(__qualname__));
|
||||||
if (type_qualname == NULL)
|
if (type_qualname == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -238,14 +244,15 @@ meth_get__qualname__(PyCFunctionObject *m, void *closure)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = PyUnicode_FromFormat("%S.%s", type_qualname, m->m_ml->ml_name);
|
PyObject *res = PyUnicode_FromFormat("%S.%s", type_qualname, m->m_ml->ml_name);
|
||||||
Py_DECREF(type_qualname);
|
Py_DECREF(type_qualname);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
|
meth_traverse(PyObject *self, visitproc visit, void *arg)
|
||||||
{
|
{
|
||||||
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
Py_VISIT(PyCFunction_GET_CLASS(m));
|
Py_VISIT(PyCFunction_GET_CLASS(m));
|
||||||
Py_VISIT(m->m_self);
|
Py_VISIT(m->m_self);
|
||||||
Py_VISIT(m->m_module);
|
Py_VISIT(m->m_module);
|
||||||
|
@ -253,22 +260,22 @@ meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_get__self__(PyCFunctionObject *m, void *closure)
|
meth_get__self__(PyObject *meth, void *closure)
|
||||||
{
|
{
|
||||||
PyObject *self;
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(meth);
|
||||||
|
PyObject *self = PyCFunction_GET_SELF(m);
|
||||||
self = PyCFunction_GET_SELF(m);
|
if (self == NULL) {
|
||||||
if (self == NULL)
|
|
||||||
self = Py_None;
|
self = Py_None;
|
||||||
|
}
|
||||||
return Py_NewRef(self);
|
return Py_NewRef(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyGetSetDef meth_getsets [] = {
|
static PyGetSetDef meth_getsets[] = {
|
||||||
{"__doc__", (getter)meth_get__doc__, NULL, NULL},
|
{"__doc__", meth_get__doc__, NULL, NULL},
|
||||||
{"__name__", (getter)meth_get__name__, NULL, NULL},
|
{"__name__", meth_get__name__, NULL, NULL},
|
||||||
{"__qualname__", (getter)meth_get__qualname__, NULL, NULL},
|
{"__qualname__", meth_get__qualname__, NULL, NULL},
|
||||||
{"__self__", (getter)meth_get__self__, NULL, NULL},
|
{"__self__", meth_get__self__, NULL, NULL},
|
||||||
{"__text_signature__", (getter)meth_get__text_signature__, NULL, NULL},
|
{"__text_signature__", meth_get__text_signature__, NULL, NULL},
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -280,15 +287,18 @@ static PyMemberDef meth_members[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
meth_repr(PyCFunctionObject *m)
|
meth_repr(PyObject *self)
|
||||||
{
|
{
|
||||||
if (m->m_self == NULL || PyModule_Check(m->m_self))
|
PyCFunctionObject *m = _PyCFunctionObject_CAST(self);
|
||||||
|
if (m->m_self == NULL || PyModule_Check(m->m_self)) {
|
||||||
return PyUnicode_FromFormat("<built-in function %s>",
|
return PyUnicode_FromFormat("<built-in function %s>",
|
||||||
m->m_ml->ml_name);
|
m->m_ml->ml_name);
|
||||||
|
}
|
||||||
|
|
||||||
return PyUnicode_FromFormat("<built-in method %s of %s object at %p>",
|
return PyUnicode_FromFormat("<built-in method %s of %s object at %p>",
|
||||||
m->m_ml->ml_name,
|
m->m_ml->ml_name,
|
||||||
Py_TYPE(m->m_self)->tp_name,
|
Py_TYPE(m->m_self)->tp_name,
|
||||||
m->m_self);
|
m->m_self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -317,14 +327,15 @@ meth_richcompare(PyObject *self, PyObject *other, int op)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Py_hash_t
|
static Py_hash_t
|
||||||
meth_hash(PyCFunctionObject *a)
|
meth_hash(PyObject *self)
|
||||||
{
|
{
|
||||||
Py_hash_t x, y;
|
PyCFunctionObject *a = _PyCFunctionObject_CAST(self);
|
||||||
x = PyObject_GenericHash(a->m_self);
|
Py_hash_t x = PyObject_GenericHash(a->m_self);
|
||||||
y = _Py_HashPointer((void*)(a->m_ml->ml_meth));
|
Py_hash_t y = _Py_HashPointer((void*)(a->m_ml->ml_meth));
|
||||||
x ^= y;
|
x ^= y;
|
||||||
if (x == -1)
|
if (x == -1) {
|
||||||
x = -2;
|
x = -2;
|
||||||
|
}
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,16 +345,16 @@ PyTypeObject PyCFunction_Type = {
|
||||||
"builtin_function_or_method",
|
"builtin_function_or_method",
|
||||||
sizeof(PyCFunctionObject),
|
sizeof(PyCFunctionObject),
|
||||||
0,
|
0,
|
||||||
(destructor)meth_dealloc, /* tp_dealloc */
|
meth_dealloc, /* tp_dealloc */
|
||||||
offsetof(PyCFunctionObject, vectorcall), /* tp_vectorcall_offset */
|
offsetof(PyCFunctionObject, vectorcall), /* tp_vectorcall_offset */
|
||||||
0, /* tp_getattr */
|
0, /* tp_getattr */
|
||||||
0, /* tp_setattr */
|
0, /* tp_setattr */
|
||||||
0, /* tp_as_async */
|
0, /* tp_as_async */
|
||||||
(reprfunc)meth_repr, /* tp_repr */
|
meth_repr, /* tp_repr */
|
||||||
0, /* tp_as_number */
|
0, /* tp_as_number */
|
||||||
0, /* tp_as_sequence */
|
0, /* tp_as_sequence */
|
||||||
0, /* tp_as_mapping */
|
0, /* tp_as_mapping */
|
||||||
(hashfunc)meth_hash, /* tp_hash */
|
meth_hash, /* tp_hash */
|
||||||
cfunction_call, /* tp_call */
|
cfunction_call, /* tp_call */
|
||||||
0, /* tp_str */
|
0, /* tp_str */
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
|
@ -352,7 +363,7 @@ PyTypeObject PyCFunction_Type = {
|
||||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||||
Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */
|
Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
(traverseproc)meth_traverse, /* tp_traverse */
|
meth_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
meth_richcompare, /* tp_richcompare */
|
meth_richcompare, /* tp_richcompare */
|
||||||
offsetof(PyCFunctionObject, m_weakreflist), /* tp_weaklistoffset */
|
offsetof(PyCFunctionObject, m_weakreflist), /* tp_weaklistoffset */
|
||||||
|
|
Loading…
Reference in New Issue