blob: bd95bc039face1ca95059fb7b1f8a4d03e819c35 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Class object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum52ca98a1994-09-05 07:32:29 +000037/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038static PyObject *class_lookup
39 Py_PROTO((PyClassObject *, PyObject *, PyClassObject **));
40static PyObject *instance_getattr1 Py_PROTO((PyInstanceObject *, PyObject *));
Jeremy Hylton9e392e22000-04-26 20:39:20 +000041static PyObject *instance_getattr2 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042
Guido van Rossuma63eff61998-05-29 21:37:21 +000043static PyObject *getattrstr, *setattrstr, *delattrstr;
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
46PyClass_New(bases, dict, name)
47 PyObject *bases; /* NULL or tuple of classobjects! */
48 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000049 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000053 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000054 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000055 if (docstr == NULL)
56 return NULL;
57 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 if (modstr == NULL) {
59 modstr= PyString_InternFromString("__module__");
60 if (modstr == NULL)
61 return NULL;
62 }
63 if (namestr == NULL) {
64 namestr= PyString_InternFromString("__name__");
65 if (namestr == NULL)
66 return NULL;
67 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000068 if (name == NULL || !PyString_Check(name)) {
69 PyErr_SetString(PyExc_SystemError,
70 "PyClass_New: name must be a string");
71 return NULL;
72 }
73 if (dict == NULL || !PyDict_Check(dict)) {
74 PyErr_SetString(PyExc_SystemError,
75 "PyClass_New: dict must be a dictionary");
76 return NULL;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 if (PyDict_GetItem(dict, docstr) == NULL) {
79 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000080 return NULL;
81 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000082 if (PyDict_GetItem(dict, modstr) == NULL) {
83 PyObject *globals = PyEval_GetGlobals();
84 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000085 PyObject *modname = PyDict_GetItem(globals, namestr);
86 if (modname != NULL) {
87 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000088 return NULL;
89 }
90 }
91 }
Guido van Rossume2966a61991-12-10 13:53:23 +000092 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000094 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000095 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000096 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000097 else {
98 int i;
99 if (!PyTuple_Check(bases)) {
100 PyErr_SetString(PyExc_SystemError,
101 "PyClass_New: bases must be a tuple");
102 return NULL;
103 }
104 i = PyTuple_Size(bases);
105 while (--i >= 0) {
106 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
107 PyErr_SetString(PyExc_SystemError,
108 "PyClass_New: base must be a class");
109 return NULL;
110 }
111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000113 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000115 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000118 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000121 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000123 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000124 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000125 getattrstr = PyString_InternFromString("__getattr__");
126 setattrstr = PyString_InternFromString("__setattr__");
127 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000128 }
129 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
130 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
131 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 Py_XINCREF(op->cl_getattr);
133 Py_XINCREF(op->cl_setattr);
134 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
138/* Class methods */
139
140static void
141class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 Py_DECREF(op->cl_bases);
145 Py_DECREF(op->cl_dict);
146 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000147 Py_XDECREF(op->cl_getattr);
148 Py_XDECREF(op->cl_setattr);
149 Py_XDECREF(op->cl_delattr);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000150 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151}
152
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000154class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 PyClassObject *cp;
156 PyObject *name;
157 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000158{
159 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000161 if (value != NULL) {
162 *pclass = cp;
163 return value;
164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000166 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000167 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 PyObject *v = class_lookup(
169 (PyClassObject *)
170 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000171 if (v != NULL)
172 return v;
173 }
174 return NULL;
175}
176
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyClassObject *op;
180 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 register PyObject *v;
183 register char *sname = PyString_AsString(name);
184 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000185 if (sname[0] == '_' && sname[1] == '_') {
186 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 if (PyEval_GetRestricted()) {
188 PyErr_SetString(PyExc_RuntimeError,
189 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000190 return NULL;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000193 return op->cl_dict;
194 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000195 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000197 return op->cl_bases;
198 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000199 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000200 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000202 else
203 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000205 return v;
206 }
Guido van Rossum94308391991-10-20 20:11:48 +0000207 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000208 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000209 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000211 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000213 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 if (PyFunction_Check(v)) {
215 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
216 (PyObject *)class);
217 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000218 v = w;
219 }
220 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221}
222
Guido van Rossuma63eff61998-05-29 21:37:21 +0000223static void
224set_slot(slot, v)
225 PyObject **slot;
226 PyObject *v;
227{
228 PyObject *temp = *slot;
229 Py_XINCREF(v);
230 *slot = v;
231 Py_XDECREF(temp);
232}
233
Guido van Rossum7ba30431998-07-08 13:34:48 +0000234static void
235set_attr_slots(c)
236 PyClassObject *c;
237{
238 PyClassObject *dummy;
239
240 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
241 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
242 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
243}
244
Guido van Rossuma63eff61998-05-29 21:37:21 +0000245static char *
246set_dict(c, v)
247 PyClassObject *c;
248 PyObject *v;
249{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 if (v == NULL || !PyDict_Check(v))
251 return "__dict__ must be a dictionary object";
252 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000253 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000254 return "";
255}
256
257static char *
258set_bases(c, v)
259 PyClassObject *c;
260 PyObject *v;
261{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000262 int i, n;
263
264 if (v == NULL || !PyTuple_Check(v))
265 return "__bases__ must be a tuple object";
266 n = PyTuple_Size(v);
267 for (i = 0; i < n; i++) {
268 PyObject *x = PyTuple_GET_ITEM(v, i);
269 if (!PyClass_Check(x))
270 return "__bases__ items must be classes";
271 if (PyClass_IsSubclass(x, (PyObject *)c))
272 return "a __bases__ item causes an inheritance cycle";
273 }
274 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000275 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000276 return "";
277}
278
279static char *
280set_name(c, v)
281 PyClassObject *c;
282 PyObject *v;
283{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000284 if (v == NULL || !PyString_Check(v))
285 return "__name__ must be a string object";
Guido van Rossume0fdf6f1998-06-12 15:03:58 +0000286 if ((long)strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000287 return "__name__ must not contain null bytes";
288 set_slot(&c->cl_name, v);
289 return "";
290}
291
Guido van Rossum94308391991-10-20 20:11:48 +0000292static int
293class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyClassObject *op;
295 PyObject *name;
296 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000297{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000298 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 if (PyEval_GetRestricted()) {
300 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000301 "classes are read-only in restricted mode");
302 return -1;
303 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000304 sname = PyString_AsString(name);
305 if (sname[0] == '_' && sname[1] == '_') {
306 int n = PyString_Size(name);
307 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000308 char *err = NULL;
309 if (strcmp(sname, "__dict__") == 0)
310 err = set_dict(op, v);
311 else if (strcmp(sname, "__bases__") == 0)
312 err = set_bases(op, v);
313 else if (strcmp(sname, "__name__") == 0)
314 err = set_name(op, v);
315 else if (strcmp(sname, "__getattr__") == 0)
316 set_slot(&op->cl_getattr, v);
317 else if (strcmp(sname, "__setattr__") == 0)
318 set_slot(&op->cl_setattr, v);
319 else if (strcmp(sname, "__delattr__") == 0)
320 set_slot(&op->cl_delattr, v);
321 /* For the last three, we fall through to update the
322 dictionary as well. */
323 if (err != NULL) {
324 if (*err == '\0')
325 return 0;
326 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000327 return -1;
328 }
329 }
330 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000331 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000333 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000335 "delete non-existing class attribute");
336 return rv;
337 }
Guido van Rossum94308391991-10-20 20:11:48 +0000338 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000340}
341
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000343class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000345{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000346 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000347 char buf[140];
348 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000350 name = "?";
351 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000353 if (mod == NULL || !PyString_Check(mod))
354 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
355 else
356 sprintf(buf, "<class %.50s.%.50s at %lx>",
357 PyString_AsString(mod),
358 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000360}
361
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000362static PyObject *
363class_str(op)
364 PyClassObject *op;
365{
366 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
367 PyObject *name = op->cl_name;
368 PyObject *res;
369 int m, n;
370
371 if (name == NULL || !PyString_Check(name))
372 return class_repr(op);
373 if (mod == NULL || !PyString_Check(mod)) {
374 Py_INCREF(name);
375 return name;
376 }
377 m = PyString_Size(mod);
378 n = PyString_Size(name);
379 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
380 if (res != NULL) {
381 char *s = PyString_AsString(res);
382 memcpy(s, PyString_AsString(mod), m);
383 s += m;
384 *s++ = '.';
385 memcpy(s, PyString_AsString(name), n);
386 }
387 return res;
388}
389
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390PyTypeObject PyClass_Type = {
391 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 0,
393 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000396 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000398 0, /*tp_getattr*/
399 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000401 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 0, /*tp_as_number*/
403 0, /*tp_as_sequence*/
404 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000405 0, /*tp_hash*/
406 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000407 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000408 (getattrofunc)class_getattr, /*tp_getattro*/
409 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410};
411
Guido van Rossum81daa321993-05-20 14:24:46 +0000412int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413PyClass_IsSubclass(class, base)
414 PyObject *class;
415 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000416{
417 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000419 if (class == base)
420 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000422 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 cp = (PyClassObject *)class;
424 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000425 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000427 return 1;
428 }
429 return 0;
430}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431
Guido van Rossum81daa321993-05-20 14:24:46 +0000432
433/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435PyObject *
436PyInstance_New(class, arg, kw)
437 PyObject *class;
438 PyObject *arg;
439 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 register PyInstanceObject *inst;
442 PyObject *init;
443 static PyObject *initstr;
444 if (!PyClass_Check(class)) {
445 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 return NULL;
447 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000449 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 Py_INCREF(class);
452 inst->in_class = (PyClassObject *)class;
453 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000454 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 return NULL;
457 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000458 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000459 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000460 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000461 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 if ((arg != NULL && (!PyTuple_Check(arg) ||
463 PyTuple_Size(arg) != 0))
464 || (kw != NULL && (!PyDict_Check(kw) ||
465 PyDict_Size(kw) != 0))) {
466 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000467 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000469 inst = NULL;
470 }
471 }
472 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
474 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000475 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 inst = NULL;
478 }
479 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 if (res != Py_None) {
481 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000482 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000484 inst = NULL;
485 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000487 }
488 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490}
491
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000492/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493
494static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000495instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyObject *error_type, *error_value, *error_traceback;
499 PyObject *del;
500 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000501 /* Call the __del__ method if it exists. First temporarily
502 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000503#ifdef Py_TRACE_REFS
504 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 extern long _Py_RefTotal;
506 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000507 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000509#ifdef COUNT_ALLOCS
510 inst->ob_type->tp_alloc--; /* ditto */
511#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000512#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000514#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000516 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000517 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000518 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000520 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyObject *f, *t, *v, *tb;
522 PyErr_Fetch(&t, &v, &tb);
523 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000524 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000526 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyFile_WriteObject(t, f, Py_PRINT_RAW);
528 if (v && v != Py_None) {
529 PyFile_WriteString(": ", f);
530 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000531 }
532 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 PyFile_WriteString(" in ", f);
534 PyFile_WriteObject(del, f, 0);
535 PyFile_WriteString(" ignored\n", f);
536 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000537 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000538 Py_XDECREF(t);
539 Py_XDECREF(v);
540 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000541 }
542 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 Py_DECREF(res);
544 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000545 }
546 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000548 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000549 if (--inst->ob_refcnt > 0) {
550#ifdef COUNT_ALLOCS
551 inst->ob_type->tp_free--;
552#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000553 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000554 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000555#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000556#ifdef COUNT_ALLOCS
557 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
558#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000559 _Py_ForgetReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000560 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000561#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 Py_DECREF(inst->in_class);
563 Py_XDECREF(inst->in_dict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000564 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565}
566
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000568instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 register PyInstanceObject *inst;
570 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 register PyObject *v;
573 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000574 if (sname[0] == '_' && sname[1] == '_') {
575 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 if (PyEval_GetRestricted()) {
577 PyErr_SetString(PyExc_RuntimeError,
578 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000579 return NULL;
580 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000582 return inst->in_dict;
583 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000584 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 Py_INCREF(inst->in_class);
586 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000587 }
Guido van Rossum94308391991-10-20 20:11:48 +0000588 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000589 v = instance_getattr2(inst, name);
590 if (v == NULL) {
591 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
592 PyString_AS_STRING(inst->in_class->cl_name), sname);
593 }
594 return v;
595}
596
597static PyObject *
598instance_getattr2(inst, name)
599 register PyInstanceObject *inst;
600 PyObject *name;
601{
602 register PyObject *v;
603 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000604 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000606 if (v == NULL) {
607 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000608 if (v == NULL)
609 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000611 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000612 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 if (PyFunction_Check(v)) {
614 PyObject *w = PyMethod_New(v, (PyObject *)inst,
615 (PyObject *)class);
616 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000617 v = w;
618 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 else if (PyMethod_Check(v)) {
620 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000621 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
623 PyObject *im_func = PyMethod_Function(v);
624 PyObject *w = PyMethod_New(im_func,
625 (PyObject *)inst, im_class);
626 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000627 v = w;
628 }
629 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000630 }
631 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000632}
633
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000635instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 register PyInstanceObject *inst;
637 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000640 res = instance_getattr1(inst, name);
641 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyObject *args;
643 PyErr_Clear();
644 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000645 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000646 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 res = PyEval_CallObject(func, args);
648 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000649 }
650 return res;
651}
652
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653static int
Guido van Rossume7737541994-09-05 07:31:41 +0000654instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 PyInstanceObject *inst;
656 PyObject *name;
657 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658{
Guido van Rossum94472a01992-09-04 09:45:18 +0000659 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000661 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000663 "delete non-existing instance attribute");
664 return rv;
665 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000666 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668}
669
Guido van Rossume7737541994-09-05 07:31:41 +0000670static int
671instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 PyInstanceObject *inst;
673 PyObject *name;
674 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000675{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000676 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000678 if (sname[0] == '_' && sname[1] == '_') {
679 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000680 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000681 if (strcmp(sname, "__dict__") == 0) {
682 if (PyEval_GetRestricted()) {
683 PyErr_SetString(PyExc_RuntimeError,
684 "__dict__ not accessible in restricted mode");
685 return -1;
686 }
687 if (v == NULL || !PyDict_Check(v)) {
688 PyErr_SetString(PyExc_TypeError,
689 "__dict__ must be set to a dictionary");
690 return -1;
691 }
692 tmp = inst->in_dict;
693 Py_INCREF(v);
694 inst->in_dict = v;
695 Py_DECREF(tmp);
696 return 0;
697 }
698 if (strcmp(sname, "__class__") == 0) {
699 if (PyEval_GetRestricted()) {
700 PyErr_SetString(PyExc_RuntimeError,
701 "__class__ not accessible in restricted mode");
702 return -1;
703 }
704 if (v == NULL || !PyClass_Check(v)) {
705 PyErr_SetString(PyExc_TypeError,
706 "__class__ must be set to a class");
707 return -1;
708 }
709 tmp = (PyObject *)(inst->in_class);
710 Py_INCREF(v);
711 inst->in_class = (PyClassObject *)v;
712 Py_DECREF(tmp);
713 return 0;
714 }
Guido van Rossume7737541994-09-05 07:31:41 +0000715 }
Guido van Rossume7737541994-09-05 07:31:41 +0000716 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000717 if (v == NULL)
718 func = inst->in_class->cl_delattr;
719 else
720 func = inst->in_class->cl_setattr;
721 if (func == NULL)
722 return instance_setattr1(inst, name, v);
723 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000725 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000727 if (args == NULL)
728 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 res = PyEval_CallObject(func, args);
730 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000731 if (res == NULL)
732 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000734 return 0;
735}
736
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 PyObject *func;
742 PyObject *res;
743 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000744
Guido van Rossum2878a691996-08-09 20:53:24 +0000745 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000746 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000747 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000748 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000749 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000751 PyObject *mod = PyDict_GetItemString(
752 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000753 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 if (classname != NULL && PyString_Check(classname))
755 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000756 else
757 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000759 if (mod == NULL || !PyString_Check(mod))
760 sprintf(buf, "<?.%.100s instance at %lx>",
761 cname, (long)inst);
762 else
763 sprintf(buf, "<%.50s.%.50s instance at %lx>",
764 PyString_AsString(mod),
765 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 res = PyEval_CallObject(func, (PyObject *)NULL);
769 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770 return res;
771}
772
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000774instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000776{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000778 instance_compare1);
779}
780
Guido van Rossum9bfef441993-03-29 10:43:31 +0000781static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000784{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000786 long outcome;
787 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000788 if (result == NULL)
789 return -1;
790 if (!PyInt_Check(result)) {
791 Py_DECREF(result);
792 PyErr_SetString(PyExc_TypeError,
793 "comparison did not return an int");
794 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000795 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 outcome = PyInt_AsLong(result);
797 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000798 if (outcome < 0)
799 return -1;
800 else if (outcome > 0)
801 return 1;
802 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000803}
804
Guido van Rossum9bfef441993-03-29 10:43:31 +0000805static long
806instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000808{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 PyObject *func;
810 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000811 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000813
Guido van Rossum2878a691996-08-09 20:53:24 +0000814 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000815 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000816 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000817 if (func == NULL) {
818 /* If there is no __cmp__ method, we hash on the address.
819 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000821 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000822 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000823 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000824 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000826 outcome = (long)inst;
827 if (outcome == -1)
828 outcome = -2;
829 return outcome;
830 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832 return -1;
833 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 res = PyEval_CallObject(func, (PyObject *)NULL);
835 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836 if (res == NULL)
837 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 if (PyInt_Check(res)) {
839 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000840 if (outcome == -1)
841 outcome = -2;
842 }
843 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyErr_SetString(PyExc_TypeError,
845 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000846 outcome = -1;
847 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000849 return outcome;
850}
851
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000853
Guido van Rossum9bfef441993-03-29 10:43:31 +0000854static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000857{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyObject *func;
859 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000860 int outcome;
861
Guido van Rossum2878a691996-08-09 20:53:24 +0000862 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000863 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 if (func == NULL)
866 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 res = PyEval_CallObject(func, (PyObject *)NULL);
868 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000869 if (res == NULL)
870 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 if (PyInt_Check(res)) {
872 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000873 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 PyErr_SetString(PyExc_ValueError,
875 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000876 }
877 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 PyErr_SetString(PyExc_TypeError,
879 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 outcome = -1;
881 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 return outcome;
884}
885
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 PyInstanceObject *inst;
889 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 PyObject *func;
892 PyObject *arg;
893 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894
Guido van Rossum2878a691996-08-09 20:53:24 +0000895 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000896 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000897 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000898 if (func == NULL)
899 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903 return NULL;
904 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 res = PyEval_CallObject(func, arg);
906 Py_DECREF(func);
907 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908 return res;
909}
910
Guido van Rossum9bfef441993-03-29 10:43:31 +0000911static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000912instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 PyInstanceObject*inst;
914 PyObject *key;
915 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000916{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 PyObject *func;
918 PyObject *arg;
919 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920
Guido van Rossum2878a691996-08-09 20:53:24 +0000921 if (value == NULL) {
922 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000923 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 func = instance_getattr(inst, delitemstr);
925 }
926 else {
927 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000928 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000929 func = instance_getattr(inst, setitemstr);
930 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 if (func == NULL)
932 return -1;
933 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000937 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000939 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000940 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 res = PyEval_CallObject(func, arg);
942 Py_DECREF(func);
943 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944 if (res == NULL)
945 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947 return 0;
948}
949
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000951 (inquiry)instance_length, /*mp_length*/
952 (binaryfunc)instance_subscript, /*mp_subscript*/
953 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000954};
955
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959 int i;
960{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000962
Guido van Rossum2878a691996-08-09 20:53:24 +0000963 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000964 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000965 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000966 if (func == NULL)
967 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000969 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971 return NULL;
972 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 res = PyEval_CallObject(func, arg);
974 Py_DECREF(func);
975 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976 return res;
977}
978
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982 int i, j;
983{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 PyObject *func, *arg, *res;
985 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986
Guido van Rossum2878a691996-08-09 20:53:24 +0000987 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000988 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000989 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990 if (func == NULL)
991 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 return NULL;
996 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 res = PyEval_CallObject(func, arg);
998 Py_DECREF(func);
999 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 return res;
1001}
1002
1003static int
1004instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010
Guido van Rossum2878a691996-08-09 20:53:24 +00001011 if (item == NULL) {
1012 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001013 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001014 func = instance_getattr(inst, delitemstr);
1015 }
1016 else {
1017 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001018 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001019 func = instance_getattr(inst, setitemstr);
1020 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001022 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001023 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001029 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 res = PyEval_CallObject(func, arg);
1032 Py_DECREF(func);
1033 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 if (res == NULL)
1035 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001037 return 0;
1038}
1039
1040static int
1041instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001043 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001045{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 PyObject *func, *arg, *res;
1047 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048
Guido van Rossum2878a691996-08-09 20:53:24 +00001049 if (value == NULL) {
1050 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 delslicestr =
1052 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001053 func = instance_getattr(inst, delslicestr);
1054 }
1055 else {
1056 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 setslicestr =
1058 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001059 func = instance_getattr(inst, setslicestr);
1060 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001061 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001062 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001063 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001067 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001069 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 res = PyEval_CallObject(func, arg);
1072 Py_DECREF(func);
1073 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 if (res == NULL)
1075 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001077 return 0;
1078}
1079
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001080static int instance_contains(PyInstanceObject *inst, PyObject *member)
1081{
1082 static PyObject *__contains__;
1083 PyObject *func, *arg, *res;
1084 int ret;
1085
1086 if(__contains__ == NULL) {
1087 __contains__ = PyString_InternFromString("__contains__");
1088 if(__contains__ == NULL)
1089 return -1;
1090 }
1091 func = instance_getattr(inst, __contains__);
1092 if(func == NULL) {
1093 /* fall back to previous behaviour */
1094 int i, cmp_res;
1095
1096 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1097 return -1;
1098 PyErr_Clear();
1099 for(i=0;;i++) {
1100 PyObject *obj = instance_item(inst, i);
1101 int ret = 0;
1102
1103 if(obj == NULL) {
1104 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1105 return -1;
1106 PyErr_Clear();
1107 return 0;
1108 }
1109 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1110 ret = -1;
1111 if(cmp_res == 0)
1112 ret = 1;
1113 Py_DECREF(obj);
1114 if(ret)
1115 return ret;
1116 }
1117 }
1118 arg = Py_BuildValue("(O)", member);
1119 if(arg == NULL) {
1120 Py_DECREF(func);
1121 return -1;
1122 }
1123 res = PyEval_CallObject(func, arg);
1124 Py_DECREF(func);
1125 Py_DECREF(arg);
1126 if(res == NULL)
1127 return -1;
1128 ret = PyObject_IsTrue(res);
1129 Py_DECREF(res);
1130 return ret;
1131}
1132
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001134 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001135 0, /*sq_concat*/
1136 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001137 (intargfunc)instance_item, /*sq_item*/
1138 (intintargfunc)instance_slice, /*sq_slice*/
1139 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1140 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001141 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001142};
1143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 PyInstanceObject *self;
1147 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001150
1151 if ((func = instance_getattr(self, methodname)) == NULL)
1152 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 res = PyEval_CallObject(func, (PyObject *)NULL);
1154 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001155 return res;
1156}
1157
Guido van Rossum03093a21994-09-28 15:51:32 +00001158
1159/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1161 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001162
1163
1164/* Implement a binary operator involving at least one class instance. */
1165
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166PyObject *
1167PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1168 PyObject *v;
1169 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001170 char *opname;
1171 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001173{
1174 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001176 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001177 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001178 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001179 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001180 /* Sigh -- special case for comnparisons */
1181 if (strcmp(opname, "__cmp__") == 0) {
1182 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1183 return PyInt_FromLong(c);
1184 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001185 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001187 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001188}
1189
Guido van Rossum03093a21994-09-28 15:51:32 +00001190
1191/* Try one half of a binary operator involving a class instance.
1192 Return value:
1193 -1 if an exception is to be reported right away
1194 0 if we have a valid result
1195 1 if we could try another operation
1196*/
1197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001199
Guido van Rossum03093a21994-09-28 15:51:32 +00001200static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001201halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 PyObject *v;
1203 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 PyObject **r_result;
1206 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001207 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001208{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 PyObject *func;
1210 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001211 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyObject *coerced = NULL;
1213 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001216 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001217 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001218 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001219 if (coerce_obj == NULL)
1220 return -1;
1221 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001222 coercefunc = PyObject_GetAttr(v, coerce_obj);
1223 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001225 }
1226 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001228 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001229 return -1;
1230 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001231 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001233 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001234 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001235 return -1;
1236 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 if (coerced == Py_None) {
1238 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001239 return 1;
1240 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1242 Py_DECREF(coerced);
1243 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001244 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001245 return -1;
1246 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 v1 = PyTuple_GetItem(coerced, 0);
1248 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001249 if (v1 != v) {
1250 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001252 if (swapped)
1253 *r_result = (*thisfunc)(w, v);
1254 else
1255 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001257 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001258 }
1259 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001260 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001262 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001264 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001265 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001267 return 1;
1268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001270 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 Py_DECREF(func);
1272 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001273 return -1;
1274 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 *r_result = PyEval_CallObject(func, args);
1276 Py_DECREF(args);
1277 Py_DECREF(func);
1278 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001279 return *r_result == NULL ? -1 : 0;
1280}
1281
Guido van Rossum879c5811995-01-10 15:24:06 +00001282static int
1283instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 PyObject **pv;
1285 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001286{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyObject *v = *pv;
1288 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001289 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 PyObject *args;
1291 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001292
Guido van Rossum2878a691996-08-09 20:53:24 +00001293 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001294 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001295 if (coerce_obj == NULL)
1296 return -1;
1297 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001298 coercefunc = PyObject_GetAttr(v, coerce_obj);
1299 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001300 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 PyErr_Clear();
1302 Py_INCREF(v);
1303 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001304 return 0;
1305 }
1306 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001308 if (args == NULL) {
1309 return -1;
1310 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001311 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001313 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001314 if (coerced == NULL) {
1315 /* __coerce__ call raised an exception */
1316 return -1;
1317 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001319 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001321 return 1;
1322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001324 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 Py_DECREF(coerced);
1326 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001327 "coercion should return None or 2-tuple");
1328 return -1;
1329 }
1330 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 *pv = PyTuple_GetItem(coerced, 0);
1332 *pw = PyTuple_GetItem(coerced, 1);
1333 Py_INCREF(*pv);
1334 Py_INCREF(*pw);
1335 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001336 return 0;
1337}
1338
Guido van Rossum03093a21994-09-28 15:51:32 +00001339
Guido van Rossum04691fc1992-08-12 15:35:34 +00001340#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341static PyObject *funcname(self) PyInstanceObject *self; { \
1342 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001343 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001344 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001345}
1346
Guido van Rossum04691fc1992-08-12 15:35:34 +00001347UNARY(instance_neg, "__neg__")
1348UNARY(instance_pos, "__pos__")
1349UNARY(instance_abs, "__abs__")
1350
Guido van Rossum9bfef441993-03-29 10:43:31 +00001351static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001352instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001356 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001358
Guido van Rossum2878a691996-08-09 20:53:24 +00001359 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001360 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001361 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001363 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001364 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001365 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001367 /* Fall back to the default behavior:
1368 all instances are nonzero */
1369 return 1;
1370 }
1371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372 res = PyEval_CallObject(func, (PyObject *)NULL);
1373 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001374 if (res == NULL)
1375 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 if (!PyInt_Check(res)) {
1377 Py_DECREF(res);
1378 PyErr_SetString(PyExc_TypeError,
1379 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001380 return -1;
1381 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 outcome = PyInt_AsLong(res);
1383 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001384 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 PyErr_SetString(PyExc_ValueError,
1386 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001387 return -1;
1388 }
1389 return outcome > 0;
1390}
1391
1392UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001393UNARY(instance_int, "__int__")
1394UNARY(instance_long, "__long__")
1395UNARY(instance_float, "__float__")
1396UNARY(instance_oct, "__oct__")
1397UNARY(instance_hex, "__hex__")
1398
Guido van Rossum03093a21994-09-28 15:51:32 +00001399/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001401instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 PyObject *v;
1403 PyObject *w;
1404 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001405{
1406 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 PyObject *func;
1408 PyObject *args;
1409 PyObject *result;
1410 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001411
1412 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001413 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001415 if (func == NULL)
1416 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001418 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001420 return NULL;
1421 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 result = PyEval_CallObject(func, args);
1423 Py_DECREF(func);
1424 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001425 return result;
1426}
1427
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001429 0, /*nb_add*/
1430 0, /*nb_subtract*/
1431 0, /*nb_multiply*/
1432 0, /*nb_divide*/
1433 0, /*nb_remainder*/
1434 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001435 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001436 (unaryfunc)instance_neg, /*nb_negative*/
1437 (unaryfunc)instance_pos, /*nb_positive*/
1438 (unaryfunc)instance_abs, /*nb_absolute*/
1439 (inquiry)instance_nonzero, /*nb_nonzero*/
1440 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001441 0, /*nb_lshift*/
1442 0, /*nb_rshift*/
1443 0, /*nb_and*/
1444 0, /*nb_xor*/
1445 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001446 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001447 (unaryfunc)instance_int, /*nb_int*/
1448 (unaryfunc)instance_long, /*nb_long*/
1449 (unaryfunc)instance_float, /*nb_float*/
1450 (unaryfunc)instance_oct, /*nb_oct*/
1451 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001452};
1453
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454PyTypeObject PyInstance_Type = {
1455 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001456 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001457 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001460 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001461 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001462 0, /*tp_getattr*/
1463 0, /*tp_setattr*/
1464 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001465 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466 &instance_as_number, /*tp_as_number*/
1467 &instance_as_sequence, /*tp_as_sequence*/
1468 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001469 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001470 0, /*tp_call*/
1471 0, /*tp_str*/
1472 (getattrofunc)instance_getattr, /*tp_getattro*/
1473 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001474 0, /* tp_as_buffer */
1475 Py_TPFLAGS_DEFAULT, /*tp_flags */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001476};
1477
1478
Guido van Rossum81daa321993-05-20 14:24:46 +00001479/* Instance method objects are used for two purposes:
1480 (a) as bound instance methods (returned by instancename.methodname)
1481 (b) as unbound methods (returned by ClassName.methodname)
1482 In case (b), im_self is NULL
1483*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001484
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001485static PyMethodObject *free_list;
1486
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487PyObject *
1488PyMethod_New(func, self, class)
1489 PyObject *func;
1490 PyObject *self;
1491 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001492{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001494 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001496 return NULL;
1497 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001498 im = free_list;
1499 if (im != NULL) {
1500 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001501 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001502 }
1503 else {
1504 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1505 if (im == NULL)
1506 return NULL;
1507 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001509 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001511 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001513 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001515}
1516
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517PyObject *
1518PyMethod_Function(im)
1519 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 if (!PyMethod_Check(im)) {
1522 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001523 return NULL;
1524 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001526}
1527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528PyObject *
1529PyMethod_Self(im)
1530 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001531{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001532 if (!PyMethod_Check(im)) {
1533 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001534 return NULL;
1535 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001537}
1538
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539PyObject *
1540PyMethod_Class(im)
1541 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 if (!PyMethod_Check(im)) {
1544 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001545 return NULL;
1546 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001548}
1549
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001550/* Class method methods */
1551
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553
Guido van Rossume8122f11991-05-05 20:03:07 +00001554static struct memberlist instancemethod_memberlist[] = {
1555 {"im_func", T_OBJECT, OFF(im_func)},
1556 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001557 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001558 /* Dummies that are not handled by getattr() except for __members__ */
1559 {"__doc__", T_INT, 0},
1560 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001561 {NULL} /* Sentinel */
1562};
1563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001565instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 register PyMethodObject *im;
1567 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001570 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001571 /* Inherit __name__ and __doc__ from the callable object
1572 implementing the method */
1573 if (strcmp(sname, "__name__") == 0 ||
1574 strcmp(sname, "__doc__") == 0)
1575 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001576 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577 if (PyEval_GetRestricted()) {
1578 PyErr_SetString(PyExc_RuntimeError,
1579 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001580 return NULL;
1581 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583}
1584
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001585static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001586instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001588{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 Py_DECREF(im->im_func);
1590 Py_XDECREF(im->im_self);
1591 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001592 im->im_self = (PyObject *)free_list;
1593 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594}
1595
Guido van Rossumebc8c511992-09-03 20:39:51 +00001596static int
1597instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001599{
Guido van Rossume9df7271995-04-06 14:46:51 +00001600 if (a->im_self != b->im_self)
1601 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001603}
1604
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001606instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001608{
1609 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001611 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612 PyClassObject *class = (PyClassObject *)(a->im_class);
1613 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001614 char *fcname, *icname, *fname;
1615 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001616 if (PyFunction_Check(func)) {
1617 funcname = ((PyFunctionObject *)func)->func_name;
1618 Py_INCREF(funcname);
1619 }
1620 else {
1621 funcname = PyObject_GetAttrString(func,"__name__");
1622 if (funcname == NULL)
1623 PyErr_Clear();
1624 }
1625 if (funcname != NULL && PyString_Check(funcname))
1626 fname = PyString_AS_STRING(funcname);
1627 else
1628 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 if (fclassname != NULL && PyString_Check(fclassname))
1630 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001631 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001632 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001633 if (self == NULL)
1634 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1635 else {
1636 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 if (iclassname != NULL && PyString_Check(iclassname))
1638 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001639 else
1640 icname = "?";
1641 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1642 fcname, fname, icname, (long)self);
1643 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001644 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001646}
1647
Guido van Rossum9bfef441993-03-29 10:43:31 +00001648static long
1649instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001651{
1652 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001653 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001655 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001657 if (x == -1)
1658 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001660 if (y == -1)
1661 return -1;
1662 return x ^ y;
1663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665PyTypeObject PyMethod_Type = {
1666 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001667 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001668 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001670 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001671 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001672 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001673 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001674 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001675 (cmpfunc)instancemethod_compare, /*tp_compare*/
1676 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001677 0, /*tp_as_number*/
1678 0, /*tp_as_sequence*/
1679 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001680 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001681 0, /*tp_call*/
1682 0, /*tp_str*/
1683 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1684 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001685};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001686
1687/* Clear out the free list */
1688
1689void
1690PyMethod_Fini()
1691{
1692 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001693 PyMethodObject *im = free_list;
1694 free_list = (PyMethodObject *)(im->im_self);
1695 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001696 }
1697}