blob: f6fc5d8f31bc4ea7ef385c2aca56f1cbb9db0378 [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 *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000041
Guido van Rossuma63eff61998-05-29 21:37:21 +000042static PyObject *getattrstr, *setattrstr, *delattrstr;
43
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044PyObject *
45PyClass_New(bases, dict, name)
46 PyObject *bases; /* NULL or tuple of classobjects! */
47 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000048 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000051 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000052 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000053 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000054 if (docstr == NULL)
55 return NULL;
56 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000057 if (modstr == NULL) {
58 modstr= PyString_InternFromString("__module__");
59 if (modstr == NULL)
60 return NULL;
61 }
62 if (namestr == NULL) {
63 namestr= PyString_InternFromString("__name__");
64 if (namestr == NULL)
65 return NULL;
66 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000067 if (name == NULL || !PyString_Check(name)) {
68 PyErr_SetString(PyExc_SystemError,
69 "PyClass_New: name must be a string");
70 return NULL;
71 }
72 if (dict == NULL || !PyDict_Check(dict)) {
73 PyErr_SetString(PyExc_SystemError,
74 "PyClass_New: dict must be a dictionary");
75 return NULL;
76 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 if (PyDict_GetItem(dict, docstr) == NULL) {
78 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000079 return NULL;
80 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000081 if (PyDict_GetItem(dict, modstr) == NULL) {
82 PyObject *globals = PyEval_GetGlobals();
83 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000084 PyObject *modname = PyDict_GetItem(globals, namestr);
85 if (modname != NULL) {
86 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000087 return NULL;
88 }
89 }
90 }
Guido van Rossume2966a61991-12-10 13:53:23 +000091 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000093 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000094 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000095 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000096 else {
97 int i;
98 if (!PyTuple_Check(bases)) {
99 PyErr_SetString(PyExc_SystemError,
100 "PyClass_New: bases must be a tuple");
101 return NULL;
102 }
103 i = PyTuple_Size(bases);
104 while (--i >= 0) {
105 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
106 PyErr_SetString(PyExc_SystemError,
107 "PyClass_New: base must be a class");
108 return NULL;
109 }
110 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000114 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000117 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000120 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000122 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000123 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000124 getattrstr = PyString_InternFromString("__getattr__");
125 setattrstr = PyString_InternFromString("__setattr__");
126 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000127 }
128 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
129 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
130 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 Py_XINCREF(op->cl_getattr);
132 Py_XINCREF(op->cl_setattr);
133 Py_XINCREF(op->cl_delattr);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
137/* Class methods */
138
139static void
140class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 Py_DECREF(op->cl_bases);
144 Py_DECREF(op->cl_dict);
145 Py_XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 free((ANY *)op);
147}
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000150class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 PyClassObject *cp;
152 PyObject *name;
153 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000154{
155 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000157 if (value != NULL) {
158 *pclass = cp;
159 return value;
160 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000162 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000163 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 PyObject *v = class_lookup(
165 (PyClassObject *)
166 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000167 if (v != NULL)
168 return v;
169 }
170 return NULL;
171}
172
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 register PyClassObject *op;
176 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 register PyObject *v;
179 register char *sname = PyString_AsString(name);
180 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000181 if (sname[0] == '_' && sname[1] == '_') {
182 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyEval_GetRestricted()) {
184 PyErr_SetString(PyExc_RuntimeError,
185 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return NULL;
187 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000189 return op->cl_dict;
190 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000191 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000193 return op->cl_bases;
194 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000195 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000196 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000198 else
199 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000201 return v;
202 }
Guido van Rossum94308391991-10-20 20:11:48 +0000203 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000204 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000205 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000207 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000209 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (PyFunction_Check(v)) {
211 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
212 (PyObject *)class);
213 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000214 v = w;
215 }
216 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217}
218
Guido van Rossuma63eff61998-05-29 21:37:21 +0000219static void
220set_slot(slot, v)
221 PyObject **slot;
222 PyObject *v;
223{
224 PyObject *temp = *slot;
225 Py_XINCREF(v);
226 *slot = v;
227 Py_XDECREF(temp);
228}
229
230static char *
231set_dict(c, v)
232 PyClassObject *c;
233 PyObject *v;
234{
235 PyClassObject *dummy;
236
237 if (v == NULL || !PyDict_Check(v))
238 return "__dict__ must be a dictionary object";
239 set_slot(&c->cl_dict, v);
240
241 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
242 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
243 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
244
245 return "";
246}
247
248static char *
249set_bases(c, v)
250 PyClassObject *c;
251 PyObject *v;
252{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000253 int i, n;
254
255 if (v == NULL || !PyTuple_Check(v))
256 return "__bases__ must be a tuple object";
257 n = PyTuple_Size(v);
258 for (i = 0; i < n; i++) {
259 PyObject *x = PyTuple_GET_ITEM(v, i);
260 if (!PyClass_Check(x))
261 return "__bases__ items must be classes";
262 if (PyClass_IsSubclass(x, (PyObject *)c))
263 return "a __bases__ item causes an inheritance cycle";
264 }
265 set_slot(&c->cl_bases, v);
266 return "";
267}
268
269static char *
270set_name(c, v)
271 PyClassObject *c;
272 PyObject *v;
273{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000274 if (v == NULL || !PyString_Check(v))
275 return "__name__ must be a string object";
Guido van Rossume0fdf6f1998-06-12 15:03:58 +0000276 if ((long)strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000277 return "__name__ must not contain null bytes";
278 set_slot(&c->cl_name, v);
279 return "";
280}
281
Guido van Rossum94308391991-10-20 20:11:48 +0000282static int
283class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyClassObject *op;
285 PyObject *name;
286 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000287{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000288 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 if (PyEval_GetRestricted()) {
290 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000291 "classes are read-only in restricted mode");
292 return -1;
293 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000294 sname = PyString_AsString(name);
295 if (sname[0] == '_' && sname[1] == '_') {
296 int n = PyString_Size(name);
297 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000298 char *err = NULL;
299 if (strcmp(sname, "__dict__") == 0)
300 err = set_dict(op, v);
301 else if (strcmp(sname, "__bases__") == 0)
302 err = set_bases(op, v);
303 else if (strcmp(sname, "__name__") == 0)
304 err = set_name(op, v);
305 else if (strcmp(sname, "__getattr__") == 0)
306 set_slot(&op->cl_getattr, v);
307 else if (strcmp(sname, "__setattr__") == 0)
308 set_slot(&op->cl_setattr, v);
309 else if (strcmp(sname, "__delattr__") == 0)
310 set_slot(&op->cl_delattr, v);
311 /* For the last three, we fall through to update the
312 dictionary as well. */
313 if (err != NULL) {
314 if (*err == '\0')
315 return 0;
316 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000317 return -1;
318 }
319 }
320 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000321 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000323 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000325 "delete non-existing class attribute");
326 return rv;
327 }
Guido van Rossum94308391991-10-20 20:11:48 +0000328 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000333class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000335{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000336 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000337 char buf[140];
338 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000340 name = "?";
341 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000343 if (mod == NULL || !PyString_Check(mod))
344 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
345 else
346 sprintf(buf, "<class %.50s.%.50s at %lx>",
347 PyString_AsString(mod),
348 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000350}
351
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000352static PyObject *
353class_str(op)
354 PyClassObject *op;
355{
356 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
357 PyObject *name = op->cl_name;
358 PyObject *res;
359 int m, n;
360
361 if (name == NULL || !PyString_Check(name))
362 return class_repr(op);
363 if (mod == NULL || !PyString_Check(mod)) {
364 Py_INCREF(name);
365 return name;
366 }
367 m = PyString_Size(mod);
368 n = PyString_Size(name);
369 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
370 if (res != NULL) {
371 char *s = PyString_AsString(res);
372 memcpy(s, PyString_AsString(mod), m);
373 s += m;
374 *s++ = '.';
375 memcpy(s, PyString_AsString(name), n);
376 }
377 return res;
378}
379
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380PyTypeObject PyClass_Type = {
381 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382 0,
383 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000386 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000388 0, /*tp_getattr*/
389 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000391 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 0, /*tp_as_number*/
393 0, /*tp_as_sequence*/
394 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000395 0, /*tp_hash*/
396 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000397 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000398 (getattrofunc)class_getattr, /*tp_getattro*/
399 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400};
401
Guido van Rossum81daa321993-05-20 14:24:46 +0000402int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403PyClass_IsSubclass(class, base)
404 PyObject *class;
405 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000406{
407 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000409 if (class == base)
410 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000412 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 cp = (PyClassObject *)class;
414 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000415 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000417 return 1;
418 }
419 return 0;
420}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421
Guido van Rossum81daa321993-05-20 14:24:46 +0000422
423/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425PyObject *
426PyInstance_New(class, arg, kw)
427 PyObject *class;
428 PyObject *arg;
429 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 register PyInstanceObject *inst;
432 PyObject *init;
433 static PyObject *initstr;
434 if (!PyClass_Check(class)) {
435 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 return NULL;
437 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000439 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 Py_INCREF(class);
442 inst->in_class = (PyClassObject *)class;
443 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000444 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 return NULL;
447 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000448 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000449 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000450 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000451 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyErr_Clear();
453 if ((arg != NULL && (!PyTuple_Check(arg) ||
454 PyTuple_Size(arg) != 0))
455 || (kw != NULL && (!PyDict_Check(kw) ||
456 PyDict_Size(kw) != 0))) {
457 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000458 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000460 inst = NULL;
461 }
462 }
463 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
465 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000466 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000468 inst = NULL;
469 }
470 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 if (res != Py_None) {
472 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000473 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000475 inst = NULL;
476 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000478 }
479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481}
482
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000483/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484
485static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000486instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyObject *error_type, *error_value, *error_traceback;
490 PyObject *del;
491 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000492 /* Call the __del__ method if it exists. First temporarily
493 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000494#ifdef Py_TRACE_REFS
495 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 extern long _Py_RefTotal;
497 inst->ob_type = &PyInstance_Type;
498 _Py_NewReference(inst);
499 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000500#ifdef COUNT_ALLOCS
501 inst->ob_type->tp_alloc--; /* ditto */
502#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000503#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000505#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000507 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000508 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000509 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000511 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 PyObject *f, *t, *v, *tb;
513 PyErr_Fetch(&t, &v, &tb);
514 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000515 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000517 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyFile_WriteObject(t, f, Py_PRINT_RAW);
519 if (v && v != Py_None) {
520 PyFile_WriteString(": ", f);
521 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000522 }
523 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyFile_WriteString(" in ", f);
525 PyFile_WriteObject(del, f, 0);
526 PyFile_WriteString(" ignored\n", f);
527 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000528 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000529 Py_XDECREF(t);
530 Py_XDECREF(v);
531 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000532 }
533 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 Py_DECREF(res);
535 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000536 }
537 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000539 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000540 if (--inst->ob_refcnt > 0) {
541#ifdef COUNT_ALLOCS
542 inst->ob_type->tp_free--;
543#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000544 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000545 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000546#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000547#ifdef COUNT_ALLOCS
548 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
549#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000551 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000552#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 Py_DECREF(inst->in_class);
554 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000555 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556}
557
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000559instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 register PyInstanceObject *inst;
561 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 register PyObject *v;
564 register char *sname = PyString_AsString(name);
565 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000566 if (sname[0] == '_' && sname[1] == '_') {
567 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 if (PyEval_GetRestricted()) {
569 PyErr_SetString(PyExc_RuntimeError,
570 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000571 return NULL;
572 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000574 return inst->in_dict;
575 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000576 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 Py_INCREF(inst->in_class);
578 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000579 }
Guido van Rossum94308391991-10-20 20:11:48 +0000580 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000581 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000583 if (v == NULL) {
584 v = class_lookup(inst->in_class, name, &class);
585 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000587 return NULL;
588 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000590 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000591 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 if (PyFunction_Check(v)) {
593 PyObject *w = PyMethod_New(v, (PyObject *)inst,
594 (PyObject *)class);
595 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000596 v = w;
597 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 else if (PyMethod_Check(v)) {
599 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000600 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
602 PyObject *im_func = PyMethod_Function(v);
603 PyObject *w = PyMethod_New(im_func,
604 (PyObject *)inst, im_class);
605 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000606 v = w;
607 }
608 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000609 }
610 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611}
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000614instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 register PyInstanceObject *inst;
616 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000617{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000619 res = instance_getattr1(inst, name);
620 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 PyObject *args;
622 PyErr_Clear();
623 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000624 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000625 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 res = PyEval_CallObject(func, args);
627 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000628 }
629 return res;
630}
631
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000632static int
Guido van Rossume7737541994-09-05 07:31:41 +0000633instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 PyInstanceObject *inst;
635 PyObject *name;
636 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637{
Guido van Rossum94472a01992-09-04 09:45:18 +0000638 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000640 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000642 "delete non-existing instance attribute");
643 return rv;
644 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000645 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647}
648
Guido van Rossume7737541994-09-05 07:31:41 +0000649static int
650instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 PyInstanceObject *inst;
652 PyObject *name;
653 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000654{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000655 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000657 if (sname[0] == '_' && sname[1] == '_') {
658 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000659 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000660 if (strcmp(sname, "__dict__") == 0) {
661 if (PyEval_GetRestricted()) {
662 PyErr_SetString(PyExc_RuntimeError,
663 "__dict__ not accessible in restricted mode");
664 return -1;
665 }
666 if (v == NULL || !PyDict_Check(v)) {
667 PyErr_SetString(PyExc_TypeError,
668 "__dict__ must be set to a dictionary");
669 return -1;
670 }
671 tmp = inst->in_dict;
672 Py_INCREF(v);
673 inst->in_dict = v;
674 Py_DECREF(tmp);
675 return 0;
676 }
677 if (strcmp(sname, "__class__") == 0) {
678 if (PyEval_GetRestricted()) {
679 PyErr_SetString(PyExc_RuntimeError,
680 "__class__ not accessible in restricted mode");
681 return -1;
682 }
683 if (v == NULL || !PyClass_Check(v)) {
684 PyErr_SetString(PyExc_TypeError,
685 "__class__ must be set to a class");
686 return -1;
687 }
688 tmp = (PyObject *)(inst->in_class);
689 Py_INCREF(v);
690 inst->in_class = (PyClassObject *)v;
691 Py_DECREF(tmp);
692 return 0;
693 }
Guido van Rossume7737541994-09-05 07:31:41 +0000694 }
Guido van Rossume7737541994-09-05 07:31:41 +0000695 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000696 if (v == NULL)
697 func = inst->in_class->cl_delattr;
698 else
699 func = inst->in_class->cl_setattr;
700 if (func == NULL)
701 return instance_setattr1(inst, name, v);
702 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000704 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000706 if (args == NULL)
707 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 res = PyEval_CallObject(func, args);
709 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000710 if (res == NULL)
711 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000713 return 0;
714}
715
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000717instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000719{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 PyObject *func;
721 PyObject *res;
722 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723
Guido van Rossum2878a691996-08-09 20:53:24 +0000724 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000725 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000726 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000727 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000728 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000730 PyObject *mod = PyDict_GetItemString(
731 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000732 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 if (classname != NULL && PyString_Check(classname))
734 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000735 else
736 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000738 if (mod == NULL || !PyString_Check(mod))
739 sprintf(buf, "<?.%.100s instance at %lx>",
740 cname, (long)inst);
741 else
742 sprintf(buf, "<%.50s.%.50s instance at %lx>",
743 PyString_AsString(mod),
744 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000746 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 res = PyEval_CallObject(func, (PyObject *)NULL);
748 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000749 return res;
750}
751
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000753instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000755{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000757 instance_compare1);
758}
759
Guido van Rossum9bfef441993-03-29 10:43:31 +0000760static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000761instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000763{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000765 long outcome;
766 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000767 if (result == NULL)
768 return -1;
769 if (!PyInt_Check(result)) {
770 Py_DECREF(result);
771 PyErr_SetString(PyExc_TypeError,
772 "comparison did not return an int");
773 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000774 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 outcome = PyInt_AsLong(result);
776 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000777 if (outcome < 0)
778 return -1;
779 else if (outcome > 0)
780 return 1;
781 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782}
783
Guido van Rossum9bfef441993-03-29 10:43:31 +0000784static long
785instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000787{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 PyObject *func;
789 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000790 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000792
Guido van Rossum2878a691996-08-09 20:53:24 +0000793 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000794 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000795 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000796 if (func == NULL) {
797 /* If there is no __cmp__ method, we hash on the address.
798 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000800 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000801 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000802 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000803 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000805 outcome = (long)inst;
806 if (outcome == -1)
807 outcome = -2;
808 return outcome;
809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000811 return -1;
812 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 res = PyEval_CallObject(func, (PyObject *)NULL);
814 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000815 if (res == NULL)
816 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 if (PyInt_Check(res)) {
818 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000819 if (outcome == -1)
820 outcome = -2;
821 }
822 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyErr_SetString(PyExc_TypeError,
824 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000825 outcome = -1;
826 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 return outcome;
829}
830
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000832
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000834instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000836{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyObject *func;
838 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839 int outcome;
840
Guido van Rossum2878a691996-08-09 20:53:24 +0000841 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000842 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000843 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000844 if (func == NULL)
845 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 res = PyEval_CallObject(func, (PyObject *)NULL);
847 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000848 if (res == NULL)
849 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 if (PyInt_Check(res)) {
851 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000852 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 PyErr_SetString(PyExc_ValueError,
854 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000855 }
856 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 PyErr_SetString(PyExc_TypeError,
858 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000859 outcome = -1;
860 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000862 return outcome;
863}
864
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000866instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 PyInstanceObject *inst;
868 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000869{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 PyObject *func;
871 PyObject *arg;
872 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000873
Guido van Rossum2878a691996-08-09 20:53:24 +0000874 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000875 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000876 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000877 if (func == NULL)
878 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882 return NULL;
883 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 res = PyEval_CallObject(func, arg);
885 Py_DECREF(func);
886 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887 return res;
888}
889
Guido van Rossum9bfef441993-03-29 10:43:31 +0000890static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892 PyInstanceObject*inst;
893 PyObject *key;
894 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000895{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 PyObject *func;
897 PyObject *arg;
898 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899
Guido van Rossum2878a691996-08-09 20:53:24 +0000900 if (value == NULL) {
901 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000902 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000903 func = instance_getattr(inst, delitemstr);
904 }
905 else {
906 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000907 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000908 func = instance_getattr(inst, setitemstr);
909 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910 if (func == NULL)
911 return -1;
912 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000916 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000918 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 res = PyEval_CallObject(func, arg);
921 Py_DECREF(func);
922 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923 if (res == NULL)
924 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 return 0;
927}
928
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930 (inquiry)instance_length, /*mp_length*/
931 (binaryfunc)instance_subscript, /*mp_subscript*/
932 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000933};
934
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000936instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 int i;
939{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000941
Guido van Rossum2878a691996-08-09 20:53:24 +0000942 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000943 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000944 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945 if (func == NULL)
946 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950 return NULL;
951 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 res = PyEval_CallObject(func, arg);
953 Py_DECREF(func);
954 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000955 return res;
956}
957
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 int i, j;
962{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyObject *func, *arg, *res;
964 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000965
Guido van Rossum2878a691996-08-09 20:53:24 +0000966 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000967 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000968 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000969 if (func == NULL)
970 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000972 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000974 return NULL;
975 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 res = PyEval_CallObject(func, arg);
977 Py_DECREF(func);
978 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979 return res;
980}
981
982static int
983instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000987{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000989
Guido van Rossum2878a691996-08-09 20:53:24 +0000990 if (item == NULL) {
991 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000992 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000993 func = instance_getattr(inst, delitemstr);
994 }
995 else {
996 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000997 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000998 func = instance_getattr(inst, setitemstr);
999 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001001 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001008 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 res = PyEval_CallObject(func, arg);
1011 Py_DECREF(func);
1012 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 if (res == NULL)
1014 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016 return 0;
1017}
1018
1019static int
1020instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyObject *func, *arg, *res;
1026 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001027
Guido van Rossum2878a691996-08-09 20:53:24 +00001028 if (value == NULL) {
1029 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 delslicestr =
1031 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001032 func = instance_getattr(inst, delslicestr);
1033 }
1034 else {
1035 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 setslicestr =
1037 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001038 func = instance_getattr(inst, setslicestr);
1039 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001040 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001041 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001042 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001048 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 res = PyEval_CallObject(func, arg);
1051 Py_DECREF(func);
1052 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 if (res == NULL)
1054 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 return 0;
1057}
1058
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001060 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001061 0, /*sq_concat*/
1062 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063 (intargfunc)instance_item, /*sq_item*/
1064 (intintargfunc)instance_slice, /*sq_slice*/
1065 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1066 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001067};
1068
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 PyInstanceObject *self;
1072 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075
1076 if ((func = instance_getattr(self, methodname)) == NULL)
1077 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 res = PyEval_CallObject(func, (PyObject *)NULL);
1079 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080 return res;
1081}
1082
Guido van Rossum03093a21994-09-28 15:51:32 +00001083
1084/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1086 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001087
1088
1089/* Implement a binary operator involving at least one class instance. */
1090
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091PyObject *
1092PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1093 PyObject *v;
1094 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001095 char *opname;
1096 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001098{
1099 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001101 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001102 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001103 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001104 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001105 /* Sigh -- special case for comnparisons */
1106 if (strcmp(opname, "__cmp__") == 0) {
1107 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1108 return PyInt_FromLong(c);
1109 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001110 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001112 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113}
1114
Guido van Rossum03093a21994-09-28 15:51:32 +00001115
1116/* Try one half of a binary operator involving a class instance.
1117 Return value:
1118 -1 if an exception is to be reported right away
1119 0 if we have a valid result
1120 1 if we could try another operation
1121*/
1122
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001124
Guido van Rossum03093a21994-09-28 15:51:32 +00001125static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001126halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 PyObject *v;
1128 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001129 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 PyObject **r_result;
1131 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001132 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001133{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 PyObject *func;
1135 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001136 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 PyObject *coerced = NULL;
1138 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001139
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001141 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001142 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001143 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001144 if (coerce_obj == NULL)
1145 return -1;
1146 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001147 coercefunc = PyObject_GetAttr(v, coerce_obj);
1148 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001150 }
1151 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001153 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001154 return -1;
1155 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001156 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001158 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001159 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001160 return -1;
1161 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 if (coerced == Py_None) {
1163 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001164 return 1;
1165 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1167 Py_DECREF(coerced);
1168 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001169 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001170 return -1;
1171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 v1 = PyTuple_GetItem(coerced, 0);
1173 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001174 if (v1 != v) {
1175 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001177 if (swapped)
1178 *r_result = (*thisfunc)(w, v);
1179 else
1180 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001182 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001183 }
1184 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001185 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001187 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001189 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001190 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001192 return 1;
1193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001195 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 Py_DECREF(func);
1197 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001198 return -1;
1199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 *r_result = PyEval_CallObject(func, args);
1201 Py_DECREF(args);
1202 Py_DECREF(func);
1203 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 return *r_result == NULL ? -1 : 0;
1205}
1206
Guido van Rossum879c5811995-01-10 15:24:06 +00001207static int
1208instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 PyObject **pv;
1210 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001211{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyObject *v = *pv;
1213 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001214 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyObject *args;
1216 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001217
Guido van Rossum2878a691996-08-09 20:53:24 +00001218 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001219 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001220 if (coerce_obj == NULL)
1221 return -1;
1222 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001223 coercefunc = PyObject_GetAttr(v, coerce_obj);
1224 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001225 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 PyErr_Clear();
1227 Py_INCREF(v);
1228 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001229 return 0;
1230 }
1231 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001233 if (args == NULL) {
1234 return -1;
1235 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001236 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001238 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001239 if (coerced == NULL) {
1240 /* __coerce__ call raised an exception */
1241 return -1;
1242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001244 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001246 return 1;
1247 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001249 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 Py_DECREF(coerced);
1251 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001252 "coercion should return None or 2-tuple");
1253 return -1;
1254 }
1255 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 *pv = PyTuple_GetItem(coerced, 0);
1257 *pw = PyTuple_GetItem(coerced, 1);
1258 Py_INCREF(*pv);
1259 Py_INCREF(*pw);
1260 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001261 return 0;
1262}
1263
Guido van Rossum03093a21994-09-28 15:51:32 +00001264
Guido van Rossum04691fc1992-08-12 15:35:34 +00001265#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266static PyObject *funcname(self) PyInstanceObject *self; { \
1267 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001268 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001269 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001270}
1271
Guido van Rossum04691fc1992-08-12 15:35:34 +00001272UNARY(instance_neg, "__neg__")
1273UNARY(instance_pos, "__pos__")
1274UNARY(instance_abs, "__abs__")
1275
Guido van Rossum9bfef441993-03-29 10:43:31 +00001276static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001277instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001279{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001281 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001283
Guido van Rossum2878a691996-08-09 20:53:24 +00001284 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001285 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001286 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001288 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001289 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001290 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001292 /* Fall back to the default behavior:
1293 all instances are nonzero */
1294 return 1;
1295 }
1296 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 res = PyEval_CallObject(func, (PyObject *)NULL);
1298 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001299 if (res == NULL)
1300 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 if (!PyInt_Check(res)) {
1302 Py_DECREF(res);
1303 PyErr_SetString(PyExc_TypeError,
1304 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001305 return -1;
1306 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 outcome = PyInt_AsLong(res);
1308 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001309 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 PyErr_SetString(PyExc_ValueError,
1311 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001312 return -1;
1313 }
1314 return outcome > 0;
1315}
1316
1317UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001318UNARY(instance_int, "__int__")
1319UNARY(instance_long, "__long__")
1320UNARY(instance_float, "__float__")
1321UNARY(instance_oct, "__oct__")
1322UNARY(instance_hex, "__hex__")
1323
Guido van Rossum03093a21994-09-28 15:51:32 +00001324/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001326instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 PyObject *v;
1328 PyObject *w;
1329 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001330{
1331 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 PyObject *func;
1333 PyObject *args;
1334 PyObject *result;
1335 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001336
1337 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001338 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001340 if (func == NULL)
1341 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001343 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001345 return NULL;
1346 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 result = PyEval_CallObject(func, args);
1348 Py_DECREF(func);
1349 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001350 return result;
1351}
1352
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001354 0, /*nb_add*/
1355 0, /*nb_subtract*/
1356 0, /*nb_multiply*/
1357 0, /*nb_divide*/
1358 0, /*nb_remainder*/
1359 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001360 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001361 (unaryfunc)instance_neg, /*nb_negative*/
1362 (unaryfunc)instance_pos, /*nb_positive*/
1363 (unaryfunc)instance_abs, /*nb_absolute*/
1364 (inquiry)instance_nonzero, /*nb_nonzero*/
1365 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001366 0, /*nb_lshift*/
1367 0, /*nb_rshift*/
1368 0, /*nb_and*/
1369 0, /*nb_xor*/
1370 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001371 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001372 (unaryfunc)instance_int, /*nb_int*/
1373 (unaryfunc)instance_long, /*nb_long*/
1374 (unaryfunc)instance_float, /*nb_float*/
1375 (unaryfunc)instance_oct, /*nb_oct*/
1376 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001377};
1378
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379PyTypeObject PyInstance_Type = {
1380 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001381 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001382 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001384 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001385 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001386 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001387 0, /*tp_getattr*/
1388 0, /*tp_setattr*/
1389 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001390 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001391 &instance_as_number, /*tp_as_number*/
1392 &instance_as_sequence, /*tp_as_sequence*/
1393 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001394 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001395 0, /*tp_call*/
1396 0, /*tp_str*/
1397 (getattrofunc)instance_getattr, /*tp_getattro*/
1398 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001399};
1400
1401
Guido van Rossum81daa321993-05-20 14:24:46 +00001402/* Instance method objects are used for two purposes:
1403 (a) as bound instance methods (returned by instancename.methodname)
1404 (b) as unbound methods (returned by ClassName.methodname)
1405 In case (b), im_self is NULL
1406*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001407
1408typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyObject_HEAD
1410 PyObject *im_func; /* The function implementing the method */
1411 PyObject *im_self; /* The instance it is bound to, or NULL */
1412 PyObject *im_class; /* The class that defined the method */
1413} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001414
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001415
1416static PyMethodObject *free_list;
1417
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418PyObject *
1419PyMethod_New(func, self, class)
1420 PyObject *func;
1421 PyObject *self;
1422 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001423{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 register PyMethodObject *im;
1425 if (!PyFunction_Check(func)) {
1426 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001427 return NULL;
1428 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001429 im = free_list;
1430 if (im != NULL) {
1431 free_list = (PyMethodObject *)(im->im_self);
1432 im->ob_type = &PyMethod_Type;
1433 _Py_NewReference(im);
1434 }
1435 else {
1436 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1437 if (im == NULL)
1438 return NULL;
1439 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001441 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001443 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001445 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001447}
1448
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449PyObject *
1450PyMethod_Function(im)
1451 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001452{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 if (!PyMethod_Check(im)) {
1454 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001455 return NULL;
1456 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001458}
1459
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460PyObject *
1461PyMethod_Self(im)
1462 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001463{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 if (!PyMethod_Check(im)) {
1465 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001466 return NULL;
1467 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001469}
1470
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471PyObject *
1472PyMethod_Class(im)
1473 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001474{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 if (!PyMethod_Check(im)) {
1476 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001477 return NULL;
1478 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001480}
1481
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001482/* Class method methods */
1483
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001485
Guido van Rossume8122f11991-05-05 20:03:07 +00001486static struct memberlist instancemethod_memberlist[] = {
1487 {"im_func", T_OBJECT, OFF(im_func)},
1488 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001489 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001490 /* Dummies that are not handled by getattr() except for __members__ */
1491 {"__doc__", T_INT, 0},
1492 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 {NULL} /* Sentinel */
1494};
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001497instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 register PyMethodObject *im;
1499 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001500{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001502 if (sname[0] == '_') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001503 PyFunctionObject *func = (PyFunctionObject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001504 if (strcmp(sname, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 Py_INCREF(func->func_name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001506 return func->func_name;
1507 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001508 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 Py_INCREF(func->func_doc);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001510 return func->func_doc;
1511 }
1512 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 if (PyEval_GetRestricted()) {
1514 PyErr_SetString(PyExc_RuntimeError,
1515 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001516 return NULL;
1517 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001519}
1520
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001521static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001522instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001524{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 Py_DECREF(im->im_func);
1526 Py_XDECREF(im->im_self);
1527 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001528 im->im_self = (PyObject *)free_list;
1529 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001530}
1531
Guido van Rossumebc8c511992-09-03 20:39:51 +00001532static int
1533instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001534 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001535{
Guido van Rossume9df7271995-04-06 14:46:51 +00001536 if (a->im_self != b->im_self)
1537 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001538 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001539}
1540
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001542instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001544{
1545 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
1547 PyFunctionObject *func = (PyFunctionObject *)(a->im_func);
1548 PyClassObject *class = (PyClassObject *)(a->im_class);
1549 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001550 char *fcname, *icname, *fname;
1551 fclassname = class->cl_name;
1552 funcname = func->func_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 if (fclassname != NULL && PyString_Check(fclassname))
1554 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001555 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001556 fcname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 if (funcname != NULL && PyString_Check(funcname))
1558 fname = PyString_AsString(funcname);
Guido van Rossum25831651993-05-19 14:50:45 +00001559 else
1560 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001561 if (self == NULL)
1562 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1563 else {
1564 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 if (iclassname != NULL && PyString_Check(iclassname))
1566 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001567 else
1568 icname = "?";
1569 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1570 fcname, fname, icname, (long)self);
1571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001573}
1574
Guido van Rossum9bfef441993-03-29 10:43:31 +00001575static long
1576instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001578{
1579 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001580 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001582 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001584 if (x == -1)
1585 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001587 if (y == -1)
1588 return -1;
1589 return x ^ y;
1590}
1591
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592PyTypeObject PyMethod_Type = {
1593 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001594 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001595 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001598 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001599 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001600 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001601 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001602 (cmpfunc)instancemethod_compare, /*tp_compare*/
1603 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001604 0, /*tp_as_number*/
1605 0, /*tp_as_sequence*/
1606 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001607 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001608 0, /*tp_call*/
1609 0, /*tp_str*/
1610 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1611 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001612};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001613
1614/* Clear out the free list */
1615
1616void
1617PyMethod_Fini()
1618{
1619 while (free_list) {
1620 PyMethodObject *v = free_list;
1621 free_list = (PyMethodObject *)(v->im_self);
1622 PyMem_DEL(v);
1623 }
1624}