blob: 795714d8b52f38cdefe8d3fda5c85616a82ff0af [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Type object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
6/* Type object implementation */
7
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008static PyObject *
Fred Drake45cfbcc2000-07-09 06:21:27 +00009type_getattr(PyTypeObject *t, char *name)
Guido van Rossum29ca26e1995-01-07 11:58:15 +000010{
11 if (strcmp(name, "__name__") == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000012 return PyString_FromString(t->tp_name);
Guido van Rossum29ca26e1995-01-07 11:58:15 +000013 if (strcmp(name, "__doc__") == 0) {
14 char *doc = t->tp_doc;
15 if (doc != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016 return PyString_FromString(doc);
17 Py_INCREF(Py_None);
18 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +000019 }
20 if (strcmp(name, "__members__") == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 return Py_BuildValue("[ss]", "__doc__", "__name__");
22 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum29ca26e1995-01-07 11:58:15 +000023 return NULL;
24}
25
Martin v. Löwis0163d6d2001-06-09 07:34:05 +000026static int
27type_compare(PyObject *v, PyObject *w)
28{
29 /* This is called with type objects only. So we
30 can just compare the addresses. */
31 Py_uintptr_t vv = (Py_uintptr_t)v;
32 Py_uintptr_t ww = (Py_uintptr_t)w;
33 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
34}
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036static PyObject *
Fred Drake45cfbcc2000-07-09 06:21:27 +000037type_repr(PyTypeObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038{
39 char buf[100];
40 sprintf(buf, "<type '%.80s'>", v->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042}
43
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044PyTypeObject PyType_Type = {
45 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 0, /* Number of items for varobject */
47 "type", /* Name of this type */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 sizeof(PyTypeObject), /* Basic object size */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049 0, /* Item size for varobject */
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 0, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +000051 0, /*tp_print*/
Guido van Rossum29ca26e1995-01-07 11:58:15 +000052 (getattrfunc)type_getattr, /*tp_getattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +000053 0, /*tp_setattr*/
Martin v. Löwis0163d6d2001-06-09 07:34:05 +000054 type_compare, /*tp_compare*/
Guido van Rossum29ca26e1995-01-07 11:58:15 +000055 (reprfunc)type_repr, /*tp_repr*/
56 0, /*tp_as_number*/
57 0, /*tp_as_sequence*/
58 0, /*tp_as_mapping*/
Martin v. Löwis0163d6d2001-06-09 07:34:05 +000059 _Py_HashPointer, /*tp_hash*/
Guido van Rossum29ca26e1995-01-07 11:58:15 +000060 0, /*tp_call*/
61 0, /*tp_str*/
62 0, /*tp_xxx1*/
63 0, /*tp_xxx2*/
64 0, /*tp_xxx3*/
65 0, /*tp_xxx4*/
Guido van Rossum80c2a161997-06-02 14:43:07 +000066 "Define the behavior of a particular type of object.",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067};