annotate Objects/typeobject.c @ 19814:dc87d91d0dfd legacy-trunk

Don't call MacOS.SchedParams() in MachO, it doesn't exist.
author Jack Jansen <jack.jansen@cwi.nl>
date Sun, 09 Sep 2001 00:36:01 +0000
parents 0584c9132525
children fc40d0b54043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Type object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
4 #include "Python.h"
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5 #include "structmember.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
7 static struct memberlist type_members[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
8 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
9 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
10 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
11 {"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY},
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
12 {"__weakrefoffset__", T_LONG,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
13 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
14 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
15 {"__dictoffset__", T_LONG,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
16 offsetof(PyTypeObject, tp_dictoffset), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
17 {"__bases__", T_OBJECT, offsetof(PyTypeObject, tp_bases), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
18 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
19 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
20 };
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
22 static PyObject *
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
23 type_name(PyTypeObject *type, void *context)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
24 {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
25 char *s;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
26
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
27 s = strrchr(type->tp_name, '.');
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
28 if (s == NULL)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
29 s = type->tp_name;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
30 else
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
31 s++;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
32 return PyString_FromString(s);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
33 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
34
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
35 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
36 type_module(PyTypeObject *type, void *context)
2080
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
37 {
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
38 PyObject *mod;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
39 char *s;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
40
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
41 s = strrchr(type->tp_name, '.');
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
42 if (s != NULL)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
43 return PyString_FromStringAndSize(type->tp_name,
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
44 (int)(s - type->tp_name));
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
45 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
46 return PyString_FromString("__builtin__");
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
47 mod = PyDict_GetItemString(type->tp_defined, "__module__");
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
48 if (mod != NULL && PyString_Check(mod)) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
49 Py_INCREF(mod);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
50 return mod;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
51 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
52 PyErr_SetString(PyExc_AttributeError, "__module__");
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
53 return NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
54 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
55
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
56 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
57 type_dict(PyTypeObject *type, void *context)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
58 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
59 if (type->tp_dict == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
60 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
61 return Py_None;
2080
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
62 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
63 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
64 Py_INCREF(type->tp_dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
65 return type->tp_dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
66 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
67 return PyDictProxy_New(type->tp_dict);
2080
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
68 }
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
69
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
70 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
71 type_defined(PyTypeObject *type, void *context)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
72 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
73 if (type->tp_defined == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
74 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
75 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
76 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
77 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
78 Py_INCREF(type->tp_defined);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
79 return type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
80 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
81 return PyDictProxy_New(type->tp_defined);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
82 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
83
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
84 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
85 type_dynamic(PyTypeObject *type, void *context)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
86 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
87 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
88
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
89 res = (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) ? Py_True : Py_False;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
90 Py_INCREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
91 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
92 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
93
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
94 struct getsetlist type_getsets[] = {
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
95 {"__name__", (getter)type_name, NULL, NULL},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
96 {"__module__", (getter)type_module, NULL, NULL},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
97 {"__dict__", (getter)type_dict, NULL, NULL},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
98 {"__defined__", (getter)type_defined, NULL, NULL},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
99 {"__dynamic__", (getter)type_dynamic, NULL, NULL},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
100 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
101 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
102
18063
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
103 static int
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
104 type_compare(PyObject *v, PyObject *w)
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
105 {
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
106 /* This is called with type objects only. So we
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
107 can just compare the addresses. */
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
108 Py_uintptr_t vv = (Py_uintptr_t)v;
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
109 Py_uintptr_t ww = (Py_uintptr_t)w;
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
110 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
111 }
bbac2a6a5d16 Patch #424475: Speed-up tp_compare usage, by special-casing the common
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
112
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
113 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
114 type_repr(PyTypeObject *type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 {
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
116 PyObject *mod, *name, *rtn;
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
117
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
118 mod = type_module(type, NULL);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
119 if (mod == NULL)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
120 PyErr_Clear();
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
121 else if (!PyString_Check(mod)) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
122 Py_DECREF(mod);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
123 mod = NULL;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
124 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
125 name = type_name(type, NULL);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
126 if (name == NULL)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
127 return NULL;
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
128
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
129 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
130 rtn = PyString_FromFormat("<type '%s.%s'>",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
131 PyString_AS_STRING(mod),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
132 PyString_AS_STRING(name));
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
133 }
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
134 else
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
135 rtn = PyString_FromFormat("<type '%s'>", type->tp_name);
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
136
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
137 Py_XDECREF(mod);
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
138 Py_DECREF(name);
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
139 return rtn;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
142 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
143 type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
144 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
145 PyObject *obj;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
146
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
147 if (type->tp_new == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
148 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
149 "cannot create '%.100s' instances",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
150 type->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
151 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
152 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
153
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
154 obj = type->tp_new(type, args, NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
155 if (obj != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
156 type = obj->ob_type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
157 if (type->tp_init != NULL &&
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
158 type->tp_init(obj, args, kwds) < 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
159 Py_DECREF(obj);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
160 obj = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
161 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
162 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
163 return obj;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
164 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
165
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
166 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
167 PyType_GenericAlloc(PyTypeObject *type, int nitems)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
168 {
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
169 #define PTRSIZE (sizeof(PyObject *))
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
170
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
171 int size;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
172 PyObject *obj;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
173
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
174 /* Inline PyObject_New() so we can zero the memory */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
175 size = _PyObject_VAR_SIZE(type, nitems);
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
176 /* Round up size, if necessary, so we fully zero out __dict__ */
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
177 if (type->tp_itemsize % PTRSIZE != 0) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
178 size += PTRSIZE - 1;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
179 size /= PTRSIZE;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
180 size *= PTRSIZE;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
181 }
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
182 if (PyType_IS_GC(type)) {
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
183 obj = _PyObject_GC_Malloc(type, nitems);
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
184 }
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
185 else {
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
186 obj = PyObject_MALLOC(size);
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
187 }
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
188 if (obj == NULL)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
189 return PyErr_NoMemory();
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
190 memset(obj, '\0', size);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
191 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
192 Py_INCREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
193 if (type->tp_itemsize == 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
194 PyObject_INIT(obj, type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
195 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
196 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
197 if (PyType_IS_GC(type))
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
198 _PyObject_GC_TRACK(obj);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
199 return obj;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
200 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
201
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
202 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
203 PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
204 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
205 return type->tp_alloc(type, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
206 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
207
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
208 /* Helper for subtyping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
209
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
210 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
211 subtype_dealloc(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
212 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
213 PyTypeObject *type, *base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
214 destructor f;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
215
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
216 /* This exists so we can DECREF self->ob_type */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
217
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
218 /* Find the nearest base with a different tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
219 type = self->ob_type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
220 base = type->tp_base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
221 while ((f = base->tp_dealloc) == subtype_dealloc) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
222 base = base->tp_base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
223 assert(base);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
224 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
225
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
226 /* If we added a dict, DECREF it */
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
227 if (type->tp_dictoffset && !base->tp_dictoffset) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
228 PyObject **dictptr = _PyObject_GetDictPtr(self);
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
229 if (dictptr != NULL) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
230 PyObject *dict = *dictptr;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
231 if (dict != NULL) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
232 Py_DECREF(dict);
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
233 *dictptr = NULL;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
234 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
235 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
236 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
237
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
238 /* If we added weaklist, we clear it */
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
239 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
240 PyObject_ClearWeakRefs(self);
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
241
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
242 /* Finalize GC if the base doesn't do GC and we do */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
243 if (PyType_IS_GC(type) && !PyType_IS_GC(base))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
244 PyObject_GC_Fini(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
245
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
246 /* Call the base tp_dealloc() */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
247 assert(f);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
248 f(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
249
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
250 /* Can't reference self beyond this point */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
251 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
252 Py_DECREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
253 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
254 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
255
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
256 staticforward void override_slots(PyTypeObject *type, PyObject *dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
257 staticforward PyTypeObject *solid_base(PyTypeObject *type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
258
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
259 typedef struct {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
260 PyTypeObject type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
261 PyNumberMethods as_number;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
262 PySequenceMethods as_sequence;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
263 PyMappingMethods as_mapping;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
264 PyBufferProcs as_buffer;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
265 PyObject *name, *slots;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
266 struct memberlist members[1];
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
267 } etype;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
268
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
269 /* type test with subclassing support */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
270
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
271 int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
272 PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
273 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
274 PyObject *mro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
275
19803
32cfce4d83dc PyType_IsSubtype(): test tp_flags for HAVE_CLASS bit before accessing
Guido van Rossum <guido@python.org>
parents: 19630
diff changeset
276 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
32cfce4d83dc PyType_IsSubtype(): test tp_flags for HAVE_CLASS bit before accessing
Guido van Rossum <guido@python.org>
parents: 19630
diff changeset
277 return b == a || b == &PyBaseObject_Type;
32cfce4d83dc PyType_IsSubtype(): test tp_flags for HAVE_CLASS bit before accessing
Guido van Rossum <guido@python.org>
parents: 19630
diff changeset
278
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
279 mro = a->tp_mro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
280 if (mro != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
281 /* Deal with multiple inheritance without recursion
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
282 by walking the MRO tuple */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
283 int i, n;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
284 assert(PyTuple_Check(mro));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
285 n = PyTuple_GET_SIZE(mro);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
286 for (i = 0; i < n; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
287 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
288 return 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
289 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
290 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
291 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
292 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
293 /* a is not completely initilized yet; follow tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
294 do {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
295 if (a == b)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
296 return 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
297 a = a->tp_base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
298 } while (a != NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
299 return b == &PyBaseObject_Type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
300 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
301 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
302
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
303 /* Internal routine to do a method lookup in the type
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
304 without looking in the instance dictionary
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
305 (so we can't use PyObject_GetAttr) but still binding
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
306 it to the instance. The arguments are the object,
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
307 the method name as a C string, and the address of a
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
308 static variable used to cache the interned Python string. */
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
309
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
310 static PyObject *
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
311 lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
312 {
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
313 PyObject *res;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
314
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
315 if (*attrobj == NULL) {
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
316 *attrobj = PyString_InternFromString(attrstr);
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
317 if (*attrobj == NULL)
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
318 return NULL;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
319 }
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
320 res = _PyType_Lookup(self->ob_type, *attrobj);
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
321 if (res == NULL)
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
322 PyErr_SetObject(PyExc_AttributeError, *attrobj);
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
323 else {
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
324 descrgetfunc f;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
325 if ((f = res->ob_type->tp_descr_get) == NULL)
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
326 Py_INCREF(res);
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
327 else
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
328 res = f(res, self, (PyObject *)(self->ob_type));
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
329 }
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
330 return res;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
331 }
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
332
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
333 /* A variation of PyObject_CallMethod that uses lookup_method()
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
334 instead of PyObject_GetAttrString(). This uses the same convention
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
335 as lookup_method to cache the interned name string object. */
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
336
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
337 PyObject *
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
338 call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
339 {
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
340 va_list va;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
341 PyObject *args, *func = 0, *retval;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
342 PyObject *dummy_str = NULL;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
343 va_start(va, format);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
344
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
345 func = lookup_method(o, name, &dummy_str);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
346 Py_XDECREF(dummy_str);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
347 if (func == NULL) {
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
348 va_end(va);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
349 PyErr_SetString(PyExc_AttributeError, name);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
350 return 0;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
351 }
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
352
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
353 if (format && *format)
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
354 args = Py_VaBuildValue(format, va);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
355 else
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
356 args = PyTuple_New(0);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
357
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
358 va_end(va);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
359
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
360 if (!args)
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
361 return NULL;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
362
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
363 if (!PyTuple_Check(args)) {
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
364 PyObject *a;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
365
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
366 a = PyTuple_New(1);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
367 if (a == NULL)
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
368 return NULL;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
369 if (PyTuple_SetItem(a, 0, args) < 0)
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
370 return NULL;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
371 args = a;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
372 }
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
373
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
374 retval = PyObject_CallObject(func, args);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
375
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
376 Py_DECREF(args);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
377 Py_DECREF(func);
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
378
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
379 return retval;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
380 }
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
381
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
382 /* Method resolution order algorithm from "Putting Metaclasses to Work"
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
383 by Forman and Danforth (Addison-Wesley 1999). */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
384
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
385 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
386 conservative_merge(PyObject *left, PyObject *right)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
387 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
388 int left_size;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
389 int right_size;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
390 int i, j, r, ok;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
391 PyObject *temp, *rr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
392
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
393 assert(PyList_Check(left));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
394 assert(PyList_Check(right));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
395
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
396 again:
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
397 left_size = PyList_GET_SIZE(left);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
398 right_size = PyList_GET_SIZE(right);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
399 for (i = 0; i < left_size; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
400 for (j = 0; j < right_size; j++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
401 if (PyList_GET_ITEM(left, i) ==
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
402 PyList_GET_ITEM(right, j)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
403 /* found a merge point */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
404 temp = PyList_New(0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
405 if (temp == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
406 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
407 for (r = 0; r < j; r++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
408 rr = PyList_GET_ITEM(right, r);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
409 ok = PySequence_Contains(left, rr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
410 if (ok < 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
411 Py_DECREF(temp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
412 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
413 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
414 if (!ok) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
415 ok = PyList_Append(temp, rr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
416 if (ok < 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
417 Py_DECREF(temp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
418 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
419 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
420 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
421 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
422 ok = PyList_SetSlice(left, i, i, temp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
423 Py_DECREF(temp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
424 if (ok < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
425 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
426 ok = PyList_SetSlice(right, 0, j+1, NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
427 if (ok < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
428 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
429 goto again;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
430 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
431 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
432 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
433 return PyList_SetSlice(left, left_size, left_size, right);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
434 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
435
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
436 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
437 serious_order_disagreements(PyObject *left, PyObject *right)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
438 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
439 return 0; /* XXX later -- for now, we cheat: "don't do that" */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
440 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
441
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
442 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
443 mro_implementation(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
444 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
445 int i, n, ok;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
446 PyObject *bases, *result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
447
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
448 bases = type->tp_bases;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
449 n = PyTuple_GET_SIZE(bases);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
450 result = Py_BuildValue("[O]", (PyObject *)type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
451 if (result == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
452 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
453 for (i = 0; i < n; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
454 PyTypeObject *base =
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
455 (PyTypeObject *) PyTuple_GET_ITEM(bases, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
456 PyObject *parentMRO = PySequence_List(base->tp_mro);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
457 if (parentMRO == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
458 Py_DECREF(result);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
459 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
460 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
461 if (serious_order_disagreements(result, parentMRO)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
462 Py_DECREF(result);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
463 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
464 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
465 ok = conservative_merge(result, parentMRO);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
466 Py_DECREF(parentMRO);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
467 if (ok < 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
468 Py_DECREF(result);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
469 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
470 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
471 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
472 return result;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
473 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
474
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
475 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19300
diff changeset
476 mro_external(PyObject *self)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
477 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
478 PyTypeObject *type = (PyTypeObject *)self;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
479
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
480 return mro_implementation(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
481 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
482
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
483 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
484 mro_internal(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
485 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
486 PyObject *mro, *result, *tuple;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
487
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
488 if (type->ob_type == &PyType_Type) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
489 result = mro_implementation(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
490 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
491 else {
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
492 static PyObject *mro_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
493 mro = lookup_method((PyObject *)type, "mro", &mro_str);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
494 if (mro == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
495 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
496 result = PyObject_CallObject(mro, NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
497 Py_DECREF(mro);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
498 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
499 if (result == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
500 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
501 tuple = PySequence_Tuple(result);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
502 Py_DECREF(result);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
503 type->tp_mro = tuple;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
504 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
505 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
506
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
507
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
508 /* Calculate the best base amongst multiple base classes.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
509 This is the first one that's on the path to the "solid base". */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
510
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
511 static PyTypeObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
512 best_base(PyObject *bases)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
513 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
514 int i, n;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
515 PyTypeObject *base, *winner, *candidate, *base_i;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
516
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
517 assert(PyTuple_Check(bases));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
518 n = PyTuple_GET_SIZE(bases);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
519 assert(n > 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
520 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
521 winner = &PyBaseObject_Type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
522 for (i = 0; i < n; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
523 base_i = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
524 if (!PyType_Check((PyObject *)base_i)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
525 PyErr_SetString(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
526 PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
527 "bases must be types");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
528 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
529 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
530 if (base_i->tp_dict == NULL) {
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
531 if (PyType_Ready(base_i) < 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
532 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
533 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
534 candidate = solid_base(base_i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
535 if (PyType_IsSubtype(winner, candidate))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
536 ;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
537 else if (PyType_IsSubtype(candidate, winner)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
538 winner = candidate;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
539 base = base_i;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
540 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
541 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
542 PyErr_SetString(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
543 PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
544 "multiple bases have "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
545 "instance lay-out conflict");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
546 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
547 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
548 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
549 assert(base != NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
550 return base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
551 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
552
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
553 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
554 extra_ivars(PyTypeObject *type, PyTypeObject *base)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
555 {
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
556 size_t t_size = type->tp_basicsize;
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
557 size_t b_size = base->tp_basicsize;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
558
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
559 assert(t_size >= b_size); /* Else type smaller than base! */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
560 if (type->tp_itemsize || base->tp_itemsize) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
561 /* If itemsize is involved, stricter rules */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
562 return t_size != b_size ||
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
563 type->tp_itemsize != base->tp_itemsize;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
564 }
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
565 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
566 type->tp_weaklistoffset + sizeof(PyObject *) == t_size)
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
567 t_size -= sizeof(PyObject *);
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
568 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
569 type->tp_dictoffset + sizeof(PyObject *) == t_size)
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
570 t_size -= sizeof(PyObject *);
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
571
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
572 return t_size != b_size;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
573 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
574
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
575 static PyTypeObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
576 solid_base(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
577 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
578 PyTypeObject *base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
579
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
580 if (type->tp_base)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
581 base = solid_base(type->tp_base);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
582 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
583 base = &PyBaseObject_Type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
584 if (extra_ivars(type, base))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
585 return type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
586 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
587 return base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
588 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
589
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
590 staticforward void object_dealloc(PyObject *);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
591 staticforward int object_init(PyObject *, PyObject *, PyObject *);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
592
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
593 static PyObject *
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
594 subtype_dict(PyObject *obj, void *context)
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
595 {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
596 PyObject **dictptr = _PyObject_GetDictPtr(obj);
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
597 PyObject *dict;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
598
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
599 if (dictptr == NULL) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
600 PyErr_SetString(PyExc_AttributeError,
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
601 "This object has no __dict__");
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
602 return NULL;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
603 }
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
604 dict = *dictptr;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
605 if (dict == NULL) {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
606 Py_INCREF(Py_None);
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
607 return Py_None;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
608 }
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
609 else {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
610 Py_INCREF(dict);
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
611 return dict;
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
612 }
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
613 }
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
614
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
615 struct getsetlist subtype_getsets[] = {
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
616 {"__dict__", subtype_dict, NULL, NULL},
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
617 {0},
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
618 };
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
619
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
620 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
621 type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
622 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
623 PyObject *name, *bases, *dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
624 static char *kwlist[] = {"name", "bases", "dict", 0};
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
625 PyObject *slots, *tmp;
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
626 PyTypeObject *type, *base, *tmptype, *winner;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
627 etype *et;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
628 struct memberlist *mp;
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
629 int i, nbases, nslots, slotoffset, dynamic, add_dict, add_weak;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
630
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
631 /* Special case: type(x) should return x->ob_type */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
632 if (metatype == &PyType_Type &&
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
633 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
634 (kwds == NULL || (PyDict_Check(kwds) && PyDict_Size(kwds) == 0))) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
635 PyObject *x = PyTuple_GET_ITEM(args, 0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
636 Py_INCREF(x->ob_type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
637 return (PyObject *) x->ob_type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
638 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
639
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
640 /* Check arguments: (name, bases, dict) */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
641 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
642 &name,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
643 &PyTuple_Type, &bases,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
644 &PyDict_Type, &dict))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
645 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
646
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
647 /* Determine the proper metatype to deal with this,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
648 and check for metatype conflicts while we're at it.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
649 Note that if some other metatype wins to contract,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
650 it's possible that its instances are not types. */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
651 nbases = PyTuple_GET_SIZE(bases);
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
652 winner = metatype;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
653 for (i = 0; i < nbases; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
654 tmp = PyTuple_GET_ITEM(bases, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
655 tmptype = tmp->ob_type;
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
656 if (PyType_IsSubtype(winner, tmptype))
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
657 continue;
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
658 if (PyType_IsSubtype(tmptype, winner)) {
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
659 winner = tmptype;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
660 continue;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
661 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
662 PyErr_SetString(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
663 "metatype conflict among bases");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
664 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
665 }
19329
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
666 if (winner != metatype) {
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
667 if (winner->tp_new != type_new) /* Pass it to the winner */
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
668 return winner->tp_new(winner, args, kwds);
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
669 metatype = winner;
f93c16c10a55 type_new(): only defer to the winning metatype if it's different from
Guido van Rossum <guido@python.org>
parents: 19316
diff changeset
670 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
671
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
672 /* Adjust for empty tuple bases */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
673 if (nbases == 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
674 bases = Py_BuildValue("(O)", &PyBaseObject_Type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
675 if (bases == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
676 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
677 nbases = 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
678 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
679 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
680 Py_INCREF(bases);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
681
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
682 /* XXX From here until type is allocated, "return NULL" leaks bases! */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
683
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
684 /* Calculate best base, and check that all bases are type objects */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
685 base = best_base(bases);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
686 if (base == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
687 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
688 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
689 PyErr_Format(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
690 "type '%.100s' is not an acceptable base type",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
691 base->tp_name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
692 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
693 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
694
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
695 /* Should this be a dynamic class (i.e. modifiable __dict__)?
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
696 Look in two places for a variable named __dynamic__:
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
697 1) in the class dict
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
698 2) in the module dict (globals)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
699 The first variable that is an int >= 0 is used.
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
700 Otherwise, a default is calculated from the base classes:
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
701 if any base class is dynamic, this class is dynamic; otherwise
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
702 it is static. */
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
703 dynamic = -1; /* Not yet determined */
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
704 /* Look in the class */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
705 tmp = PyDict_GetItemString(dict, "__dynamic__");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
706 if (tmp != NULL) {
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
707 dynamic = PyInt_AsLong(tmp);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
708 if (dynamic < 0)
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
709 PyErr_Clear();
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
710 }
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
711 if (dynamic < 0) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
712 /* Look in the module globals */
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
713 tmp = PyEval_GetGlobals();
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
714 if (tmp != NULL) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
715 tmp = PyDict_GetItemString(tmp, "__dynamic__");
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
716 if (tmp != NULL) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
717 dynamic = PyInt_AsLong(tmp);
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
718 if (dynamic < 0)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
719 PyErr_Clear();
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
720 }
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
721 }
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
722 }
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
723 if (dynamic < 0) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
724 /* Make a new class dynamic if any of its bases is
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
725 dynamic. This is not always the same as inheriting
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
726 the __dynamic__ class attribute! */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
727 dynamic = 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
728 for (i = 0; i < nbases; i++) {
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
729 tmptype = (PyTypeObject *)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
730 PyTuple_GET_ITEM(bases, i);
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
731 if (tmptype->tp_flags &
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
732 Py_TPFLAGS_DYNAMICTYPE) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
733 dynamic = 1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
734 break;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
735 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
736 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
737 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
738
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
739 /* Check for a __slots__ sequence variable in dict, and count it */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
740 slots = PyDict_GetItemString(dict, "__slots__");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
741 nslots = 0;
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
742 add_dict = 0;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
743 add_weak = 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
744 if (slots != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
745 /* Make it into a tuple */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
746 if (PyString_Check(slots))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
747 slots = Py_BuildValue("(O)", slots);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
748 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
749 slots = PySequence_Tuple(slots);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
750 if (slots == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
751 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
752 nslots = PyTuple_GET_SIZE(slots);
19595
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
753 if (nslots > 0 && base->tp_itemsize != 0) {
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
754 PyErr_Format(PyExc_TypeError,
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
755 "nonempty __slots__ "
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
756 "not supported for subtype of '%s'",
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
757 base->tp_name);
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
758 return NULL;
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
759 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
760 for (i = 0; i < nslots; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
761 if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
762 PyErr_SetString(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
763 "__slots__ must be a sequence of strings");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
764 Py_DECREF(slots);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
765 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
766 }
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
767 /* XXX Check against null bytes in name */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
768 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
769 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
770 if (slots == NULL && base->tp_dictoffset == 0 &&
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
771 (base->tp_setattro == PyObject_GenericSetAttr ||
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
772 base->tp_setattro == NULL)) {
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
773 add_dict++;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
774 }
19595
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
775 if (slots == NULL && base->tp_weaklistoffset == 0 &&
db36e396f043 Safety measures now that str and tuple are subclassable:
Guido van Rossum <guido@python.org>
parents: 19594
diff changeset
776 base->tp_itemsize == 0) {
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
777 nslots++;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
778 add_weak++;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
779 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
780
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
781 /* XXX From here until type is safely allocated,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
782 "return NULL" may leak slots! */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
783
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
784 /* Allocate the type object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
785 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
786 if (type == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
787 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
788
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
789 /* Keep name and slots alive in the extended type object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
790 et = (etype *)type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
791 Py_INCREF(name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
792 et->name = name;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
793 et->slots = slots;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
794
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
795 /* Initialize tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
796 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
797 Py_TPFLAGS_BASETYPE;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
798 if (dynamic)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
799 type->tp_flags |= Py_TPFLAGS_DYNAMICTYPE;
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
800
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
801 /* It's a new-style number unless it specifically inherits any
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
802 old-style numeric behavior */
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
803 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
804 (base->tp_as_number == NULL))
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
805 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
806
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
807 /* Initialize essential fields */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
808 type->tp_as_number = &et->as_number;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
809 type->tp_as_sequence = &et->as_sequence;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
810 type->tp_as_mapping = &et->as_mapping;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
811 type->tp_as_buffer = &et->as_buffer;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
812 type->tp_name = PyString_AS_STRING(name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
813
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
814 /* Set tp_base and tp_bases */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
815 type->tp_bases = bases;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
816 Py_INCREF(base);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
817 type->tp_base = base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
818
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
819 /* Initialize tp_defined from passed-in dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
820 type->tp_defined = dict = PyDict_Copy(dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
821 if (dict == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
822 Py_DECREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
823 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
824 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
825
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
826 /* Set __module__ in the dict */
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
827 if (PyDict_GetItemString(dict, "__module__") == NULL) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
828 tmp = PyEval_GetGlobals();
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
829 if (tmp != NULL) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
830 tmp = PyDict_GetItemString(tmp, "__name__");
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
831 if (tmp != NULL) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
832 if (PyDict_SetItemString(dict, "__module__",
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
833 tmp) < 0)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
834 return NULL;
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
835 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
836 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
837 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
838
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
839 /* Special-case __new__: if it's a plain function,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
840 make it a static function */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
841 tmp = PyDict_GetItemString(dict, "__new__");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
842 if (tmp != NULL && PyFunction_Check(tmp)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
843 tmp = PyStaticMethod_New(tmp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
844 if (tmp == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
845 Py_DECREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
846 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
847 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
848 PyDict_SetItemString(dict, "__new__", tmp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
849 Py_DECREF(tmp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
850 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
851
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
852 /* Add descriptors for custom slots from __slots__, or for __dict__ */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
853 mp = et->members;
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
854 slotoffset = base->tp_basicsize;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
855 if (slots != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
856 for (i = 0; i < nslots; i++, mp++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
857 mp->name = PyString_AS_STRING(
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
858 PyTuple_GET_ITEM(slots, i));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
859 mp->type = T_OBJECT;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
860 mp->offset = slotoffset;
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
861 if (base->tp_weaklistoffset == 0 &&
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
862 strcmp(mp->name, "__weakref__") == 0)
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
863 type->tp_weaklistoffset = slotoffset;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
864 slotoffset += sizeof(PyObject *);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
865 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
866 }
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
867 else {
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
868 if (add_dict) {
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
869 if (base->tp_itemsize)
19618
a885d8761bd2 Squash new compiler wng.
Tim Peters <tim.peters@gmail.com>
parents: 19616
diff changeset
870 type->tp_dictoffset = -(long)sizeof(PyObject *);
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
871 else
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
872 type->tp_dictoffset = slotoffset;
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
873 slotoffset += sizeof(PyObject *);
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
874 type->tp_getset = subtype_getsets;
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
875 }
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
876 if (add_weak) {
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
877 assert(!base->tp_itemsize);
19349
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
878 type->tp_weaklistoffset = slotoffset;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
879 mp->name = "__weakref__";
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
880 mp->type = T_OBJECT;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
881 mp->offset = slotoffset;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
882 mp->readonly = 1;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
883 mp++;
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
884 slotoffset += sizeof(PyObject *);
9b5a2c1a02f3 Weak reference support, closing SF bug #451773.
Guido van Rossum <guido@python.org>
parents: 19339
diff changeset
885 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
886 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
887 type->tp_basicsize = slotoffset;
19616
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
888 type->tp_itemsize = base->tp_itemsize;
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
889 type->tp_members = et->members;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
890
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
891 /* Special case some slots */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
892 if (type->tp_dictoffset != 0 || nslots > 0) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
893 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
894 type->tp_getattro = PyObject_GenericGetAttr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
895 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
896 type->tp_setattro = PyObject_GenericSetAttr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
897 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
898 type->tp_dealloc = subtype_dealloc;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
899
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
900 /* Always override allocation strategy to use regular heap */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
901 type->tp_alloc = PyType_GenericAlloc;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
902 type->tp_free = _PyObject_Del;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
903
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
904 /* Initialize the rest */
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
905 if (PyType_Ready(type) < 0) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
906 Py_DECREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
907 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
908 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
909
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
910 /* Override slots that deserve it */
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
911 if (!PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE))
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
912 override_slots(type, type->tp_defined);
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
913
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
914 return (PyObject *)type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
915 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
916
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
917 /* Internal API to look for a name through the MRO.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
918 This returns a borrowed reference, and doesn't set an exception! */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
919 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
920 _PyType_Lookup(PyTypeObject *type, PyObject *name)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
921 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
922 int i, n;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
923 PyObject *mro, *res, *dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
924
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
925 /* For static types, look in tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
926 if (!(type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
927 dict = type->tp_dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
928 assert(dict && PyDict_Check(dict));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
929 return PyDict_GetItem(dict, name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
930 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
931
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
932 /* For dynamic types, look in tp_defined of types in MRO */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
933 mro = type->tp_mro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
934 assert(PyTuple_Check(mro));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
935 n = PyTuple_GET_SIZE(mro);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
936 for (i = 0; i < n; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
937 type = (PyTypeObject *) PyTuple_GET_ITEM(mro, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
938 assert(PyType_Check(type));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
939 dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
940 assert(dict && PyDict_Check(dict));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
941 res = PyDict_GetItem(dict, name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
942 if (res != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
943 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
944 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
945 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
946 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
947
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
948 /* This is similar to PyObject_GenericGetAttr(),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
949 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
950 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
951 type_getattro(PyTypeObject *type, PyObject *name)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
952 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
953 PyTypeObject *metatype = type->ob_type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
954 PyObject *descr, *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
955 descrgetfunc f;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
956
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
957 /* Initialize this type (we'll assume the metatype is initialized) */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
958 if (type->tp_dict == NULL) {
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
959 if (PyType_Ready(type) < 0)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
960 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
961 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
962
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
963 /* Get a descriptor from the metatype */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
964 descr = _PyType_Lookup(metatype, name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
965 f = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
966 if (descr != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
967 f = descr->ob_type->tp_descr_get;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
968 if (f != NULL && PyDescr_IsData(descr))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
969 return f(descr,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
970 (PyObject *)type, (PyObject *)metatype);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
971 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
972
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
973 /* Look in tp_defined of this type and its bases */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
974 res = _PyType_Lookup(type, name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
975 if (res != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
976 f = res->ob_type->tp_descr_get;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
977 if (f != NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
978 return f(res, (PyObject *)NULL, (PyObject *)type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
979 Py_INCREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
980 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
981 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
982
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
983 /* Use the descriptor from the metatype */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
984 if (f != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
985 res = f(descr, (PyObject *)type, (PyObject *)metatype);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
986 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
987 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
988 if (descr != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
989 Py_INCREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
990 return descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
991 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
992
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
993 /* Give up */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
994 PyErr_Format(PyExc_AttributeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
995 "type object '%.50s' has no attribute '%.400s'",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
996 type->tp_name, PyString_AS_STRING(name));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
997 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
998 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
999
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1000 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1001 type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1002 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1003 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1004 return PyObject_GenericSetAttr((PyObject *)type, name, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1005 PyErr_SetString(PyExc_TypeError, "can't set type attributes");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1006 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1007 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1008
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1009 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1010 type_dealloc(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1011 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1012 etype *et;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1013
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1014 /* Assert this is a heap-allocated type object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1015 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1016 et = (etype *)type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1017 Py_XDECREF(type->tp_base);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1018 Py_XDECREF(type->tp_dict);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1019 Py_XDECREF(type->tp_bases);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1020 Py_XDECREF(type->tp_mro);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1021 Py_XDECREF(type->tp_defined);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1022 /* XXX more? */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1023 Py_XDECREF(et->name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1024 Py_XDECREF(et->slots);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1025 type->ob_type->tp_free((PyObject *)type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1026 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1027
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1028 static PyMethodDef type_methods[] = {
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19300
diff changeset
1029 {"mro", (PyCFunction)mro_external, METH_NOARGS,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1030 "mro() -> list\nreturn a type's method resolution order"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1031 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1032 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1033
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1034 static char type_doc[] =
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1035 "type(object) -> the object's type\n"
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1036 "type(name, bases, dict) -> a new type";
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1037
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1038 PyTypeObject PyType_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1039 PyObject_HEAD_INIT(&PyType_Type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1040 0, /* ob_size */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1041 "type", /* tp_name */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1042 sizeof(etype), /* tp_basicsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1043 sizeof(struct memberlist), /* tp_itemsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1044 (destructor)type_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1045 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1046 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1047 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1048 type_compare, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1049 (reprfunc)type_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1050 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1051 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1052 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1053 (hashfunc)_Py_HashPointer, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1054 (ternaryfunc)type_call, /* tp_call */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1055 0, /* tp_str */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1056 (getattrofunc)type_getattro, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1057 (setattrofunc)type_setattro, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1058 0, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1059 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1060 type_doc, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1061 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1062 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1063 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1064 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1065 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1066 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1067 type_methods, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1068 type_members, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1069 type_getsets, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1070 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1071 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1072 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1073 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1074 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1075 0, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1076 0, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1077 type_new, /* tp_new */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1078 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1079
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1080
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1081 /* The base type of all types (eventually)... except itself. */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1082
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1083 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1084 object_init(PyObject *self, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1085 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1086 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1087 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1088
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1089 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1090 object_dealloc(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1091 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1092 self->ob_type->tp_free(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1093 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1094
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1095 static PyObject *
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1096 object_repr(PyObject *self)
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1097 {
19316
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1098 PyTypeObject *type;
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1099 PyObject *mod, *name, *rtn;
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1100
19316
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1101 type = self->ob_type;
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1102 mod = type_module(type, NULL);
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1103 if (mod == NULL)
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1104 PyErr_Clear();
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1105 else if (!PyString_Check(mod)) {
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1106 Py_DECREF(mod);
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1107 mod = NULL;
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1108 }
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1109 name = type_name(type, NULL);
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1110 if (name == NULL)
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1111 return NULL;
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1112 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1113 rtn = PyString_FromFormat("<%s.%s instance at %p>",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1114 PyString_AS_STRING(mod),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1115 PyString_AS_STRING(name),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1116 self);
19316
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1117 else
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1118 rtn = PyString_FromFormat("<%s instance at %p>",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1119 type->tp_name, self);
19316
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1120 Py_XDECREF(mod);
f7dc21cb1661 Fix object_repr() to include the module (using the same rules as
Guido van Rossum <guido@python.org>
parents: 19301
diff changeset
1121 Py_DECREF(name);
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
1122 return rtn;
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1123 }
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1124
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1125 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1126 object_str(PyObject *self)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1127 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1128 unaryfunc f;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1129
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1130 f = self->ob_type->tp_repr;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1131 if (f == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1132 f = object_repr;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1133 return f(self);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1134 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1135
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1136 static long
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1137 object_hash(PyObject *self)
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1138 {
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1139 return _Py_HashPointer(self);
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1140 }
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1141
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1142 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1143 object_free(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1144 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1145 PyObject_Del(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1146 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1147
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1148 static struct memberlist object_members[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1149 {"__class__", T_OBJECT, offsetof(PyObject, ob_type), READONLY},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1150 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1151 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1152
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1153 PyTypeObject PyBaseObject_Type = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1154 PyObject_HEAD_INIT(&PyType_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1155 0, /* ob_size */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1156 "object", /* tp_name */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1157 sizeof(PyObject), /* tp_basicsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1158 0, /* tp_itemsize */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1159 (destructor)object_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1160 0, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1161 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1162 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1163 0, /* tp_compare */
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1164 object_repr, /* tp_repr */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1165 0, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1166 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1167 0, /* tp_as_mapping */
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1168 object_hash, /* tp_hash */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1169 0, /* tp_call */
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1170 object_str, /* tp_str */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1171 PyObject_GenericGetAttr, /* tp_getattro */
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1172 PyObject_GenericSetAttr, /* tp_setattro */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1173 0, /* tp_as_buffer */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1174 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1175 "The most base type", /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1176 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1177 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1178 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1179 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1180 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1181 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1182 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1183 object_members, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1184 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1185 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1186 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1187 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1188 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1189 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1190 object_init, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1191 PyType_GenericAlloc, /* tp_alloc */
19108
b7984c9bbf2c Thinking back to the 2.22 revision, I didn't like what I did there one
Guido van Rossum <guido@python.org>
parents: 19082
diff changeset
1192 PyType_GenericNew, /* tp_new */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1193 object_free, /* tp_free */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1194 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1195
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1196
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1197 /* Initialize the __dict__ in a type object */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1198
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1199 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1200 add_methods(PyTypeObject *type, PyMethodDef *meth)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1201 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1202 PyObject *dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1203
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1204 for (; meth->ml_name != NULL; meth++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1205 PyObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1206 if (PyDict_GetItemString(dict, meth->ml_name))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1207 continue;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1208 descr = PyDescr_NewMethod(type, meth);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1209 if (descr == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1210 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1211 if (PyDict_SetItemString(dict,meth->ml_name,descr) < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1212 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1213 Py_DECREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1214 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1215 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1216 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1217
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1218 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1219 add_members(PyTypeObject *type, struct memberlist *memb)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1220 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1221 PyObject *dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1222
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1223 for (; memb->name != NULL; memb++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1224 PyObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1225 if (PyDict_GetItemString(dict, memb->name))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1226 continue;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1227 descr = PyDescr_NewMember(type, memb);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1228 if (descr == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1229 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1230 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1231 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1232 Py_DECREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1233 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1234 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1235 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1236
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1237 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1238 add_getset(PyTypeObject *type, struct getsetlist *gsp)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1239 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1240 PyObject *dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1241
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1242 for (; gsp->name != NULL; gsp++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1243 PyObject *descr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1244 if (PyDict_GetItemString(dict, gsp->name))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1245 continue;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1246 descr = PyDescr_NewGetSet(type, gsp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1247
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1248 if (descr == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1249 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1250 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1251 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1252 Py_DECREF(descr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1253 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1254 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1255 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1256
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1257 static void
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1258 inherit_special(PyTypeObject *type, PyTypeObject *base)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1259 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1260 int oldsize, newsize;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1261
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1262 /* Special flag magic */
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1263 if (!type->tp_as_buffer && base->tp_as_buffer) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1264 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1265 type->tp_flags |=
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1266 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1267 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1268 if (!type->tp_as_sequence && base->tp_as_sequence) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1269 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1270 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1271 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1272 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1273 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1274 if ((!type->tp_as_number && base->tp_as_number) ||
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1275 (!type->tp_as_sequence && base->tp_as_sequence)) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1276 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1277 if (!type->tp_as_number && !type->tp_as_sequence) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1278 type->tp_flags |= base->tp_flags &
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1279 Py_TPFLAGS_HAVE_INPLACEOPS;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1280 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1281 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1282 /* Wow */
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1283 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1284 if (!type->tp_as_number && base->tp_as_number) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1285 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1286 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1287 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1288
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1289 /* Copying basicsize is connected to the GC flags */
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1290 oldsize = base->tp_basicsize;
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1291 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1292 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1293 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1294 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1295 (!type->tp_traverse && !type->tp_clear)) {
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1296 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1297 if (type->tp_traverse == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1298 type->tp_traverse = base->tp_traverse;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1299 if (type->tp_clear == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1300 type->tp_clear = base->tp_clear;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1301 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1302 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1303 if (base != &PyBaseObject_Type ||
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1304 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1305 if (type->tp_new == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1306 type->tp_new = base->tp_new;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1307 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1308 }
19582
13a93a5dcb1d Use new GC API. Remove usage of BASICSIZE macros.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19551
diff changeset
1309 type->tp_basicsize = newsize;
19253
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1310
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1311 /* Copy other non-function slots */
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1312
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1313 #undef COPYVAL
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1314 #define COPYVAL(SLOT) \
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1315 if (type->SLOT == 0) type->SLOT = base->SLOT
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1316
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1317 COPYVAL(tp_itemsize);
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1318 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1319 COPYVAL(tp_weaklistoffset);
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1320 }
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1321 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1322 COPYVAL(tp_dictoffset);
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
1323 }
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1324 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1325
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1326 static void
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1327 inherit_slots(PyTypeObject *type, PyTypeObject *base)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1328 {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1329 PyTypeObject *basebase;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1330
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1331 #undef SLOTDEFINED
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1332 #undef COPYSLOT
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1333 #undef COPYNUM
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1334 #undef COPYSEQ
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1335 #undef COPYMAP
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1336
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1337 #define SLOTDEFINED(SLOT) \
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1338 (base->SLOT != 0 && \
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1339 (basebase == NULL || base->SLOT != basebase->SLOT))
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1340
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1341 #define COPYSLOT(SLOT) \
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1342 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1343
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1344 #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1345 #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1346 #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1347
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1348 /* This won't inherit indirect slots (from tp_as_number etc.)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1349 if type doesn't provide the space. */
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1350
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1351 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1352 basebase = base->tp_base;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1353 if (basebase->tp_as_number == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1354 basebase = NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1355 COPYNUM(nb_add);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1356 COPYNUM(nb_subtract);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1357 COPYNUM(nb_multiply);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1358 COPYNUM(nb_divide);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1359 COPYNUM(nb_remainder);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1360 COPYNUM(nb_divmod);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1361 COPYNUM(nb_power);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1362 COPYNUM(nb_negative);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1363 COPYNUM(nb_positive);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1364 COPYNUM(nb_absolute);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1365 COPYNUM(nb_nonzero);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1366 COPYNUM(nb_invert);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1367 COPYNUM(nb_lshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1368 COPYNUM(nb_rshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1369 COPYNUM(nb_and);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1370 COPYNUM(nb_xor);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1371 COPYNUM(nb_or);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1372 COPYNUM(nb_coerce);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1373 COPYNUM(nb_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1374 COPYNUM(nb_long);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1375 COPYNUM(nb_float);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1376 COPYNUM(nb_oct);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1377 COPYNUM(nb_hex);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1378 COPYNUM(nb_inplace_add);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1379 COPYNUM(nb_inplace_subtract);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1380 COPYNUM(nb_inplace_multiply);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1381 COPYNUM(nb_inplace_divide);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1382 COPYNUM(nb_inplace_remainder);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1383 COPYNUM(nb_inplace_power);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1384 COPYNUM(nb_inplace_lshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1385 COPYNUM(nb_inplace_rshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1386 COPYNUM(nb_inplace_and);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1387 COPYNUM(nb_inplace_xor);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1388 COPYNUM(nb_inplace_or);
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1389 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1390 COPYNUM(nb_true_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1391 COPYNUM(nb_floor_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1392 COPYNUM(nb_inplace_true_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1393 COPYNUM(nb_inplace_floor_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
1394 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1395 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1396
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1397 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1398 basebase = base->tp_base;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1399 if (basebase->tp_as_sequence == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1400 basebase = NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1401 COPYSEQ(sq_length);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1402 COPYSEQ(sq_concat);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1403 COPYSEQ(sq_repeat);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1404 COPYSEQ(sq_item);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1405 COPYSEQ(sq_slice);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1406 COPYSEQ(sq_ass_item);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1407 COPYSEQ(sq_ass_slice);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1408 COPYSEQ(sq_contains);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1409 COPYSEQ(sq_inplace_concat);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1410 COPYSEQ(sq_inplace_repeat);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1411 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1412
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1413 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1414 basebase = base->tp_base;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1415 if (basebase->tp_as_mapping == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1416 basebase = NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1417 COPYMAP(mp_length);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1418 COPYMAP(mp_subscript);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1419 COPYMAP(mp_ass_subscript);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1420 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1421
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1422 basebase = base->tp_base;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1423
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1424 COPYSLOT(tp_dealloc);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1425 COPYSLOT(tp_print);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1426 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1427 type->tp_getattr = base->tp_getattr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1428 type->tp_getattro = base->tp_getattro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1429 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1430 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1431 type->tp_setattr = base->tp_setattr;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1432 type->tp_setattro = base->tp_setattro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1433 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1434 /* tp_compare see tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1435 COPYSLOT(tp_repr);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1436 /* tp_hash see tp_richcompare */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1437 COPYSLOT(tp_call);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1438 COPYSLOT(tp_str);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1439 COPYSLOT(tp_as_buffer);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1440 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1441 if (type->tp_compare == NULL &&
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1442 type->tp_richcompare == NULL &&
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1443 type->tp_hash == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1444 {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1445 type->tp_compare = base->tp_compare;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1446 type->tp_richcompare = base->tp_richcompare;
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
1447 type->tp_hash = base->tp_hash;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1448 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1449 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1450 else {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1451 COPYSLOT(tp_compare);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1452 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1453 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1454 COPYSLOT(tp_iter);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1455 COPYSLOT(tp_iternext);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1456 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1457 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1458 COPYSLOT(tp_descr_get);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1459 COPYSLOT(tp_descr_set);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1460 COPYSLOT(tp_dictoffset);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1461 COPYSLOT(tp_init);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1462 COPYSLOT(tp_alloc);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1463 COPYSLOT(tp_free);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1464 }
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1465 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1466
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1467 staticforward int add_operators(PyTypeObject *);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1468
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1469 int
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
1470 PyType_Ready(PyTypeObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1471 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1472 PyObject *dict, *bases, *x;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1473 PyTypeObject *base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1474 int i, n;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1475
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1476 if (type->tp_flags & Py_TPFLAGS_READY) {
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1477 assert(type->tp_dict != NULL);
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1478 return 0;
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1479 }
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1480 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1481 assert(type->tp_dict == NULL);
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1482
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1483 type->tp_flags |= Py_TPFLAGS_READYING;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1484
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1485 /* Initialize tp_base (defaults to BaseObject unless that's us) */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1486 base = type->tp_base;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1487 if (base == NULL && type != &PyBaseObject_Type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1488 base = type->tp_base = &PyBaseObject_Type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1489
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1490 /* Initialize tp_bases */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1491 bases = type->tp_bases;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1492 if (bases == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1493 if (base == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1494 bases = PyTuple_New(0);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1495 else
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1496 bases = Py_BuildValue("(O)", base);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1497 if (bases == NULL)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1498 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1499 type->tp_bases = bases;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1500 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1501
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1502 /* Initialize the base class */
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
1503 if (base && base->tp_dict == NULL) {
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
1504 if (PyType_Ready(base) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1505 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1506 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1507
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1508 /* Initialize tp_defined */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1509 dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1510 if (dict == NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1511 dict = PyDict_New();
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1512 if (dict == NULL)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1513 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1514 type->tp_defined = dict;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1515 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1516
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1517 /* Add type-specific descriptors to tp_defined */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1518 if (add_operators(type) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1519 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1520 if (type->tp_methods != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1521 if (add_methods(type, type->tp_methods) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1522 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1523 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1524 if (type->tp_members != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1525 if (add_members(type, type->tp_members) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1526 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1527 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1528 if (type->tp_getset != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1529 if (add_getset(type, type->tp_getset) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1530 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1531 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1532
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1533 /* Temporarily make tp_dict the same object as tp_defined.
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1534 (This is needed to call mro(), and can stay this way for
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1535 dynamic types). */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1536 Py_INCREF(type->tp_defined);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1537 type->tp_dict = type->tp_defined;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1538
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1539 /* Calculate method resolution order */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1540 if (mro_internal(type) < 0) {
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1541 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1542 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1543
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1544 /* Inherit special flags from dominant base */
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1545 if (type->tp_base != NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1546 inherit_special(type, type->tp_base);
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1547
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1548 /* Initialize tp_dict properly */
19192
680232fb61f3 Temporary stop-gap fix for dynamic classes, so they pass the test.
Guido van Rossum <guido@python.org>
parents: 19153
diff changeset
1549 if (PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE)) {
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1550 /* For a dynamic type, all slots are overridden */
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
1551 override_slots(type, NULL);
19192
680232fb61f3 Temporary stop-gap fix for dynamic classes, so they pass the test.
Guido van Rossum <guido@python.org>
parents: 19153
diff changeset
1552 }
680232fb61f3 Temporary stop-gap fix for dynamic classes, so they pass the test.
Guido van Rossum <guido@python.org>
parents: 19153
diff changeset
1553 else {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1554 /* For a static type, tp_dict is the consolidation
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1555 of the tp_defined of its bases in MRO. */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1556 Py_DECREF(type->tp_dict);
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1557 type->tp_dict = PyDict_Copy(type->tp_defined);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1558 if (type->tp_dict == NULL)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1559 goto error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1560 bases = type->tp_mro;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1561 assert(bases != NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1562 assert(PyTuple_Check(bases));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1563 n = PyTuple_GET_SIZE(bases);
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1564 for (i = 1; i < n; i++) {
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1565 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1566 assert(PyType_Check(base));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1567 x = base->tp_defined;
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1568 if (x != NULL && PyDict_Merge(type->tp_dict, x, 0) < 0)
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1569 goto error;
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1570 inherit_slots(type, base);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1571 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1572 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1573
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1574 /* Some more special stuff */
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1575 base = type->tp_base;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1576 if (base != NULL) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1577 if (type->tp_as_number == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1578 type->tp_as_number = base->tp_as_number;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1579 if (type->tp_as_sequence == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1580 type->tp_as_sequence = base->tp_as_sequence;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1581 if (type->tp_as_mapping == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1582 type->tp_as_mapping = base->tp_as_mapping;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1583 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1584
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
1585 /* All done -- set the ready flag */
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1586 assert(type->tp_dict != NULL);
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1587 type->tp_flags =
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1588 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1589 return 0;
19136
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1590
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1591 error:
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1592 type->tp_flags &= ~Py_TPFLAGS_READYING;
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
1593 return -1;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1594 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1595
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1596
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1597 /* Generic wrappers for overloadable 'operators' such as __getitem__ */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1598
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1599 /* There's a wrapper *function* for each distinct function typedef used
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1600 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1601 wrapper *table* for each distinct operation (e.g. __len__, __add__).
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1602 Most tables have only one entry; the tables for binary operators have two
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1603 entries, one regular and one with reversed arguments. */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1604
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1605 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1606 wrap_inquiry(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1607 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1608 inquiry func = (inquiry)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1609 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1610
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1611 if (!PyArg_ParseTuple(args, ""))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1612 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1613 res = (*func)(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1614 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1615 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1616 return PyInt_FromLong((long)res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1617 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1618
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1619 static struct wrapperbase tab_len[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1620 {"__len__", (wrapperfunc)wrap_inquiry, "x.__len__() <==> len(x)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1621 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1622 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1623
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1624 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1625 wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1626 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1627 binaryfunc func = (binaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1628 PyObject *other;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1629
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1630 if (!PyArg_ParseTuple(args, "O", &other))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1631 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1632 return (*func)(self, other);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1633 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1634
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1635 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1636 wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1637 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1638 binaryfunc func = (binaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1639 PyObject *other;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1640
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1641 if (!PyArg_ParseTuple(args, "O", &other))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1642 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1643 return (*func)(other, self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1644 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1645
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1646 #undef BINARY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1647 #define BINARY(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1648 static struct wrapperbase tab_##NAME[] = { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1649 {"__" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1650 (wrapperfunc)wrap_binaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1651 "x.__" #NAME "__(y) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1652 {"__r" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1653 (wrapperfunc)wrap_binaryfunc_r, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1654 "y.__r" #NAME "__(x) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1655 {0} \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1656 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1657
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1658 BINARY(add, "x+y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1659 BINARY(sub, "x-y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1660 BINARY(mul, "x*y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1661 BINARY(div, "x/y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1662 BINARY(mod, "x%y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1663 BINARY(divmod, "divmod(x,y)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1664 BINARY(lshift, "x<<y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1665 BINARY(rshift, "x>>y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1666 BINARY(and, "x&y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1667 BINARY(xor, "x^y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1668 BINARY(or, "x|y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1669
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1670 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1671 wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1672 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1673 ternaryfunc func = (ternaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1674 PyObject *other;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1675 PyObject *third = Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1676
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1677 /* Note: This wrapper only works for __pow__() */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1678
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1679 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1680 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1681 return (*func)(self, other, third);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1682 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1683
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1684 #undef TERNARY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1685 #define TERNARY(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1686 static struct wrapperbase tab_##NAME[] = { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1687 {"__" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1688 (wrapperfunc)wrap_ternaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1689 "x.__" #NAME "__(y, z) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1690 {"__r" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1691 (wrapperfunc)wrap_ternaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1692 "y.__r" #NAME "__(x, z) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1693 {0} \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1694 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1695
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1696 TERNARY(pow, "(x**y) % z");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1697
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1698 #undef UNARY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1699 #define UNARY(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1700 static struct wrapperbase tab_##NAME[] = { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1701 {"__" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1702 (wrapperfunc)wrap_unaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1703 "x.__" #NAME "__() <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1704 {0} \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1705 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1706
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1707 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1708 wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1709 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1710 unaryfunc func = (unaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1711
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1712 if (!PyArg_ParseTuple(args, ""))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1713 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1714 return (*func)(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1715 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1716
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1717 UNARY(neg, "-x");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1718 UNARY(pos, "+x");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1719 UNARY(abs, "abs(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1720 UNARY(nonzero, "x != 0");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1721 UNARY(invert, "~x");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1722 UNARY(int, "int(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1723 UNARY(long, "long(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1724 UNARY(float, "float(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1725 UNARY(oct, "oct(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1726 UNARY(hex, "hex(x)");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1727
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1728 #undef IBINARY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1729 #define IBINARY(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1730 static struct wrapperbase tab_##NAME[] = { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1731 {"__" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1732 (wrapperfunc)wrap_binaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1733 "x.__" #NAME "__(y) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1734 {0} \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1735 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1736
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1737 IBINARY(iadd, "x+=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1738 IBINARY(isub, "x-=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1739 IBINARY(imul, "x*=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1740 IBINARY(idiv, "x/=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1741 IBINARY(imod, "x%=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1742 IBINARY(ilshift, "x<<=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1743 IBINARY(irshift, "x>>=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1744 IBINARY(iand, "x&=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1745 IBINARY(ixor, "x^=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1746 IBINARY(ior, "x|=y");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1747
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1748 #undef ITERNARY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1749 #define ITERNARY(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1750 static struct wrapperbase tab_##NAME[] = { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1751 {"__" #NAME "__", \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1752 (wrapperfunc)wrap_ternaryfunc, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1753 "x.__" #NAME "__(y) <==> " #OP}, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1754 {0} \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1755 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1756
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1757 ITERNARY(ipow, "x = (x**y) % z");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1758
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1759 static struct wrapperbase tab_getitem[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1760 {"__getitem__", (wrapperfunc)wrap_binaryfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1761 "x.__getitem__(y) <==> x[y]"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1762 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1763 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1764
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1765 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1766 wrap_intargfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1767 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1768 intargfunc func = (intargfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1769 int i;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1770
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1771 if (!PyArg_ParseTuple(args, "i", &i))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1772 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1773 return (*func)(self, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1774 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1775
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1776 static struct wrapperbase tab_mul_int[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1777 {"__mul__", (wrapperfunc)wrap_intargfunc, "x.__mul__(n) <==> x*n"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1778 {"__rmul__", (wrapperfunc)wrap_intargfunc, "x.__rmul__(n) <==> n*x"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1779 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1780 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1781
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1782 static struct wrapperbase tab_concat[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1783 {"__add__", (wrapperfunc)wrap_binaryfunc, "x.__add__(y) <==> x+y"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1784 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1785 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1786
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1787 static struct wrapperbase tab_imul_int[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1788 {"__imul__", (wrapperfunc)wrap_intargfunc, "x.__imul__(n) <==> x*=n"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1789 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1790 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1791
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1792 static int
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1793 getindex(PyObject *self, PyObject *arg)
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1794 {
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1795 int i;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1796
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1797 i = PyInt_AsLong(arg);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1798 if (i == -1 && PyErr_Occurred())
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1799 return -1;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1800 if (i < 0) {
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1801 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1802 if (sq && sq->sq_length) {
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1803 int n = (*sq->sq_length)(self);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1804 if (n < 0)
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1805 return -1;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1806 i += n;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1807 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1808 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1809 return i;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1810 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1811
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1812 static PyObject *
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1813 wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1814 {
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1815 intargfunc func = (intargfunc)wrapped;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1816 PyObject *arg;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1817 int i;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1818
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1819 if (!PyArg_ParseTuple(args, "O", &arg))
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1820 return NULL;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1821 i = getindex(self, arg);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1822 if (i == -1 && PyErr_Occurred())
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1823 return NULL;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1824 return (*func)(self, i);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1825 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1826
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1827 static struct wrapperbase tab_getitem_int[] = {
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1828 {"__getitem__", (wrapperfunc)wrap_sq_item,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1829 "x.__getitem__(i) <==> x[i]"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1830 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1831 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1832
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1833 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1834 wrap_intintargfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1835 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1836 intintargfunc func = (intintargfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1837 int i, j;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1838
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1839 if (!PyArg_ParseTuple(args, "ii", &i, &j))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1840 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1841 return (*func)(self, i, j);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1842 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1843
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1844 static struct wrapperbase tab_getslice[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1845 {"__getslice__", (wrapperfunc)wrap_intintargfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1846 "x.__getslice__(i, j) <==> x[i:j]"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1847 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1848 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1849
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1850 static PyObject *
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1851 wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1852 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1853 intobjargproc func = (intobjargproc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1854 int i, res;
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1855 PyObject *arg, *value;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1856
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1857 if (!PyArg_ParseTuple(args, "OO", &arg, &value))
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1858 return NULL;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1859 i = getindex(self, arg);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1860 if (i == -1 && PyErr_Occurred())
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1861 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1862 res = (*func)(self, i, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1863 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1864 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1865 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1866 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1867 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1868
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1869 static PyObject *
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1870 wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1871 {
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1872 intobjargproc func = (intobjargproc)wrapped;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1873 int i, res;
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1874 PyObject *arg;
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1875
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1876 if (!PyArg_ParseTuple(args, "O", &arg))
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1877 return NULL;
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1878 i = getindex(self, arg);
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1879 if (i == -1 && PyErr_Occurred())
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1880 return NULL;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1881 res = (*func)(self, i, NULL);
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1882 if (res == -1 && PyErr_Occurred())
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1883 return NULL;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1884 Py_INCREF(Py_None);
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1885 return Py_None;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1886 }
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1887
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1888 static struct wrapperbase tab_setitem_int[] = {
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1889 {"__setitem__", (wrapperfunc)wrap_sq_setitem,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1890 "x.__setitem__(i, y) <==> x[i]=y"},
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
1891 {"__delitem__", (wrapperfunc)wrap_sq_delitem,
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1892 "x.__delitem__(y) <==> del x[y]"},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1893 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1894 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1895
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1896 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1897 wrap_intintobjargproc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1898 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1899 intintobjargproc func = (intintobjargproc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1900 int i, j, res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1901 PyObject *value;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1902
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1903 if (!PyArg_ParseTuple(args, "iiO", &i, &j, &value))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1904 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1905 res = (*func)(self, i, j, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1906 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1907 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1908 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1909 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1910 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1911
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1912 static struct wrapperbase tab_setslice[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1913 {"__setslice__", (wrapperfunc)wrap_intintobjargproc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1914 "x.__setslice__(i, j, y) <==> x[i:j]=y"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1915 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1916 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1917
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1918 /* XXX objobjproc is a misnomer; should be objargpred */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1919 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1920 wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1921 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1922 objobjproc func = (objobjproc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1923 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1924 PyObject *value;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1925
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1926 if (!PyArg_ParseTuple(args, "O", &value))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1927 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1928 res = (*func)(self, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1929 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1930 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1931 return PyInt_FromLong((long)res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1932 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1934 static struct wrapperbase tab_contains[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1935 {"__contains__", (wrapperfunc)wrap_objobjproc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1936 "x.__contains__(y) <==> y in x"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1937 {0}
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1938 };
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1939
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1940 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1941 wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1942 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1943 objobjargproc func = (objobjargproc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1944 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1945 PyObject *key, *value;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1946
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1947 if (!PyArg_ParseTuple(args, "OO", &key, &value))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1948 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1949 res = (*func)(self, key, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1950 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1951 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1952 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1953 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1954 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1955
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1956 static PyObject *
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1957 wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1958 {
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1959 objobjargproc func = (objobjargproc)wrapped;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1960 int res;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1961 PyObject *key;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1962
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1963 if (!PyArg_ParseTuple(args, "O", &key))
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1964 return NULL;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1965 res = (*func)(self, key, NULL);
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1966 if (res == -1 && PyErr_Occurred())
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1967 return NULL;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1968 Py_INCREF(Py_None);
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1969 return Py_None;
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1970 }
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1971
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1972 static struct wrapperbase tab_setitem[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1973 {"__setitem__", (wrapperfunc)wrap_objobjargproc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1974 "x.__setitem__(y, z) <==> x[y]=z"},
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1975 {"__delitem__", (wrapperfunc)wrap_delitem,
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1976 "x.__delitem__(y) <==> del x[y]"},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1977 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1978 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1979
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1980 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1981 wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1982 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1983 cmpfunc func = (cmpfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1984 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1985 PyObject *other;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1986
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1987 if (!PyArg_ParseTuple(args, "O", &other))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1988 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1989 res = (*func)(self, other);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1990 if (PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1991 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1992 return PyInt_FromLong((long)res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1993 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1994
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1995 static struct wrapperbase tab_cmp[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1996 {"__cmp__", (wrapperfunc)wrap_cmpfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1997 "x.__cmp__(y) <==> cmp(x,y)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1998 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1999 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2000
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2001 static struct wrapperbase tab_repr[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2002 {"__repr__", (wrapperfunc)wrap_unaryfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2003 "x.__repr__() <==> repr(x)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2004 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2005 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2006
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2007 static struct wrapperbase tab_getattr[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2008 {"__getattr__", (wrapperfunc)wrap_binaryfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2009 "x.__getattr__('name') <==> x.name"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2010 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2011 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2012
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2013 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2014 wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2015 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2016 setattrofunc func = (setattrofunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2017 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2018 PyObject *name, *value;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2019
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2020 if (!PyArg_ParseTuple(args, "OO", &name, &value))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2021 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2022 res = (*func)(self, name, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2023 if (res < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2024 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2025 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2026 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2027 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2028
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2029 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2030 wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2031 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2032 setattrofunc func = (setattrofunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2033 int res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2034 PyObject *name;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2035
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2036 if (!PyArg_ParseTuple(args, "O", &name))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2037 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2038 res = (*func)(self, name, NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2039 if (res < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2040 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2041 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2042 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2043 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2044
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2045 static struct wrapperbase tab_setattr[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2046 {"__setattr__", (wrapperfunc)wrap_setattr,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2047 "x.__setattr__('name', value) <==> x.name = value"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2048 {"__delattr__", (wrapperfunc)wrap_delattr,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2049 "x.__delattr__('name') <==> del x.name"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2050 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2051 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2052
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2053 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2054 wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2055 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2056 hashfunc func = (hashfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2057 long res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2058
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2059 if (!PyArg_ParseTuple(args, ""))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2060 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2061 res = (*func)(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2062 if (res == -1 && PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2063 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2064 return PyInt_FromLong(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2065 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2066
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2067 static struct wrapperbase tab_hash[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2068 {"__hash__", (wrapperfunc)wrap_hashfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2069 "x.__hash__() <==> hash(x)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2070 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2071 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2072
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2073 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2074 wrap_call(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2075 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2076 ternaryfunc func = (ternaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2077
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2078 /* XXX What about keyword arguments? */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2079 return (*func)(self, args, NULL);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2080 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2081
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2082 static struct wrapperbase tab_call[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2083 {"__call__", (wrapperfunc)wrap_call,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2084 "x.__call__(...) <==> x(...)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2085 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2086 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2087
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2088 static struct wrapperbase tab_str[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2089 {"__str__", (wrapperfunc)wrap_unaryfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2090 "x.__str__() <==> str(x)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2091 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2092 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2093
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2094 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2095 wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2096 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2097 richcmpfunc func = (richcmpfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2098 PyObject *other;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2099
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2100 if (!PyArg_ParseTuple(args, "O", &other))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2101 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2102 return (*func)(self, other, op);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2103 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2104
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2105 #undef RICHCMP_WRAPPER
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2106 #define RICHCMP_WRAPPER(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2107 static PyObject * \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2108 richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2109 { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2110 return wrap_richcmpfunc(self, args, wrapped, OP); \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2111 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2112
19070
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2113 RICHCMP_WRAPPER(lt, Py_LT)
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2114 RICHCMP_WRAPPER(le, Py_LE)
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2115 RICHCMP_WRAPPER(eq, Py_EQ)
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2116 RICHCMP_WRAPPER(ne, Py_NE)
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2117 RICHCMP_WRAPPER(gt, Py_GT)
39a73c6773f1 Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents: 19040
diff changeset
2118 RICHCMP_WRAPPER(ge, Py_GE)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2119
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2120 #undef RICHCMP_ENTRY
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2121 #define RICHCMP_ENTRY(NAME, EXPR) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2122 {"__" #NAME "__", (wrapperfunc)richcmp_##NAME, \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2123 "x.__" #NAME "__(y) <==> " EXPR}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2124
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2125 static struct wrapperbase tab_richcmp[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2126 RICHCMP_ENTRY(lt, "x<y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2127 RICHCMP_ENTRY(le, "x<=y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2128 RICHCMP_ENTRY(eq, "x==y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2129 RICHCMP_ENTRY(ne, "x!=y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2130 RICHCMP_ENTRY(gt, "x>y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2131 RICHCMP_ENTRY(ge, "x>=y"),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2132 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2133 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2134
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2135 static struct wrapperbase tab_iter[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2136 {"__iter__", (wrapperfunc)wrap_unaryfunc, "x.__iter__() <==> iter(x)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2137 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2138 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2139
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2140 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2141 wrap_next(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2142 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2143 unaryfunc func = (unaryfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2144 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2145
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2146 if (!PyArg_ParseTuple(args, ""))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2147 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2148 res = (*func)(self);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2149 if (res == NULL && !PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2150 PyErr_SetNone(PyExc_StopIteration);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2151 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2152 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2153
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2154 static struct wrapperbase tab_next[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2155 {"next", (wrapperfunc)wrap_next,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2156 "x.next() -> the next value, or raise StopIteration"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2157 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2158 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2159
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2160 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2161 wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2162 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2163 descrgetfunc func = (descrgetfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2164 PyObject *obj;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2165 PyObject *type = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2166
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2167 if (!PyArg_ParseTuple(args, "O|O", &obj, &type))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2168 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2169 return (*func)(self, obj, type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2170 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2171
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2172 static struct wrapperbase tab_descr_get[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2173 {"__get__", (wrapperfunc)wrap_descr_get,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2174 "descr.__get__(obj, type) -> value"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2175 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2176 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2177
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2178 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2179 wrap_descrsetfunc(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2180 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2181 descrsetfunc func = (descrsetfunc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2182 PyObject *obj, *value;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2183 int ret;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2184
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2185 if (!PyArg_ParseTuple(args, "OO", &obj, &value))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2186 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2187 ret = (*func)(self, obj, value);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2188 if (ret < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2189 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2190 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2191 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2192 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2193
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2194 static struct wrapperbase tab_descr_set[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2195 {"__set__", (wrapperfunc)wrap_descrsetfunc,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2196 "descr.__set__(obj, value)"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2197 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2198 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2199
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2200 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2201 wrap_init(PyObject *self, PyObject *args, void *wrapped)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2202 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2203 initproc func = (initproc)wrapped;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2204
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2205 /* XXX What about keyword arguments? */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2206 if (func(self, args, NULL) < 0)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2207 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2208 Py_INCREF(Py_None);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2209 return Py_None;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2210 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2211
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2212 static struct wrapperbase tab_init[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2213 {"__init__", (wrapperfunc)wrap_init,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2214 "x.__init__(...) initializes x; "
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2215 "see x.__type__.__doc__ for signature"},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2216 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2217 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2218
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2219 static PyObject *
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2220 tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2221 {
19429
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2222 PyTypeObject *type, *subtype, *staticbase;
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2223 PyObject *arg0, *res;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2224
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2225 if (self == NULL || !PyType_Check(self))
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2226 Py_FatalError("__new__() called with non-type 'self'");
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2227 type = (PyTypeObject *)self;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2228 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
19429
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2229 PyErr_Format(PyExc_TypeError,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2230 "%s.__new__(): not enough arguments",
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2231 type->tp_name);
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2232 return NULL;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2233 }
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2234 arg0 = PyTuple_GET_ITEM(args, 0);
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2235 if (!PyType_Check(arg0)) {
19429
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2236 PyErr_Format(PyExc_TypeError,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2237 "%s.__new__(X): X is not a type object (%s)",
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2238 type->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2239 arg0->ob_type->tp_name);
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2240 return NULL;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2241 }
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2242 subtype = (PyTypeObject *)arg0;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2243 if (!PyType_IsSubtype(subtype, type)) {
19429
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2244 PyErr_Format(PyExc_TypeError,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2245 "%s.__new__(%s): %s is not a subtype of %s",
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2246 type->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2247 subtype->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2248 subtype->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2249 type->tp_name);
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2250 return NULL;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2251 }
19429
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2252
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2253 /* Check that the use doesn't do something silly and unsafe like
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2254 object.__new__(dictionary). To do this, we check that the
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2255 most derived base that's not a heap type is this type. */
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2256 staticbase = subtype;
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2257 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2258 staticbase = staticbase->tp_base;
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2259 if (staticbase != type) {
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2260 PyErr_Format(PyExc_TypeError,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2261 "%s.__new__(%s) is not safe, use %s.__new__()",
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2262 type->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2263 subtype->tp_name,
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2264 staticbase == NULL ? "?" : staticbase->tp_name);
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2265 return NULL;
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2266 }
9cf669581110 Merge changes from r22a2-branch back into trunk. Also, change patch
Barry Warsaw <barry@python.org>
parents: 19353
diff changeset
2267
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2268 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2269 if (args == NULL)
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2270 return NULL;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2271 res = type->tp_new(subtype, args, kwds);
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2272 Py_DECREF(args);
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2273 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2274 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2275
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2276 static struct PyMethodDef tp_new_methoddef[] = {
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2277 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2278 "T.__new__(S, ...) -> a new object with type S, a subtype of T"},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2279 {0}
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2280 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2281
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2282 static int
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2283 add_tp_new_wrapper(PyTypeObject *type)
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2284 {
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2285 PyObject *func;
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2286
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2287 if (PyDict_GetItemString(type->tp_defined, "__new__") != NULL)
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2288 return 0;
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2289 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2290 if (func == NULL)
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2291 return -1;
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2292 return PyDict_SetItemString(type->tp_defined, "__new__", func);
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2293 }
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2294
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2295 static int
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2296 add_wrappers(PyTypeObject *type, struct wrapperbase *wraps, void *wrapped)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2297 {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2298 PyObject *dict = type->tp_defined;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2299
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2300 for (; wraps->name != NULL; wraps++) {
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2301 PyObject *descr;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2302 if (PyDict_GetItemString(dict, wraps->name))
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2303 continue;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2304 descr = PyDescr_NewWrapper(type, wraps, wrapped);
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2305 if (descr == NULL)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2306 return -1;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2307 if (PyDict_SetItemString(dict, wraps->name, descr) < 0)
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2308 return -1;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2309 Py_DECREF(descr);
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2310 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2311 return 0;
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2312 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
2313
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
2314 /* This function is called by PyType_Ready() to populate the type's
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2315 dictionary with method descriptors for function slots. For each
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2316 function slot (like tp_repr) that's defined in the type, one or
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2317 more corresponding descriptors are added in the type's tp_defined
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2318 dictionary under the appropriate name (like __repr__). Some
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2319 function slots cause more than one descriptor to be added (for
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2320 example, the nb_add slot adds both __add__ and __radd__
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2321 descriptors) and some function slots compete for the same
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2322 descriptor (for example both sq_item and mp_subscript generate a
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2323 __getitem__ descriptor). This only adds new descriptors and
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2324 doesn't overwrite entries in tp_defined that were previously
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2325 defined. The descriptors contain a reference to the C function
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2326 they must call, so that it's safe if they are copied into a
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2327 subtype's __dict__ and the subtype has a different C function in
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2328 its slot -- calling the method defined by the descriptor will call
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2329 the C function that was used to create it, rather than the C
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2330 function present in the slot when it is called. (This is important
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2331 because a subtype may have a C function in the slot that calls the
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2332 method from the dictionary, and we want to avoid infinite recursion
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2333 here.) */
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2334
19011
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
2335 static int
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2336 add_operators(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2337 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2338 PySequenceMethods *sq;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2339 PyMappingMethods *mp;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2340 PyNumberMethods *nb;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2341
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2342 #undef ADD
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2343 #define ADD(SLOT, TABLE) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2344 if (SLOT) { \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2345 if (add_wrappers(type, TABLE, (void *)(SLOT)) < 0) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2346 return -1; \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2347 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2348
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2349 if ((sq = type->tp_as_sequence) != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2350 ADD(sq->sq_length, tab_len);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2351 ADD(sq->sq_concat, tab_concat);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2352 ADD(sq->sq_repeat, tab_mul_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2353 ADD(sq->sq_item, tab_getitem_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2354 ADD(sq->sq_slice, tab_getslice);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2355 ADD(sq->sq_ass_item, tab_setitem_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2356 ADD(sq->sq_ass_slice, tab_setslice);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2357 ADD(sq->sq_contains, tab_contains);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2358 ADD(sq->sq_inplace_concat, tab_iadd);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2359 ADD(sq->sq_inplace_repeat, tab_imul_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2360 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2361
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2362 if ((mp = type->tp_as_mapping) != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2363 if (sq->sq_length == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2364 ADD(mp->mp_length, tab_len);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2365 ADD(mp->mp_subscript, tab_getitem);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2366 ADD(mp->mp_ass_subscript, tab_setitem);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2367 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2368
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2369 /* We don't support "old-style numbers" because their binary
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2370 operators require that both arguments have the same type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2371 the wrappers here only work for new-style numbers. */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2372 if ((type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2373 (nb = type->tp_as_number) != NULL) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2374 ADD(nb->nb_add, tab_add);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2375 ADD(nb->nb_subtract, tab_sub);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2376 ADD(nb->nb_multiply, tab_mul);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2377 ADD(nb->nb_divide, tab_div);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2378 ADD(nb->nb_remainder, tab_mod);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2379 ADD(nb->nb_divmod, tab_divmod);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2380 ADD(nb->nb_power, tab_pow);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2381 ADD(nb->nb_negative, tab_neg);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2382 ADD(nb->nb_positive, tab_pos);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2383 ADD(nb->nb_absolute, tab_abs);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2384 ADD(nb->nb_nonzero, tab_nonzero);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2385 ADD(nb->nb_invert, tab_invert);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2386 ADD(nb->nb_lshift, tab_lshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2387 ADD(nb->nb_rshift, tab_rshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2388 ADD(nb->nb_and, tab_and);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2389 ADD(nb->nb_xor, tab_xor);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2390 ADD(nb->nb_or, tab_or);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2391 /* We don't support coerce() -- see above comment */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2392 ADD(nb->nb_int, tab_int);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2393 ADD(nb->nb_long, tab_long);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2394 ADD(nb->nb_float, tab_float);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2395 ADD(nb->nb_oct, tab_oct);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2396 ADD(nb->nb_hex, tab_hex);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2397 ADD(nb->nb_inplace_add, tab_iadd);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2398 ADD(nb->nb_inplace_subtract, tab_isub);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2399 ADD(nb->nb_inplace_multiply, tab_imul);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2400 ADD(nb->nb_inplace_divide, tab_idiv);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2401 ADD(nb->nb_inplace_remainder, tab_imod);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2402 ADD(nb->nb_inplace_power, tab_ipow);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2403 ADD(nb->nb_inplace_lshift, tab_ilshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2404 ADD(nb->nb_inplace_rshift, tab_irshift);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2405 ADD(nb->nb_inplace_and, tab_iand);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2406 ADD(nb->nb_inplace_xor, tab_ixor);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2407 ADD(nb->nb_inplace_or, tab_ior);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2408 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2409
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2410 ADD(type->tp_getattro, tab_getattr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2411 ADD(type->tp_setattro, tab_setattr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2412 ADD(type->tp_compare, tab_cmp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2413 ADD(type->tp_repr, tab_repr);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2414 ADD(type->tp_hash, tab_hash);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2415 ADD(type->tp_call, tab_call);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2416 ADD(type->tp_str, tab_str);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2417 ADD(type->tp_richcompare, tab_richcmp);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2418 ADD(type->tp_iter, tab_iter);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2419 ADD(type->tp_iternext, tab_next);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2420 ADD(type->tp_descr_get, tab_descr_get);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2421 ADD(type->tp_descr_set, tab_descr_set);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2422 ADD(type->tp_init, tab_init);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2423
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2424 if (type->tp_new != NULL) {
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2425 if (add_tp_new_wrapper(type) < 0)
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2426 return -1;
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2427 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2428
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2429 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2430 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2431
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2432 /* Slot wrappers that call the corresponding __foo__ slot. See comments
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
2433 below at override_slots() for more explanation. */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2434
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2435 #define SLOT0(FUNCNAME, OPSTR) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2436 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2437 FUNCNAME(PyObject *self) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2438 { \
19540
e141b392b61d Fix a typo in SLOT0 macro for the declaration of cache_str.
Guido van Rossum <guido@python.org>
parents: 19538
diff changeset
2439 static PyObject *cache_str; \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2440 return call_method(self, OPSTR, &cache_str, ""); \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2441 }
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2442
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2443 #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2444 static PyObject * \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2445 FUNCNAME(PyObject *self, ARG1TYPE arg1) \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2446 { \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2447 static PyObject *cache_str; \
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2448 return call_method(self, OPSTR, &cache_str, ARGCODES, arg1); \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2449 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2450
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2451
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2452 #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2453 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2454 FUNCNAME(PyObject *self, PyObject *other) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2455 { \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2456 static PyObject *cache_str, *rcache_str; \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2457 if (self->ob_type->tp_as_number != NULL && \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2458 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2459 PyObject *r; \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2460 r = call_method( \
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2461 self, OPSTR, &cache_str, "O", other); \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2462 if (r != Py_NotImplemented || \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2463 other->ob_type == self->ob_type) \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2464 return r; \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2465 Py_DECREF(r); \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2466 } \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2467 if (other->ob_type->tp_as_number != NULL && \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2468 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2469 return call_method( \
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2470 other, ROPSTR, &rcache_str, "O", self); \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2471 } \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2472 Py_INCREF(Py_NotImplemented); \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2473 return Py_NotImplemented; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2474 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2475
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2476 #define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2477 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2478
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2479 #define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2480 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2481 FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2482 { \
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2483 static PyObject *cache_str; \
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2484 return call_method(self, OPSTR, &cache_str, ARGCODES, arg1, arg2); \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2485 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2486
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2487 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2488 slot_sq_length(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2489 {
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2490 static PyObject *len_str;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2491 PyObject *res = call_method(self, "__len__", &len_str, "");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2492
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2493 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2494 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2495 return (int)PyInt_AsLong(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2496 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2497
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2498 SLOT1(slot_sq_concat, "__add__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2499 SLOT1(slot_sq_repeat, "__mul__", int, "i")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2500 SLOT1(slot_sq_item, "__getitem__", int, "i")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2501 SLOT2(slot_sq_slice, "__getslice__", int, int, "ii")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2502
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2503 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2504 slot_sq_ass_item(PyObject *self, int index, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2505 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2506 PyObject *res;
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2507 static PyObject *delitem_str, *setitem_str;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2508
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2509 if (value == NULL)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2510 res = call_method(self, "__delitem__", &delitem_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2511 "i", index);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2512 else
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2513 res = call_method(self, "__setitem__", &setitem_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2514 "iO", index, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2515 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2516 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2517 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2518 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2519 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2520
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2521 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2522 slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2523 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2524 PyObject *res;
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2525 static PyObject *delslice_str, *setslice_str;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2526
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2527 if (value == NULL)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2528 res = call_method(self, "__delslice__", &delslice_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2529 "ii", i, j);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2530 else
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2531 res = call_method(self, "__setslice__", &setslice_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2532 "iiO", i, j, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2533 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2534 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2535 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2536 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2537 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2538
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2539 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2540 slot_sq_contains(PyObject *self, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2541 {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2542 PyObject *func, *res, *args;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2543 static PyObject *contains_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2544
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2545 func = lookup_method(self, "__contains__", &contains_str);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2546
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2547 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2548 args = Py_BuildValue("(O)", value);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2549 if (args == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2550 res = NULL;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2551 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2552 res = PyEval_CallObject(func, args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2553 Py_DECREF(args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2554 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2555 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2556 if (res == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2557 return -1;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2558 return PyObject_IsTrue(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2559 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2560 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2561 PyErr_Clear();
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19803
diff changeset
2562 return _PySequence_IterSearch(self, value,
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19803
diff changeset
2563 PY_ITERSEARCH_CONTAINS);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2564 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2565 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2566
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2567 SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2568 SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2569
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2570 #define slot_mp_length slot_sq_length
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2571
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2572 SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2573
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2574 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2575 slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2576 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2577 PyObject *res;
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2578 static PyObject *delitem_str, *setitem_str;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2579
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2580 if (value == NULL)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2581 res = call_method(self, "__delitem__", &delitem_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2582 "O", key);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2583 else
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2584 res = call_method(self, "__setitem__", &setitem_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2585 "OO", key, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2586 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2587 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2588 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2589 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2590 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2591
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2592 SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2593 SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2594 SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2595 SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2596 SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2597 SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2598
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2599 staticforward PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2600
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2601 SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2602 nb_power, "__pow__", "__rpow__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2603
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2604 static PyObject *
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2605 slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2606 {
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2607 static PyObject *pow_str;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2608
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2609 if (modulus == Py_None)
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2610 return slot_nb_power_binary(self, other);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2611 /* Three-arg power doesn't use __rpow__ */
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2612 return call_method(self, "__pow__", &pow_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2613 "OO", other, modulus);
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2614 }
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2615
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2616 SLOT0(slot_nb_negative, "__neg__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2617 SLOT0(slot_nb_positive, "__pos__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2618 SLOT0(slot_nb_absolute, "__abs__")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2619
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2620 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2621 slot_nb_nonzero(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2622 {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2623 PyObject *func, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2624 static PyObject *nonzero_str, *len_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2625
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2626 func = lookup_method(self, "__nonzero__", &nonzero_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2627 if (func == NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2628 PyErr_Clear();
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2629 func = lookup_method(self, "__len__", &len_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2630 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2631
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2632 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2633 res = PyEval_CallObject(func, NULL);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2634 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2635 if (res == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2636 return -1;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2637 return PyObject_IsTrue(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2638 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2639 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2640 PyErr_Clear();
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2641 return 1;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2642 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2643 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2644
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2645 SLOT0(slot_nb_invert, "__invert__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2646 SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2647 SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2648 SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2649 SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2650 SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2651 /* Not coerce() */
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2652 SLOT0(slot_nb_int, "__int__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2653 SLOT0(slot_nb_long, "__long__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2654 SLOT0(slot_nb_float, "__float__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2655 SLOT0(slot_nb_oct, "__oct__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2656 SLOT0(slot_nb_hex, "__hex__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2657 SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2658 SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2659 SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2660 SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2661 SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2662 SLOT2(slot_nb_inplace_power, "__ipow__", PyObject *, PyObject *, "OO")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2663 SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2664 SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2665 SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2666 SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2667 SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2668 SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2669 "__floordiv__", "__rfloordiv__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2670 SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2671 SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
2672 SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2673
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2674 static int
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2675 half_compare(PyObject *self, PyObject *other)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2676 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2677 PyObject *func, *args, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2678 static PyObject *cmp_str;
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2679 int c;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2680
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2681 func = lookup_method(self, "__cmp__", &cmp_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2682 if (func == NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2683 PyErr_Clear();
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2684 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2685 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2686 args = Py_BuildValue("(O)", other);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2687 if (args == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2688 res = NULL;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2689 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2690 res = PyObject_CallObject(func, args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2691 Py_DECREF(args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2692 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2693 if (res != Py_NotImplemented) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2694 if (res == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2695 return -2;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2696 c = PyInt_AsLong(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2697 Py_DECREF(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2698 if (c == -1 && PyErr_Occurred())
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2699 return -2;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2700 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2701 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2702 Py_DECREF(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2703 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2704 return 2;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2705 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2706
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2707 static int
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2708 slot_tp_compare(PyObject *self, PyObject *other)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2709 {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2710 int c;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2711
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2712 if (self->ob_type->tp_compare == slot_tp_compare) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2713 c = half_compare(self, other);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2714 if (c <= 1)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2715 return c;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2716 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2717 if (other->ob_type->tp_compare == slot_tp_compare) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2718 c = half_compare(other, self);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2719 if (c < -1)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2720 return -2;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2721 if (c <= 1)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2722 return -c;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2723 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2724 return (void *)self < (void *)other ? -1 :
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2725 (void *)self > (void *)other ? 1 : 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2726 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2727
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2728 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2729 slot_tp_repr(PyObject *self)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2730 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2731 PyObject *func, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2732 static PyObject *repr_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2733
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2734 func = lookup_method(self, "__repr__", &repr_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2735 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2736 res = PyEval_CallObject(func, NULL);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2737 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2738 return res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2739 }
19476
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
2740 PyErr_Clear();
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
2741 return PyString_FromFormat("<%s object at %p>",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19469
diff changeset
2742 self->ob_type->tp_name, self);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2743 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2744
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2745 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2746 slot_tp_str(PyObject *self)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2747 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2748 PyObject *func, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2749 static PyObject *str_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2750
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2751 func = lookup_method(self, "__str__", &str_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2752 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2753 res = PyEval_CallObject(func, NULL);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2754 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2755 return res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2756 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2757 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2758 PyErr_Clear();
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2759 return slot_tp_repr(self);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2760 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2761 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2762
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2763 static long
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2764 slot_tp_hash(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2765 {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2766 PyObject *func, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2767 static PyObject *hash_str, *eq_str, *cmp_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2768
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2769 long h;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2770
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2771 func = lookup_method(self, "__hash__", &hash_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2772
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2773 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2774 res = PyEval_CallObject(func, NULL);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2775 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2776 if (res == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2777 return -1;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2778 h = PyInt_AsLong(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2779 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2780 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2781 PyErr_Clear();
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2782 func = lookup_method(self, "__eq__", &eq_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2783 if (func == NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2784 PyErr_Clear();
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2785 func = lookup_method(self, "__cmp__", &cmp_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2786 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2787 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2788 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2789 PyErr_SetString(PyExc_TypeError, "unhashable type");
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2790 return -1;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2791 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2792 PyErr_Clear();
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2793 h = _Py_HashPointer((void *)self);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2794 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2795 if (h == -1 && !PyErr_Occurred())
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2796 h = -2;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2797 return h;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2798 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2799
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2800 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2801 slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2802 {
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2803 static PyObject *call_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2804 PyObject *meth = lookup_method(self, "__call__", &call_str);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2805 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2806
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2807 if (meth == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2808 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2809 res = PyObject_Call(meth, args, kwds);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2810 Py_DECREF(meth);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2811 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2812 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2813
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2814 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2815 slot_tp_getattro(PyObject *self, PyObject *name)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2816 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2817 PyTypeObject *tp = self->ob_type;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2818 PyObject *getattr;
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2819 static PyObject *getattr_str = NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2820
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2821 if (getattr_str == NULL) {
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2822 getattr_str = PyString_InternFromString("__getattr__");
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2823 if (getattr_str == NULL)
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2824 return NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2825 }
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2826 getattr = _PyType_Lookup(tp, getattr_str);
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
2827 if (getattr == NULL) {
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
2828 /* Avoid further slowdowns */
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
2829 if (tp->tp_getattro == slot_tp_getattro)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
2830 tp->tp_getattro = PyObject_GenericGetAttr;
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
2831 return PyObject_GenericGetAttr(self, name);
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
2832 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2833 return PyObject_CallFunction(getattr, "OO", self, name);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2834 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2835
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2836 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2837 slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2838 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2839 PyObject *res;
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2840 static PyObject *delattr_str, *setattr_str;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2841
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2842 if (value == NULL)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2843 res = call_method(self, "__delattr__", &delattr_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2844 "O", name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2845 else
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2846 res = call_method(self, "__setattr__", &setattr_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2847 "OO", name, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2848 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2849 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2850 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2851 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2852 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2853
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2854 /* Map rich comparison operators to their __xx__ namesakes */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2855 static char *name_op[] = {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2856 "__lt__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2857 "__le__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2858 "__eq__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2859 "__ne__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2860 "__gt__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2861 "__ge__",
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2862 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2863
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2864 static PyObject *
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2865 half_richcompare(PyObject *self, PyObject *other, int op)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2866 {
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2867 PyObject *func, *args, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2868 static PyObject *op_str[6];
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2869
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2870 func = lookup_method(self, name_op[op], &op_str[op]);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2871 if (func == NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2872 PyErr_Clear();
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2873 Py_INCREF(Py_NotImplemented);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2874 return Py_NotImplemented;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2875 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2876 args = Py_BuildValue("(O)", other);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2877 if (args == NULL)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2878 res = NULL;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2879 else {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2880 res = PyObject_CallObject(func, args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2881 Py_DECREF(args);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2882 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2883 Py_DECREF(func);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2884 return res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2885 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2886
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2887 /* Map rich comparison operators to their swapped version, e.g. LT --> GT */
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2888 static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2889
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2890 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2891 slot_tp_richcompare(PyObject *self, PyObject *other, int op)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2892 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2893 PyObject *res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2894
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2895 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2896 res = half_richcompare(self, other, op);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2897 if (res != Py_NotImplemented)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2898 return res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2899 Py_DECREF(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2900 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2901 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2902 res = half_richcompare(other, self, swapped_op[op]);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2903 if (res != Py_NotImplemented) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2904 return res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2905 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2906 Py_DECREF(res);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2907 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2908 Py_INCREF(Py_NotImplemented);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2909 return Py_NotImplemented;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2910 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2911
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2912 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2913 slot_tp_iter(PyObject *self)
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2914 {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2915 PyObject *func, *res;
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2916 static PyObject *iter_str, *getitem_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2917
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2918 func = lookup_method(self, "__iter__", &iter_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2919 if (func != NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2920 res = PyObject_CallObject(func, NULL);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2921 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2922 return res;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2923 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2924 PyErr_Clear();
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2925 func = lookup_method(self, "__getitem__", &getitem_str);
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2926 if (func == NULL) {
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2927 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2928 return NULL;
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2929 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2930 Py_DECREF(func);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2931 return PySeqIter_New(self);
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
2932 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2934 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2935 slot_tp_iternext(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2936 {
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2937 static PyObject *next_str;
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2938 return call_method(self, "next", &next_str, "");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2939 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2940
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2941 static PyObject *
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2942 slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2943 {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2944 PyTypeObject *tp = self->ob_type;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2945 PyObject *get;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2946 static PyObject *get_str = NULL;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2947
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2948 if (get_str == NULL) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2949 get_str = PyString_InternFromString("__get__");
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2950 if (get_str == NULL)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2951 return NULL;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2952 }
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2953 get = _PyType_Lookup(tp, get_str);
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2954 if (get == NULL) {
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2955 /* Avoid further slowdowns */
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2956 if (tp->tp_descr_get == slot_tp_descr_get)
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2957 tp->tp_descr_get = NULL;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2958 Py_INCREF(self);
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2959 return self;
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2960 }
19464
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2961 if (obj == NULL)
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2962 obj = Py_None;
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2963 if (type == NULL)
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2964 type = Py_None;
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2965 return PyObject_CallFunction(get, "OOO", self, obj, type);
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
2966 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2967
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2968 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2969 slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2970 {
19464
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2971 PyObject *res;
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2972 static PyObject *del_str, *set_str;
19464
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2973
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2974 if (value == NULL)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2975 res = call_method(self, "__del__", &del_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2976 "O", target);
19464
45d0e114212e slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Guido van Rossum <guido@python.org>
parents: 19429
diff changeset
2977 else
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2978 res = call_method(self, "__set__", &set_str,
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
2979 "OO", target, value);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2980 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2981 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2982 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2983 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2984 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2985
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2986 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2987 slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2988 {
19535
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2989 static PyObject *init_str;
9753608e2d57 Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
2990 PyObject *meth = lookup_method(self, "__init__", &init_str);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2991 PyObject *res;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2992
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2993 if (meth == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2994 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2995 res = PyObject_Call(meth, args, kwds);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2996 Py_DECREF(meth);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2997 if (res == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2998 return -1;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2999 Py_DECREF(res);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3000 return 0;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3001 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3002
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3003 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3004 slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3005 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3006 PyObject *func = PyObject_GetAttrString((PyObject *)type, "__new__");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3007 PyObject *newargs, *x;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3008 int i, n;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3009
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3010 if (func == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3011 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3012 assert(PyTuple_Check(args));
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3013 n = PyTuple_GET_SIZE(args);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3014 newargs = PyTuple_New(n+1);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3015 if (newargs == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3016 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3017 Py_INCREF(type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3018 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3019 for (i = 0; i < n; i++) {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3020 x = PyTuple_GET_ITEM(args, i);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3021 Py_INCREF(x);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3022 PyTuple_SET_ITEM(newargs, i+1, x);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3023 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3024 x = PyObject_Call(func, newargs, kwds);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3025 Py_DECREF(func);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3026 return x;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3027 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3028
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3029 /* This is called at the very end of type_new() (even after
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
3030 PyType_Ready()) to complete the initialization of dynamic types.
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3031 The dict argument is the dictionary argument passed to type_new(),
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3032 which is the local namespace of the class statement, in other
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3033 words, it contains the methods. For each special method (like
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3034 __repr__) defined in the dictionary, the corresponding function
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3035 slot in the type object (like tp_repr) is set to a special function
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3036 whose name is 'slot_' followed by the slot name and whose signature
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3037 is whatever is required for that slot. These slot functions look
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3038 up the corresponding method in the type's dictionary and call it.
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3039 The slot functions have to take care of the various peculiarities
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3040 of the mapping between slots and special methods, such as mapping
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3041 one slot to multiple methods (tp_richcompare <--> __le__, __lt__
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3042 etc.) or mapping multiple slots to a single method (sq_item,
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3043 mp_subscript <--> __getitem__). */
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
3044
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3045 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3046 override_slots(PyTypeObject *type, PyObject *dict)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3047 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3048 PySequenceMethods *sq = type->tp_as_sequence;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3049 PyMappingMethods *mp = type->tp_as_mapping;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3050 PyNumberMethods *nb = type->tp_as_number;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3051
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3052 #define SQSLOT(OPNAME, SLOTNAME, FUNCNAME) \
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3053 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3054 sq->SLOTNAME = FUNCNAME; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3055 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3056
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3057 #define MPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3058 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3059 mp->SLOTNAME = FUNCNAME; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3060 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3061
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3062 #define NBSLOT(OPNAME, SLOTNAME, FUNCNAME) \
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3063 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3064 nb->SLOTNAME = FUNCNAME; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3065 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3066
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3067 #define TPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3068 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3069 type->SLOTNAME = FUNCNAME; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3070 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3071
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3072 SQSLOT("__len__", sq_length, slot_sq_length);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3073 SQSLOT("__add__", sq_concat, slot_sq_concat);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3074 SQSLOT("__mul__", sq_repeat, slot_sq_repeat);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3075 SQSLOT("__getitem__", sq_item, slot_sq_item);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3076 SQSLOT("__getslice__", sq_slice, slot_sq_slice);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3077 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3078 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3079 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3080 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3081 SQSLOT("__contains__", sq_contains, slot_sq_contains);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3082 SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3083 SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3084
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3085 MPSLOT("__len__", mp_length, slot_mp_length);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3086 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3087 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3088 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3089
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3090 NBSLOT("__add__", nb_add, slot_nb_add);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3091 NBSLOT("__sub__", nb_subtract, slot_nb_subtract);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3092 NBSLOT("__mul__", nb_multiply, slot_nb_multiply);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3093 NBSLOT("__div__", nb_divide, slot_nb_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3094 NBSLOT("__mod__", nb_remainder, slot_nb_remainder);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3095 NBSLOT("__divmod__", nb_divmod, slot_nb_divmod);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3096 NBSLOT("__pow__", nb_power, slot_nb_power);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3097 NBSLOT("__neg__", nb_negative, slot_nb_negative);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3098 NBSLOT("__pos__", nb_positive, slot_nb_positive);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3099 NBSLOT("__abs__", nb_absolute, slot_nb_absolute);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3100 NBSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3101 NBSLOT("__invert__", nb_invert, slot_nb_invert);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3102 NBSLOT("__lshift__", nb_lshift, slot_nb_lshift);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3103 NBSLOT("__rshift__", nb_rshift, slot_nb_rshift);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3104 NBSLOT("__and__", nb_and, slot_nb_and);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3105 NBSLOT("__xor__", nb_xor, slot_nb_xor);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3106 NBSLOT("__or__", nb_or, slot_nb_or);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3107 /* Not coerce() */
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3108 NBSLOT("__int__", nb_int, slot_nb_int);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3109 NBSLOT("__long__", nb_long, slot_nb_long);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3110 NBSLOT("__float__", nb_float, slot_nb_float);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3111 NBSLOT("__oct__", nb_oct, slot_nb_oct);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3112 NBSLOT("__hex__", nb_hex, slot_nb_hex);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3113 NBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3114 NBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3115 NBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3116 NBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3117 NBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3118 NBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3119 NBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3120 NBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3121 NBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3122 NBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3123 NBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3124 NBSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3125 NBSLOT("__truediv__", nb_true_divide, slot_nb_true_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3126 NBSLOT("__ifloordiv__", nb_inplace_floor_divide,
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3127 slot_nb_inplace_floor_divide);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3128 NBSLOT("__itruediv__", nb_inplace_true_divide,
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3129 slot_nb_inplace_true_divide);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3130
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3131 if (dict == NULL ||
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3132 PyDict_GetItemString(dict, "__str__") ||
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3133 PyDict_GetItemString(dict, "__repr__"))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3134 type->tp_print = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3135
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3136 TPSLOT("__cmp__", tp_compare, slot_tp_compare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3137 TPSLOT("__repr__", tp_repr, slot_tp_repr);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3138 TPSLOT("__hash__", tp_hash, slot_tp_hash);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3139 TPSLOT("__call__", tp_call, slot_tp_call);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3140 TPSLOT("__str__", tp_str, slot_tp_str);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3141 TPSLOT("__getattr__", tp_getattro, slot_tp_getattro);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3142 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3143 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3144 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3145 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3146 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3147 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3148 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3149 TPSLOT("__iter__", tp_iter, slot_tp_iter);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3150 TPSLOT("next", tp_iternext, slot_tp_iternext);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3151 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3152 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3153 TPSLOT("__init__", tp_init, slot_tp_init);
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
3154 TPSLOT("__new__", tp_new, slot_tp_new);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3155 }
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3156
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3157
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3158 /* Cooperative 'super' */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3159
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3160 typedef struct {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3161 PyObject_HEAD
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3162 PyTypeObject *type;
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3163 PyObject *obj;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3164 } superobject;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3165
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3166 static struct memberlist super_members[] = {
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3167 {"__type__", T_OBJECT, offsetof(superobject, type), READONLY},
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3168 {"__obj__", T_OBJECT, offsetof(superobject, obj), READONLY},
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3169 {0}
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3170 };
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3171
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3172 static void
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3173 super_dealloc(PyObject *self)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3174 {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3175 superobject *su = (superobject *)self;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3176
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3177 Py_XDECREF(su->obj);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3178 Py_XDECREF(su->type);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3179 self->ob_type->tp_free(self);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3180 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3181
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3182 static PyObject *
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3183 super_repr(PyObject *self)
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3184 {
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3185 superobject *su = (superobject *)self;
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3186
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3187 if (su->obj)
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3188 return PyString_FromFormat(
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3189 "<super: <type '%s'>, <%s object>>",
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3190 su->type ? su->type->tp_name : "NULL",
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3191 su->obj->ob_type->tp_name);
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3192 else
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3193 return PyString_FromFormat(
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3194 "<super: <type '%s'>, NULL>",
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3195 su->type ? su->type->tp_name : "NULL");
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3196 }
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3197
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3198 static PyObject *
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3199 super_getattro(PyObject *self, PyObject *name)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3200 {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3201 superobject *su = (superobject *)self;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3202
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3203 if (su->obj != NULL) {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3204 PyObject *mro, *res, *tmp;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3205 descrgetfunc f;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3206 int i, n;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3207
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3208 mro = su->obj->ob_type->tp_mro;
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3209 if (mro == NULL)
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3210 n = 0;
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3211 else {
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3212 assert(PyTuple_Check(mro));
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3213 n = PyTuple_GET_SIZE(mro);
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3214 }
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3215 for (i = 0; i < n; i++) {
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3216 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3217 break;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3218 }
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3219 if (i >= n && PyType_Check(su->obj)) {
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3220 mro = ((PyTypeObject *)(su->obj))->tp_mro;
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3221 if (mro == NULL)
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3222 n = 0;
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3223 else {
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3224 assert(PyTuple_Check(mro));
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3225 n = PyTuple_GET_SIZE(mro);
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3226 }
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3227 for (i = 0; i < n; i++) {
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3228 if ((PyObject *)(su->type) ==
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3229 PyTuple_GET_ITEM(mro, i))
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3230 break;
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3231 }
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3232 }
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3233 i++;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3234 res = NULL;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3235 for (; i < n; i++) {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3236 tmp = PyTuple_GET_ITEM(mro, i);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3237 assert(PyType_Check(tmp));
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3238 res = PyDict_GetItem(
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3239 ((PyTypeObject *)tmp)->tp_defined, name);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3240 if (res != NULL) {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3241 Py_INCREF(res);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3242 f = res->ob_type->tp_descr_get;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3243 if (f != NULL) {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3244 tmp = f(res, su->obj, res);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3245 Py_DECREF(res);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3246 res = tmp;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3247 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3248 return res;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3249 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3250 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3251 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3252 return PyObject_GenericGetAttr(self, name);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3253 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3254
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3255 static PyObject *
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3256 super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3257 {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3258 superobject *su = (superobject *)self;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3259 superobject *new;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3260
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3261 if (obj == NULL || obj == Py_None || su->obj != NULL) {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3262 /* Not binding to an object, or already bound */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3263 Py_INCREF(self);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3264 return self;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3265 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3266 new = (superobject *)PySuper_Type.tp_new(&PySuper_Type, NULL, NULL);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3267 if (new == NULL)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3268 return NULL;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3269 Py_INCREF(su->type);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3270 Py_INCREF(obj);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3271 new->type = su->type;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3272 new->obj = obj;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3273 return (PyObject *)new;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3274 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3275
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3276 static int
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3277 super_init(PyObject *self, PyObject *args, PyObject *kwds)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3278 {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3279 superobject *su = (superobject *)self;
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3280 PyTypeObject *type;
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3281 PyObject *obj = NULL;
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3282
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3283 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3284 return -1;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3285 if (obj == Py_None)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3286 obj = NULL;
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3287 if (obj != NULL &&
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3288 !PyType_IsSubtype(obj->ob_type, type) &&
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3289 !(PyType_Check(obj) &&
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3290 PyType_IsSubtype((PyTypeObject *)obj, type))) {
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3291 PyErr_SetString(PyExc_TypeError,
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3292 "super(type, obj): "
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3293 "obj must be an instance or subtype of type");
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3294 return -1;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3295 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3296 Py_INCREF(type);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3297 Py_XINCREF(obj);
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3298 su->type = type;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3299 su->obj = obj;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3300 return 0;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3301 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3302
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3303 static char super_doc[] =
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3304 "super(type) -> unbound super object\n"
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3305 "super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
19551
01a6901cd305 Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents: 19540
diff changeset
3306 "super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3307 "Typical use to call a cooperative superclass method:\n"
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3308 "class C(B):\n"
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3309 " def meth(self, arg):\n"
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3310 " super(C, self).meth(arg)";
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3311
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3312 PyTypeObject PySuper_Type = {
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3313 PyObject_HEAD_INIT(&PyType_Type)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3314 0, /* ob_size */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3315 "super", /* tp_name */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3316 sizeof(superobject), /* tp_basicsize */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3317 0, /* tp_itemsize */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3318 /* methods */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3319 super_dealloc, /* tp_dealloc */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3320 0, /* tp_print */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3321 0, /* tp_getattr */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3322 0, /* tp_setattr */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3323 0, /* tp_compare */
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3324 super_repr, /* tp_repr */
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3325 0, /* tp_as_number */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3326 0, /* tp_as_sequence */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3327 0, /* tp_as_mapping */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3328 0, /* tp_hash */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3329 0, /* tp_call */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3330 0, /* tp_str */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3331 super_getattro, /* tp_getattro */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3332 0, /* tp_setattro */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3333 0, /* tp_as_buffer */
19594
c48654959dc4 Make 'super' subclassable. (Not sure how useful this is yet. :-)
Guido van Rossum <guido@python.org>
parents: 19582
diff changeset
3334 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3335 super_doc, /* tp_doc */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3336 0, /* tp_traverse */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3337 0, /* tp_clear */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3338 0, /* tp_richcompare */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3339 0, /* tp_weaklistoffset */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3340 0, /* tp_iter */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3341 0, /* tp_iternext */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3342 0, /* tp_methods */
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
3343 super_members, /* tp_members */
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3344 0, /* tp_getset */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3345 0, /* tp_base */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3346 0, /* tp_dict */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3347 super_descr_get, /* tp_descr_get */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3348 0, /* tp_descr_set */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3349 0, /* tp_dictoffset */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3350 super_init, /* tp_init */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3351 PyType_GenericAlloc, /* tp_alloc */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3352 PyType_GenericNew, /* tp_new */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3353 _PyObject_Del, /* tp_free */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
3354 };