bpo-20185: Convert typeobject.c to Argument Clinic. (#544)

Based on patch by Vajrasky Kok.
This commit is contained in:
Serhiy Storchaka 2017-03-19 08:46:44 +02:00 committed by GitHub
parent bdf6b910f9
commit 5c643a028e
2 changed files with 393 additions and 78 deletions

View File

@ -0,0 +1,259 @@
/*[clinic input]
preserve
[clinic start generated code]*/
PyDoc_STRVAR(type___instancecheck____doc__,
"__instancecheck__($self, instance, /)\n"
"--\n"
"\n"
"Check if an object is an instance.");
#define TYPE___INSTANCECHECK___METHODDEF \
{"__instancecheck__", (PyCFunction)type___instancecheck__, METH_O, type___instancecheck____doc__},
static int
type___instancecheck___impl(PyTypeObject *self, PyObject *instance);
static PyObject *
type___instancecheck__(PyTypeObject *self, PyObject *instance)
{
PyObject *return_value = NULL;
int _return_value;
_return_value = type___instancecheck___impl(self, instance);
if ((_return_value == -1) && PyErr_Occurred()) {
goto exit;
}
return_value = PyBool_FromLong((long)_return_value);
exit:
return return_value;
}
PyDoc_STRVAR(type___subclasscheck____doc__,
"__subclasscheck__($self, subclass, /)\n"
"--\n"
"\n"
"Check if a class is a subclass.");
#define TYPE___SUBCLASSCHECK___METHODDEF \
{"__subclasscheck__", (PyCFunction)type___subclasscheck__, METH_O, type___subclasscheck____doc__},
static int
type___subclasscheck___impl(PyTypeObject *self, PyObject *subclass);
static PyObject *
type___subclasscheck__(PyTypeObject *self, PyObject *subclass)
{
PyObject *return_value = NULL;
int _return_value;
_return_value = type___subclasscheck___impl(self, subclass);
if ((_return_value == -1) && PyErr_Occurred()) {
goto exit;
}
return_value = PyBool_FromLong((long)_return_value);
exit:
return return_value;
}
PyDoc_STRVAR(type_mro__doc__,
"mro($self, /)\n"
"--\n"
"\n"
"Return a type\'s method resolution order.");
#define TYPE_MRO_METHODDEF \
{"mro", (PyCFunction)type_mro, METH_NOARGS, type_mro__doc__},
static PyObject *
type_mro_impl(PyTypeObject *self);
static PyObject *
type_mro(PyTypeObject *self, PyObject *Py_UNUSED(ignored))
{
return type_mro_impl(self);
}
PyDoc_STRVAR(type___subclasses____doc__,
"__subclasses__($self, /)\n"
"--\n"
"\n"
"Return a list of immediate subclasses.");
#define TYPE___SUBCLASSES___METHODDEF \
{"__subclasses__", (PyCFunction)type___subclasses__, METH_NOARGS, type___subclasses____doc__},
static PyObject *
type___subclasses___impl(PyTypeObject *self);
static PyObject *
type___subclasses__(PyTypeObject *self, PyObject *Py_UNUSED(ignored))
{
return type___subclasses___impl(self);
}
PyDoc_STRVAR(type___dir____doc__,
"__dir__($self, /)\n"
"--\n"
"\n"
"Specialized __dir__ implementation for types.");
#define TYPE___DIR___METHODDEF \
{"__dir__", (PyCFunction)type___dir__, METH_NOARGS, type___dir____doc__},
static PyObject *
type___dir___impl(PyTypeObject *self);
static PyObject *
type___dir__(PyTypeObject *self, PyObject *Py_UNUSED(ignored))
{
return type___dir___impl(self);
}
PyDoc_STRVAR(type___sizeof____doc__,
"__sizeof__($self, /)\n"
"--\n"
"\n"
"Return memory consumption of the type object.");
#define TYPE___SIZEOF___METHODDEF \
{"__sizeof__", (PyCFunction)type___sizeof__, METH_NOARGS, type___sizeof____doc__},
static PyObject *
type___sizeof___impl(PyTypeObject *self);
static PyObject *
type___sizeof__(PyTypeObject *self, PyObject *Py_UNUSED(ignored))
{
return type___sizeof___impl(self);
}
PyDoc_STRVAR(object___reduce____doc__,
"__reduce__($self, protocol=0, /)\n"
"--\n"
"\n"
"Helper for pickle.");
#define OBJECT___REDUCE___METHODDEF \
{"__reduce__", (PyCFunction)object___reduce__, METH_FASTCALL, object___reduce____doc__},
static PyObject *
object___reduce___impl(PyObject *self, int protocol);
static PyObject *
object___reduce__(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
int protocol = 0;
if (!_PyArg_ParseStack(args, nargs, "|i:__reduce__",
&protocol)) {
goto exit;
}
if (!_PyArg_NoStackKeywords("__reduce__", kwnames)) {
goto exit;
}
return_value = object___reduce___impl(self, protocol);
exit:
return return_value;
}
PyDoc_STRVAR(object___reduce_ex____doc__,
"__reduce_ex__($self, protocol=0, /)\n"
"--\n"
"\n"
"Helper for pickle.");
#define OBJECT___REDUCE_EX___METHODDEF \
{"__reduce_ex__", (PyCFunction)object___reduce_ex__, METH_FASTCALL, object___reduce_ex____doc__},
static PyObject *
object___reduce_ex___impl(PyObject *self, int protocol);
static PyObject *
object___reduce_ex__(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
int protocol = 0;
if (!_PyArg_ParseStack(args, nargs, "|i:__reduce_ex__",
&protocol)) {
goto exit;
}
if (!_PyArg_NoStackKeywords("__reduce_ex__", kwnames)) {
goto exit;
}
return_value = object___reduce_ex___impl(self, protocol);
exit:
return return_value;
}
PyDoc_STRVAR(object___format____doc__,
"__format__($self, format_spec, /)\n"
"--\n"
"\n"
"Default object formatter.");
#define OBJECT___FORMAT___METHODDEF \
{"__format__", (PyCFunction)object___format__, METH_O, object___format____doc__},
static PyObject *
object___format___impl(PyObject *self, PyObject *format_spec);
static PyObject *
object___format__(PyObject *self, PyObject *arg)
{
PyObject *return_value = NULL;
PyObject *format_spec;
if (!PyArg_Parse(arg, "U:__format__", &format_spec)) {
goto exit;
}
return_value = object___format___impl(self, format_spec);
exit:
return return_value;
}
PyDoc_STRVAR(object___sizeof____doc__,
"__sizeof__($self, /)\n"
"--\n"
"\n"
"Size of object in memory, in bytes.");
#define OBJECT___SIZEOF___METHODDEF \
{"__sizeof__", (PyCFunction)object___sizeof__, METH_NOARGS, object___sizeof____doc__},
static PyObject *
object___sizeof___impl(PyObject *self);
static PyObject *
object___sizeof__(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return object___sizeof___impl(self);
}
PyDoc_STRVAR(object___dir____doc__,
"__dir__($self, /)\n"
"--\n"
"\n"
"Default dir() implementation.");
#define OBJECT___DIR___METHODDEF \
{"__dir__", (PyCFunction)object___dir__, METH_NOARGS, object___dir____doc__},
static PyObject *
object___dir___impl(PyObject *self);
static PyObject *
object___dir__(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return object___dir___impl(self);
}
/*[clinic end generated code: output=ce354e436e2360a0 input=a9049054013a1b77]*/

View File

@ -6,6 +6,13 @@
#include <ctype.h> #include <ctype.h>
/*[clinic input]
class type "PyTypeObject *" "&PyType_Type"
class object "PyObject *" "&PyBaseObject_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b94608d231c434b]*/
#include "clinic/typeobject.c.h"
/* Support type attribute cache */ /* Support type attribute cache */
@ -579,7 +586,6 @@ static int update_subclasses(PyTypeObject *type, PyObject *name,
update_callback callback, void *data); update_callback callback, void *data);
static int recurse_down_subclasses(PyTypeObject *type, PyObject *name, static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
update_callback callback, void *data); update_callback callback, void *data);
static PyObject *type_subclasses(PyTypeObject *type, PyObject *ignored);
static int static int
mro_hierarchy(PyTypeObject *type, PyObject *temp) mro_hierarchy(PyTypeObject *type, PyObject *temp)
@ -624,7 +630,7 @@ mro_hierarchy(PyTypeObject *type, PyObject *temp)
Finally, this makes things simple avoiding the need to deal Finally, this makes things simple avoiding the need to deal
with dictionary iterators and weak references. with dictionary iterators and weak references.
*/ */
subclasses = type_subclasses(type, NULL); subclasses = type___subclasses___impl(type);
if (subclasses == NULL) if (subclasses == NULL)
return -1; return -1;
n = PyList_GET_SIZE(subclasses); n = PyList_GET_SIZE(subclasses);
@ -819,31 +825,36 @@ type_set_doc(PyTypeObject *type, PyObject *value, void *context)
return _PyDict_SetItemId(type->tp_dict, &PyId___doc__, value); return _PyDict_SetItemId(type->tp_dict, &PyId___doc__, value);
} }
static PyObject * /*[clinic input]
type___instancecheck__(PyObject *type, PyObject *inst) type.__instancecheck__ -> bool
instance: object
/
Check if an object is an instance.
[clinic start generated code]*/
static int
type___instancecheck___impl(PyTypeObject *self, PyObject *instance)
/*[clinic end generated code: output=08b6bf5f591c3618 input=cdbfeaee82c01a0f]*/
{ {
switch (_PyObject_RealIsInstance(inst, type)) { return _PyObject_RealIsInstance(instance, (PyObject *)self);
case -1:
return NULL;
case 0:
Py_RETURN_FALSE;
default:
Py_RETURN_TRUE;
}
} }
/*[clinic input]
type.__subclasscheck__ -> bool
static PyObject * subclass: object
type___subclasscheck__(PyObject *type, PyObject *inst) /
Check if a class is a subclass.
[clinic start generated code]*/
static int
type___subclasscheck___impl(PyTypeObject *self, PyObject *subclass)
/*[clinic end generated code: output=97a4e51694500941 input=071b2ca9e03355f4]*/
{ {
switch (_PyObject_RealIsSubclass(inst, type)) { return _PyObject_RealIsSubclass(subclass, (PyObject *)self);
case -1:
return NULL;
case 0:
Py_RETURN_FALSE;
default:
Py_RETURN_TRUE;
}
} }
@ -1818,12 +1829,17 @@ mro_implementation(PyTypeObject *type)
return result; return result;
} }
static PyObject * /*[clinic input]
mro_external(PyObject *self) type.mro
{
PyTypeObject *type = (PyTypeObject *)self;
return mro_implementation(type); Return a type's method resolution order.
[clinic start generated code]*/
static PyObject *
type_mro_impl(PyTypeObject *self)
/*[clinic end generated code: output=bffc4a39b5b57027 input=28414f4e156db28d]*/
{
return mro_implementation(self);
} }
static int static int
@ -3164,8 +3180,15 @@ type_dealloc(PyTypeObject *type)
Py_TYPE(type)->tp_free((PyObject *)type); Py_TYPE(type)->tp_free((PyObject *)type);
} }
/*[clinic input]
type.__subclasses__
Return a list of immediate subclasses.
[clinic start generated code]*/
static PyObject * static PyObject *
type_subclasses(PyTypeObject *type, PyObject *args_ignored) type___subclasses___impl(PyTypeObject *self)
/*[clinic end generated code: output=eb5eb54485942819 input=5af66132436f9a7b]*/
{ {
PyObject *list, *raw, *ref; PyObject *list, *raw, *ref;
Py_ssize_t i; Py_ssize_t i;
@ -3173,7 +3196,7 @@ type_subclasses(PyTypeObject *type, PyObject *args_ignored)
list = PyList_New(0); list = PyList_New(0);
if (list == NULL) if (list == NULL)
return NULL; return NULL;
raw = type->tp_subclasses; raw = self->tp_subclasses;
if (raw == NULL) if (raw == NULL)
return list; return list;
assert(PyDict_CheckExact(raw)); assert(PyDict_CheckExact(raw));
@ -3262,26 +3285,39 @@ merge_class_dict(PyObject *dict, PyObject *aclass)
We deliberately don't suck up its __class__, as methods belonging to the We deliberately don't suck up its __class__, as methods belonging to the
metaclass would probably be more confusing than helpful. metaclass would probably be more confusing than helpful.
*/ */
/*[clinic input]
type.__dir__
Specialized __dir__ implementation for types.
[clinic start generated code]*/
static PyObject * static PyObject *
type_dir(PyObject *self, PyObject *args) type___dir___impl(PyTypeObject *self)
/*[clinic end generated code: output=69d02fe92c0f15fa input=7733befbec645968]*/
{ {
PyObject *result = NULL; PyObject *result = NULL;
PyObject *dict = PyDict_New(); PyObject *dict = PyDict_New();
if (dict != NULL && merge_class_dict(dict, self) == 0) if (dict != NULL && merge_class_dict(dict, (PyObject *)self) == 0)
result = PyDict_Keys(dict); result = PyDict_Keys(dict);
Py_XDECREF(dict); Py_XDECREF(dict);
return result; return result;
} }
static PyObject* /*[clinic input]
type_sizeof(PyObject *self, PyObject *args_unused) type.__sizeof__
Return memory consumption of the type object.
[clinic start generated code]*/
static PyObject *
type___sizeof___impl(PyTypeObject *self)
/*[clinic end generated code: output=766f4f16cd3b1854 input=99398f24b9cf45d6]*/
{ {
Py_ssize_t size; Py_ssize_t size;
PyTypeObject *type = (PyTypeObject*)self; if (self->tp_flags & Py_TPFLAGS_HEAPTYPE) {
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { PyHeapTypeObject* et = (PyHeapTypeObject*)self;
PyHeapTypeObject* et = (PyHeapTypeObject*)type;
size = sizeof(PyHeapTypeObject); size = sizeof(PyHeapTypeObject);
if (et->ht_cached_keys) if (et->ht_cached_keys)
size += _PyDict_KeysSize(et->ht_cached_keys); size += _PyDict_KeysSize(et->ht_cached_keys);
@ -3292,22 +3328,16 @@ type_sizeof(PyObject *self, PyObject *args_unused)
} }
static PyMethodDef type_methods[] = { static PyMethodDef type_methods[] = {
{"mro", (PyCFunction)mro_external, METH_NOARGS, TYPE_MRO_METHODDEF
PyDoc_STR("mro() -> list\nreturn a type's method resolution order")}, TYPE___SUBCLASSES___METHODDEF
{"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
{"__prepare__", (PyCFunction)type_prepare, {"__prepare__", (PyCFunction)type_prepare,
METH_FASTCALL | METH_CLASS, METH_FASTCALL | METH_CLASS,
PyDoc_STR("__prepare__() -> dict\n" PyDoc_STR("__prepare__() -> dict\n"
"used to create the namespace for the class statement")}, "used to create the namespace for the class statement")},
{"__instancecheck__", type___instancecheck__, METH_O, TYPE___INSTANCECHECK___METHODDEF
PyDoc_STR("__instancecheck__() -> bool\ncheck if an object is an instance")}, TYPE___SUBCLASSCHECK___METHODDEF
{"__subclasscheck__", type___subclasscheck__, METH_O, TYPE___DIR___METHODDEF
PyDoc_STR("__subclasscheck__() -> bool\ncheck if a class is a subclass")}, TYPE___SIZEOF___METHODDEF
{"__dir__", type_dir, METH_NOARGS,
PyDoc_STR("__dir__() -> list\nspecialized __dir__ implementation for types")},
{"__sizeof__", type_sizeof, METH_NOARGS,
"__sizeof__() -> int\nreturn memory consumption of the type object"},
{0} {0}
}; };
@ -4360,28 +4390,39 @@ _common_reduce(PyObject *self, int proto)
return res; return res;
} }
/*[clinic input]
object.__reduce__
protocol: int = 0
/
Helper for pickle.
[clinic start generated code]*/
static PyObject * static PyObject *
object_reduce(PyObject *self, PyObject *args) object___reduce___impl(PyObject *self, int protocol)
/*[clinic end generated code: output=5572e699c467dd5b input=227f37ed68bd938a]*/
{ {
int proto = 0; return _common_reduce(self, protocol);
if (!PyArg_ParseTuple(args, "|i:__reduce__", &proto))
return NULL;
return _common_reduce(self, proto);
} }
/*[clinic input]
object.__reduce_ex__
protocol: int = 0
/
Helper for pickle.
[clinic start generated code]*/
static PyObject * static PyObject *
object_reduce_ex(PyObject *self, PyObject *args) object___reduce_ex___impl(PyObject *self, int protocol)
/*[clinic end generated code: output=2e157766f6b50094 input=8dd6a9602a12749e]*/
{ {
static PyObject *objreduce; static PyObject *objreduce;
PyObject *reduce, *res; PyObject *reduce, *res;
int proto = 0;
_Py_IDENTIFIER(__reduce__); _Py_IDENTIFIER(__reduce__);
if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
return NULL;
if (objreduce == NULL) { if (objreduce == NULL) {
objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict, objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict,
&PyId___reduce__); &PyId___reduce__);
@ -4413,7 +4454,7 @@ object_reduce_ex(PyObject *self, PyObject *args)
Py_DECREF(reduce); Py_DECREF(reduce);
} }
return _common_reduce(self, proto); return _common_reduce(self, protocol);
} }
static PyObject * static PyObject *
@ -4442,16 +4483,22 @@ PyDoc_STRVAR(object_init_subclass_doc,
"The default implementation does nothing. It may be\n" "The default implementation does nothing. It may be\n"
"overridden to extend subclasses.\n"); "overridden to extend subclasses.\n");
/*[clinic input]
object.__format__
format_spec: unicode
/
Default object formatter.
[clinic start generated code]*/
static PyObject * static PyObject *
object_format(PyObject *self, PyObject *args) object___format___impl(PyObject *self, PyObject *format_spec)
/*[clinic end generated code: output=34897efb543a974b input=7c3b3bc53a6fb7fa]*/
{ {
PyObject *format_spec;
PyObject *self_as_str = NULL; PyObject *self_as_str = NULL;
PyObject *result = NULL; PyObject *result = NULL;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
/* Issue 7994: If we're converting to a string, we /* Issue 7994: If we're converting to a string, we
should reject format specifications */ should reject format specifications */
if (PyUnicode_GET_LENGTH(format_spec) > 0) { if (PyUnicode_GET_LENGTH(format_spec) > 0) {
@ -4468,8 +4515,15 @@ object_format(PyObject *self, PyObject *args)
return result; return result;
} }
/*[clinic input]
object.__sizeof__
Size of object in memory, in bytes.
[clinic start generated code]*/
static PyObject * static PyObject *
object_sizeof(PyObject *self, PyObject *args) object___sizeof___impl(PyObject *self)
/*[clinic end generated code: output=73edab332f97d550 input=1200ff3dfe485306]*/
{ {
Py_ssize_t res, isize; Py_ssize_t res, isize;
@ -4485,8 +4539,15 @@ object_sizeof(PyObject *self, PyObject *args)
/* __dir__ for generic objects: returns __dict__, __class__, /* __dir__ for generic objects: returns __dict__, __class__,
and recursively up the __class__.__bases__ chain. and recursively up the __class__.__bases__ chain.
*/ */
/*[clinic input]
object.__dir__
Default dir() implementation.
[clinic start generated code]*/
static PyObject * static PyObject *
object_dir(PyObject *self, PyObject *args) object___dir___impl(PyObject *self)
/*[clinic end generated code: output=66dd48ea62f26c90 input=0a89305bec669b10]*/
{ {
PyObject *result = NULL; PyObject *result = NULL;
PyObject *dict = NULL; PyObject *dict = NULL;
@ -4530,20 +4591,15 @@ error:
} }
static PyMethodDef object_methods[] = { static PyMethodDef object_methods[] = {
{"__reduce_ex__", object_reduce_ex, METH_VARARGS, OBJECT___REDUCE_EX___METHODDEF
PyDoc_STR("helper for pickle")}, OBJECT___REDUCE___METHODDEF
{"__reduce__", object_reduce, METH_VARARGS,
PyDoc_STR("helper for pickle")},
{"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS, {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
object_subclasshook_doc}, object_subclasshook_doc},
{"__init_subclass__", object_init_subclass, METH_CLASS | METH_NOARGS, {"__init_subclass__", object_init_subclass, METH_CLASS | METH_NOARGS,
object_init_subclass_doc}, object_init_subclass_doc},
{"__format__", object_format, METH_VARARGS, OBJECT___FORMAT___METHODDEF
PyDoc_STR("default object formatter")}, OBJECT___SIZEOF___METHODDEF
{"__sizeof__", object_sizeof, METH_NOARGS, OBJECT___DIR___METHODDEF
PyDoc_STR("__sizeof__() -> int\nsize of object in memory, in bytes")},
{"__dir__", object_dir, METH_NOARGS,
PyDoc_STR("__dir__() -> list\ndefault dir() implementation")},
{0} {0}
}; };