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>
/*[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 */
@ -579,7 +586,6 @@ static int update_subclasses(PyTypeObject *type, PyObject *name,
update_callback callback, void *data);
static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
update_callback callback, void *data);
static PyObject *type_subclasses(PyTypeObject *type, PyObject *ignored);
static int
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
with dictionary iterators and weak references.
*/
subclasses = type_subclasses(type, NULL);
subclasses = type___subclasses___impl(type);
if (subclasses == NULL)
return -1;
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);
}
static PyObject *
type___instancecheck__(PyObject *type, PyObject *inst)
/*[clinic input]
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)) {
case -1:
return NULL;
case 0:
Py_RETURN_FALSE;
default:
Py_RETURN_TRUE;
}
return _PyObject_RealIsInstance(instance, (PyObject *)self);
}
/*[clinic input]
type.__subclasscheck__ -> bool
static PyObject *
type___subclasscheck__(PyObject *type, PyObject *inst)
subclass: object
/
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)) {
case -1:
return NULL;
case 0:
Py_RETURN_FALSE;
default:
Py_RETURN_TRUE;
}
return _PyObject_RealIsSubclass(subclass, (PyObject *)self);
}
@ -1818,12 +1829,17 @@ mro_implementation(PyTypeObject *type)
return result;
}
static PyObject *
mro_external(PyObject *self)
{
PyTypeObject *type = (PyTypeObject *)self;
/*[clinic input]
type.mro
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
@ -3164,8 +3180,15 @@ type_dealloc(PyTypeObject *type)
Py_TYPE(type)->tp_free((PyObject *)type);
}
/*[clinic input]
type.__subclasses__
Return a list of immediate subclasses.
[clinic start generated code]*/
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;
Py_ssize_t i;
@ -3173,7 +3196,7 @@ type_subclasses(PyTypeObject *type, PyObject *args_ignored)
list = PyList_New(0);
if (list == NULL)
return NULL;
raw = type->tp_subclasses;
raw = self->tp_subclasses;
if (raw == NULL)
return list;
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
metaclass would probably be more confusing than helpful.
*/
/*[clinic input]
type.__dir__
Specialized __dir__ implementation for types.
[clinic start generated code]*/
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 *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);
Py_XDECREF(dict);
return result;
}
static PyObject*
type_sizeof(PyObject *self, PyObject *args_unused)
/*[clinic input]
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;
PyTypeObject *type = (PyTypeObject*)self;
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
PyHeapTypeObject* et = (PyHeapTypeObject*)type;
if (self->tp_flags & Py_TPFLAGS_HEAPTYPE) {
PyHeapTypeObject* et = (PyHeapTypeObject*)self;
size = sizeof(PyHeapTypeObject);
if (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[] = {
{"mro", (PyCFunction)mro_external, METH_NOARGS,
PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
{"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
TYPE_MRO_METHODDEF
TYPE___SUBCLASSES___METHODDEF
{"__prepare__", (PyCFunction)type_prepare,
METH_FASTCALL | METH_CLASS,
PyDoc_STR("__prepare__() -> dict\n"
"used to create the namespace for the class statement")},
{"__instancecheck__", type___instancecheck__, METH_O,
PyDoc_STR("__instancecheck__() -> bool\ncheck if an object is an instance")},
{"__subclasscheck__", type___subclasscheck__, METH_O,
PyDoc_STR("__subclasscheck__() -> bool\ncheck if a class is a subclass")},
{"__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"},
TYPE___INSTANCECHECK___METHODDEF
TYPE___SUBCLASSCHECK___METHODDEF
TYPE___DIR___METHODDEF
TYPE___SIZEOF___METHODDEF
{0}
};
@ -4360,28 +4390,39 @@ _common_reduce(PyObject *self, int proto)
return res;
}
/*[clinic input]
object.__reduce__
protocol: int = 0
/
Helper for pickle.
[clinic start generated code]*/
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;
if (!PyArg_ParseTuple(args, "|i:__reduce__", &proto))
return NULL;
return _common_reduce(self, proto);
return _common_reduce(self, protocol);
}
/*[clinic input]
object.__reduce_ex__
protocol: int = 0
/
Helper for pickle.
[clinic start generated code]*/
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;
PyObject *reduce, *res;
int proto = 0;
_Py_IDENTIFIER(__reduce__);
if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
return NULL;
if (objreduce == NULL) {
objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict,
&PyId___reduce__);
@ -4413,7 +4454,7 @@ object_reduce_ex(PyObject *self, PyObject *args)
Py_DECREF(reduce);
}
return _common_reduce(self, proto);
return _common_reduce(self, protocol);
}
static PyObject *
@ -4442,16 +4483,22 @@ PyDoc_STRVAR(object_init_subclass_doc,
"The default implementation does nothing. It may be\n"
"overridden to extend subclasses.\n");
/*[clinic input]
object.__format__
format_spec: unicode
/
Default object formatter.
[clinic start generated code]*/
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 *result = NULL;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
/* Issue 7994: If we're converting to a string, we
should reject format specifications */
if (PyUnicode_GET_LENGTH(format_spec) > 0) {
@ -4468,8 +4515,15 @@ object_format(PyObject *self, PyObject *args)
return result;
}
/*[clinic input]
object.__sizeof__
Size of object in memory, in bytes.
[clinic start generated code]*/
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;
@ -4485,8 +4539,15 @@ object_sizeof(PyObject *self, PyObject *args)
/* __dir__ for generic objects: returns __dict__, __class__,
and recursively up the __class__.__bases__ chain.
*/
/*[clinic input]
object.__dir__
Default dir() implementation.
[clinic start generated code]*/
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 *dict = NULL;
@ -4530,20 +4591,15 @@ error:
}
static PyMethodDef object_methods[] = {
{"__reduce_ex__", object_reduce_ex, METH_VARARGS,
PyDoc_STR("helper for pickle")},
{"__reduce__", object_reduce, METH_VARARGS,
PyDoc_STR("helper for pickle")},
OBJECT___REDUCE_EX___METHODDEF
OBJECT___REDUCE___METHODDEF
{"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
object_subclasshook_doc},
{"__init_subclass__", object_init_subclass, METH_CLASS | METH_NOARGS,
object_init_subclass_doc},
{"__format__", object_format, METH_VARARGS,
PyDoc_STR("default object formatter")},
{"__sizeof__", object_sizeof, METH_NOARGS,
PyDoc_STR("__sizeof__() -> int\nsize of object in memory, in bytes")},
{"__dir__", object_dir, METH_NOARGS,
PyDoc_STR("__dir__() -> list\ndefault dir() implementation")},
OBJECT___FORMAT___METHODDEF
OBJECT___SIZEOF___METHODDEF
OBJECT___DIR___METHODDEF
{0}
};