blob: 86fc1d399a7f4f72f65ab159b4aa8e0b7359b719 [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
Guido van Rossum7ba30431998-07-08 13:34:48 +0000230static void
231set_attr_slots(c)
232 PyClassObject *c;
233{
234 PyClassObject *dummy;
235
236 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
237 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
238 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
239}
240
Guido van Rossuma63eff61998-05-29 21:37:21 +0000241static char *
242set_dict(c, v)
243 PyClassObject *c;
244 PyObject *v;
245{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000246 if (v == NULL || !PyDict_Check(v))
247 return "__dict__ must be a dictionary object";
248 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000249 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000250 return "";
251}
252
253static char *
254set_bases(c, v)
255 PyClassObject *c;
256 PyObject *v;
257{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000258 int i, n;
259
260 if (v == NULL || !PyTuple_Check(v))
261 return "__bases__ must be a tuple object";
262 n = PyTuple_Size(v);
263 for (i = 0; i < n; i++) {
264 PyObject *x = PyTuple_GET_ITEM(v, i);
265 if (!PyClass_Check(x))
266 return "__bases__ items must be classes";
267 if (PyClass_IsSubclass(x, (PyObject *)c))
268 return "a __bases__ item causes an inheritance cycle";
269 }
270 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000271 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000272 return "";
273}
274
275static char *
276set_name(c, v)
277 PyClassObject *c;
278 PyObject *v;
279{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000280 if (v == NULL || !PyString_Check(v))
281 return "__name__ must be a string object";
Guido van Rossume0fdf6f1998-06-12 15:03:58 +0000282 if ((long)strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000283 return "__name__ must not contain null bytes";
284 set_slot(&c->cl_name, v);
285 return "";
286}
287
Guido van Rossum94308391991-10-20 20:11:48 +0000288static int
289class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyClassObject *op;
291 PyObject *name;
292 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000293{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000294 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 if (PyEval_GetRestricted()) {
296 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000297 "classes are read-only in restricted mode");
298 return -1;
299 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000300 sname = PyString_AsString(name);
301 if (sname[0] == '_' && sname[1] == '_') {
302 int n = PyString_Size(name);
303 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000304 char *err = NULL;
305 if (strcmp(sname, "__dict__") == 0)
306 err = set_dict(op, v);
307 else if (strcmp(sname, "__bases__") == 0)
308 err = set_bases(op, v);
309 else if (strcmp(sname, "__name__") == 0)
310 err = set_name(op, v);
311 else if (strcmp(sname, "__getattr__") == 0)
312 set_slot(&op->cl_getattr, v);
313 else if (strcmp(sname, "__setattr__") == 0)
314 set_slot(&op->cl_setattr, v);
315 else if (strcmp(sname, "__delattr__") == 0)
316 set_slot(&op->cl_delattr, v);
317 /* For the last three, we fall through to update the
318 dictionary as well. */
319 if (err != NULL) {
320 if (*err == '\0')
321 return 0;
322 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000323 return -1;
324 }
325 }
326 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000327 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000329 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000331 "delete non-existing class attribute");
332 return rv;
333 }
Guido van Rossum94308391991-10-20 20:11:48 +0000334 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000336}
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000339class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000341{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000342 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000343 char buf[140];
344 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000346 name = "?";
347 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000349 if (mod == NULL || !PyString_Check(mod))
350 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
351 else
352 sprintf(buf, "<class %.50s.%.50s at %lx>",
353 PyString_AsString(mod),
354 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000356}
357
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000358static PyObject *
359class_str(op)
360 PyClassObject *op;
361{
362 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
363 PyObject *name = op->cl_name;
364 PyObject *res;
365 int m, n;
366
367 if (name == NULL || !PyString_Check(name))
368 return class_repr(op);
369 if (mod == NULL || !PyString_Check(mod)) {
370 Py_INCREF(name);
371 return name;
372 }
373 m = PyString_Size(mod);
374 n = PyString_Size(name);
375 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
376 if (res != NULL) {
377 char *s = PyString_AsString(res);
378 memcpy(s, PyString_AsString(mod), m);
379 s += m;
380 *s++ = '.';
381 memcpy(s, PyString_AsString(name), n);
382 }
383 return res;
384}
385
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386PyTypeObject PyClass_Type = {
387 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 0,
389 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000392 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000394 0, /*tp_getattr*/
395 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 0, /*tp_as_number*/
399 0, /*tp_as_sequence*/
400 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 0, /*tp_hash*/
402 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000403 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000404 (getattrofunc)class_getattr, /*tp_getattro*/
405 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406};
407
Guido van Rossum81daa321993-05-20 14:24:46 +0000408int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409PyClass_IsSubclass(class, base)
410 PyObject *class;
411 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000412{
413 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000415 if (class == base)
416 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000418 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 cp = (PyClassObject *)class;
420 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000421 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000423 return 1;
424 }
425 return 0;
426}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427
Guido van Rossum81daa321993-05-20 14:24:46 +0000428
429/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431PyObject *
432PyInstance_New(class, arg, kw)
433 PyObject *class;
434 PyObject *arg;
435 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 register PyInstanceObject *inst;
438 PyObject *init;
439 static PyObject *initstr;
440 if (!PyClass_Check(class)) {
441 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 return NULL;
443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000445 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 Py_INCREF(class);
448 inst->in_class = (PyClassObject *)class;
449 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000450 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 return NULL;
453 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000454 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000455 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000456 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000457 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyErr_Clear();
459 if ((arg != NULL && (!PyTuple_Check(arg) ||
460 PyTuple_Size(arg) != 0))
461 || (kw != NULL && (!PyDict_Check(kw) ||
462 PyDict_Size(kw) != 0))) {
463 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000464 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000466 inst = NULL;
467 }
468 }
469 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
471 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000472 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000474 inst = NULL;
475 }
476 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 if (res != Py_None) {
478 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000479 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000481 inst = NULL;
482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000484 }
485 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487}
488
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000489/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490
491static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000492instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 PyObject *error_type, *error_value, *error_traceback;
496 PyObject *del;
497 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000498 /* Call the __del__ method if it exists. First temporarily
499 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000500#ifdef Py_TRACE_REFS
501 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 extern long _Py_RefTotal;
503 inst->ob_type = &PyInstance_Type;
504 _Py_NewReference(inst);
505 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000506#ifdef COUNT_ALLOCS
507 inst->ob_type->tp_alloc--; /* ditto */
508#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000509#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000511#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000513 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000514 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000515 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000517 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyObject *f, *t, *v, *tb;
519 PyErr_Fetch(&t, &v, &tb);
520 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000521 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000523 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyFile_WriteObject(t, f, Py_PRINT_RAW);
525 if (v && v != Py_None) {
526 PyFile_WriteString(": ", f);
527 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000528 }
529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 PyFile_WriteString(" in ", f);
531 PyFile_WriteObject(del, f, 0);
532 PyFile_WriteString(" ignored\n", f);
533 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000534 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000535 Py_XDECREF(t);
536 Py_XDECREF(v);
537 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000538 }
539 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 Py_DECREF(res);
541 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000542 }
543 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000545 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000546 if (--inst->ob_refcnt > 0) {
547#ifdef COUNT_ALLOCS
548 inst->ob_type->tp_free--;
549#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000550 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000551 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000552#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000553#ifdef COUNT_ALLOCS
554 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
555#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 _Py_ForgetReference(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000557 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000558#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_DECREF(inst->in_class);
560 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000561 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562}
563
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000565instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 register PyInstanceObject *inst;
567 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 register PyObject *v;
570 register char *sname = PyString_AsString(name);
571 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000572 if (sname[0] == '_' && sname[1] == '_') {
573 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 if (PyEval_GetRestricted()) {
575 PyErr_SetString(PyExc_RuntimeError,
576 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000577 return NULL;
578 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000580 return inst->in_dict;
581 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000582 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 Py_INCREF(inst->in_class);
584 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000585 }
Guido van Rossum94308391991-10-20 20:11:48 +0000586 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000587 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000589 if (v == NULL) {
590 v = class_lookup(inst->in_class, name, &class);
591 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000593 return NULL;
594 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000596 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000597 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 if (PyFunction_Check(v)) {
599 PyObject *w = PyMethod_New(v, (PyObject *)inst,
600 (PyObject *)class);
601 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000602 v = w;
603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 else if (PyMethod_Check(v)) {
605 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000606 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
608 PyObject *im_func = PyMethod_Function(v);
609 PyObject *w = PyMethod_New(im_func,
610 (PyObject *)inst, im_class);
611 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000612 v = w;
613 }
614 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000615 }
616 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000620instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 register PyInstanceObject *inst;
622 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000625 res = instance_getattr1(inst, name);
626 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 PyObject *args;
628 PyErr_Clear();
629 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000630 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000631 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 res = PyEval_CallObject(func, args);
633 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000634 }
635 return res;
636}
637
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000638static int
Guido van Rossume7737541994-09-05 07:31:41 +0000639instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640 PyInstanceObject *inst;
641 PyObject *name;
642 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643{
Guido van Rossum94472a01992-09-04 09:45:18 +0000644 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000646 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000648 "delete non-existing instance attribute");
649 return rv;
650 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653}
654
Guido van Rossume7737541994-09-05 07:31:41 +0000655static int
656instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657 PyInstanceObject *inst;
658 PyObject *name;
659 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000660{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000661 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000663 if (sname[0] == '_' && sname[1] == '_') {
664 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000665 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000666 if (strcmp(sname, "__dict__") == 0) {
667 if (PyEval_GetRestricted()) {
668 PyErr_SetString(PyExc_RuntimeError,
669 "__dict__ not accessible in restricted mode");
670 return -1;
671 }
672 if (v == NULL || !PyDict_Check(v)) {
673 PyErr_SetString(PyExc_TypeError,
674 "__dict__ must be set to a dictionary");
675 return -1;
676 }
677 tmp = inst->in_dict;
678 Py_INCREF(v);
679 inst->in_dict = v;
680 Py_DECREF(tmp);
681 return 0;
682 }
683 if (strcmp(sname, "__class__") == 0) {
684 if (PyEval_GetRestricted()) {
685 PyErr_SetString(PyExc_RuntimeError,
686 "__class__ not accessible in restricted mode");
687 return -1;
688 }
689 if (v == NULL || !PyClass_Check(v)) {
690 PyErr_SetString(PyExc_TypeError,
691 "__class__ must be set to a class");
692 return -1;
693 }
694 tmp = (PyObject *)(inst->in_class);
695 Py_INCREF(v);
696 inst->in_class = (PyClassObject *)v;
697 Py_DECREF(tmp);
698 return 0;
699 }
Guido van Rossume7737541994-09-05 07:31:41 +0000700 }
Guido van Rossume7737541994-09-05 07:31:41 +0000701 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000702 if (v == NULL)
703 func = inst->in_class->cl_delattr;
704 else
705 func = inst->in_class->cl_setattr;
706 if (func == NULL)
707 return instance_setattr1(inst, name, v);
708 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000710 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000712 if (args == NULL)
713 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 res = PyEval_CallObject(func, args);
715 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000716 if (res == NULL)
717 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000719 return 0;
720}
721
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000723instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 PyObject *func;
727 PyObject *res;
728 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000729
Guido van Rossum2878a691996-08-09 20:53:24 +0000730 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000731 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000732 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000734 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000736 PyObject *mod = PyDict_GetItemString(
737 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000738 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 if (classname != NULL && PyString_Check(classname))
740 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000741 else
742 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000744 if (mod == NULL || !PyString_Check(mod))
745 sprintf(buf, "<?.%.100s instance at %lx>",
746 cname, (long)inst);
747 else
748 sprintf(buf, "<%.50s.%.50s instance at %lx>",
749 PyString_AsString(mod),
750 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000752 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 res = PyEval_CallObject(func, (PyObject *)NULL);
754 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755 return res;
756}
757
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000759instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000761{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000763 instance_compare1);
764}
765
Guido van Rossum9bfef441993-03-29 10:43:31 +0000766static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000769{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000771 long outcome;
772 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000773 if (result == NULL)
774 return -1;
775 if (!PyInt_Check(result)) {
776 Py_DECREF(result);
777 PyErr_SetString(PyExc_TypeError,
778 "comparison did not return an int");
779 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000780 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 outcome = PyInt_AsLong(result);
782 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000783 if (outcome < 0)
784 return -1;
785 else if (outcome > 0)
786 return 1;
787 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788}
789
Guido van Rossum9bfef441993-03-29 10:43:31 +0000790static long
791instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000793{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 PyObject *func;
795 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000796 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000798
Guido van Rossum2878a691996-08-09 20:53:24 +0000799 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000800 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000801 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000802 if (func == NULL) {
803 /* If there is no __cmp__ method, we hash on the address.
804 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000806 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000807 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000808 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000809 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000811 outcome = (long)inst;
812 if (outcome == -1)
813 outcome = -2;
814 return outcome;
815 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000817 return -1;
818 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 res = PyEval_CallObject(func, (PyObject *)NULL);
820 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000821 if (res == NULL)
822 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 if (PyInt_Check(res)) {
824 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000825 if (outcome == -1)
826 outcome = -2;
827 }
828 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 PyErr_SetString(PyExc_TypeError,
830 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 outcome = -1;
832 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000834 return outcome;
835}
836
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000838
Guido van Rossum9bfef441993-03-29 10:43:31 +0000839static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 PyObject *func;
844 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845 int outcome;
846
Guido van Rossum2878a691996-08-09 20:53:24 +0000847 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000848 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000849 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000850 if (func == NULL)
851 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 res = PyEval_CallObject(func, (PyObject *)NULL);
853 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000854 if (res == NULL)
855 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 if (PyInt_Check(res)) {
857 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 PyErr_SetString(PyExc_ValueError,
860 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 }
862 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863 PyErr_SetString(PyExc_TypeError,
864 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000865 outcome = -1;
866 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868 return outcome;
869}
870
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000872instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 PyInstanceObject *inst;
874 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyObject *func;
877 PyObject *arg;
878 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879
Guido van Rossum2878a691996-08-09 20:53:24 +0000880 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000881 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000882 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000883 if (func == NULL)
884 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000888 return NULL;
889 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 res = PyEval_CallObject(func, arg);
891 Py_DECREF(func);
892 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000893 return res;
894}
895
Guido van Rossum9bfef441993-03-29 10:43:31 +0000896static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000897instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 PyInstanceObject*inst;
899 PyObject *key;
900 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 PyObject *func;
903 PyObject *arg;
904 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000905
Guido van Rossum2878a691996-08-09 20:53:24 +0000906 if (value == NULL) {
907 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000908 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000909 func = instance_getattr(inst, delitemstr);
910 }
911 else {
912 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000913 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000914 func = instance_getattr(inst, setitemstr);
915 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000916 if (func == NULL)
917 return -1;
918 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000924 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 res = PyEval_CallObject(func, arg);
927 Py_DECREF(func);
928 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929 if (res == NULL)
930 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 return 0;
933}
934
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000936 (inquiry)instance_length, /*mp_length*/
937 (binaryfunc)instance_subscript, /*mp_subscript*/
938 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939};
940
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944 int i;
945{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947
Guido van Rossum2878a691996-08-09 20:53:24 +0000948 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000949 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000950 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000951 if (func == NULL)
952 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000954 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956 return NULL;
957 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 res = PyEval_CallObject(func, arg);
959 Py_DECREF(func);
960 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000961 return res;
962}
963
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000965instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967 int i, j;
968{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 PyObject *func, *arg, *res;
970 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971
Guido van Rossum2878a691996-08-09 20:53:24 +0000972 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000973 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000974 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975 if (func == NULL)
976 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980 return NULL;
981 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 res = PyEval_CallObject(func, arg);
983 Py_DECREF(func);
984 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985 return res;
986}
987
988static int
989instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000991 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995
Guido van Rossum2878a691996-08-09 20:53:24 +0000996 if (item == NULL) {
997 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000998 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000999 func = instance_getattr(inst, delitemstr);
1000 }
1001 else {
1002 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001003 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001004 func = instance_getattr(inst, setitemstr);
1005 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001007 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001014 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 res = PyEval_CallObject(func, arg);
1017 Py_DECREF(func);
1018 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019 if (res == NULL)
1020 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 return 0;
1023}
1024
1025static int
1026instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001028 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001030{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 PyObject *func, *arg, *res;
1032 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033
Guido van Rossum2878a691996-08-09 20:53:24 +00001034 if (value == NULL) {
1035 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 delslicestr =
1037 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001038 func = instance_getattr(inst, delslicestr);
1039 }
1040 else {
1041 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 setslicestr =
1043 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001044 func = instance_getattr(inst, setslicestr);
1045 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001046 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001047 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001054 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 res = PyEval_CallObject(func, arg);
1057 Py_DECREF(func);
1058 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001059 if (res == NULL)
1060 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 return 0;
1063}
1064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001067 0, /*sq_concat*/
1068 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001069 (intargfunc)instance_item, /*sq_item*/
1070 (intintargfunc)instance_slice, /*sq_slice*/
1071 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1072 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001073};
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 PyInstanceObject *self;
1078 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081
1082 if ((func = instance_getattr(self, methodname)) == NULL)
1083 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 res = PyEval_CallObject(func, (PyObject *)NULL);
1085 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 return res;
1087}
1088
Guido van Rossum03093a21994-09-28 15:51:32 +00001089
1090/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1092 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001093
1094
1095/* Implement a binary operator involving at least one class instance. */
1096
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097PyObject *
1098PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1099 PyObject *v;
1100 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001101 char *opname;
1102 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001104{
1105 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001107 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001108 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001109 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001110 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001111 /* Sigh -- special case for comnparisons */
1112 if (strcmp(opname, "__cmp__") == 0) {
1113 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1114 return PyInt_FromLong(c);
1115 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001116 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001118 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001119}
1120
Guido van Rossum03093a21994-09-28 15:51:32 +00001121
1122/* Try one half of a binary operator involving a class instance.
1123 Return value:
1124 -1 if an exception is to be reported right away
1125 0 if we have a valid result
1126 1 if we could try another operation
1127*/
1128
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001130
Guido van Rossum03093a21994-09-28 15:51:32 +00001131static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001132halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyObject *v;
1134 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001135 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 PyObject **r_result;
1137 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001138 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001139{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 PyObject *func;
1141 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001142 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 PyObject *coerced = NULL;
1144 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001147 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001148 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001149 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001150 if (coerce_obj == NULL)
1151 return -1;
1152 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001153 coercefunc = PyObject_GetAttr(v, coerce_obj);
1154 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001156 }
1157 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001159 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001160 return -1;
1161 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001162 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001164 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001165 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001166 return -1;
1167 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 if (coerced == Py_None) {
1169 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001170 return 1;
1171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1173 Py_DECREF(coerced);
1174 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001175 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001176 return -1;
1177 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178 v1 = PyTuple_GetItem(coerced, 0);
1179 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001180 if (v1 != v) {
1181 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001182 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001183 if (swapped)
1184 *r_result = (*thisfunc)(w, v);
1185 else
1186 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001188 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001189 }
1190 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001193 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001195 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001196 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001198 return 1;
1199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001201 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 Py_DECREF(func);
1203 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 return -1;
1205 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 *r_result = PyEval_CallObject(func, args);
1207 Py_DECREF(args);
1208 Py_DECREF(func);
1209 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001210 return *r_result == NULL ? -1 : 0;
1211}
1212
Guido van Rossum879c5811995-01-10 15:24:06 +00001213static int
1214instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyObject **pv;
1216 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001217{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 PyObject *v = *pv;
1219 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001220 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 PyObject *args;
1222 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001223
Guido van Rossum2878a691996-08-09 20:53:24 +00001224 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001225 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001226 if (coerce_obj == NULL)
1227 return -1;
1228 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001229 coercefunc = PyObject_GetAttr(v, coerce_obj);
1230 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001231 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 PyErr_Clear();
1233 Py_INCREF(v);
1234 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001235 return 0;
1236 }
1237 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001239 if (args == NULL) {
1240 return -1;
1241 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001242 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001244 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001245 if (coerced == NULL) {
1246 /* __coerce__ call raised an exception */
1247 return -1;
1248 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001250 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001252 return 1;
1253 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001255 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 Py_DECREF(coerced);
1257 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001258 "coercion should return None or 2-tuple");
1259 return -1;
1260 }
1261 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262 *pv = PyTuple_GetItem(coerced, 0);
1263 *pw = PyTuple_GetItem(coerced, 1);
1264 Py_INCREF(*pv);
1265 Py_INCREF(*pw);
1266 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001267 return 0;
1268}
1269
Guido van Rossum03093a21994-09-28 15:51:32 +00001270
Guido van Rossum04691fc1992-08-12 15:35:34 +00001271#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272static PyObject *funcname(self) PyInstanceObject *self; { \
1273 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001274 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001275 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001276}
1277
Guido van Rossum04691fc1992-08-12 15:35:34 +00001278UNARY(instance_neg, "__neg__")
1279UNARY(instance_pos, "__pos__")
1280UNARY(instance_abs, "__abs__")
1281
Guido van Rossum9bfef441993-03-29 10:43:31 +00001282static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001283instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001285{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001287 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001289
Guido van Rossum2878a691996-08-09 20:53:24 +00001290 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001291 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001292 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001294 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001295 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001296 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001298 /* Fall back to the default behavior:
1299 all instances are nonzero */
1300 return 1;
1301 }
1302 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 res = PyEval_CallObject(func, (PyObject *)NULL);
1304 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001305 if (res == NULL)
1306 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 if (!PyInt_Check(res)) {
1308 Py_DECREF(res);
1309 PyErr_SetString(PyExc_TypeError,
1310 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001311 return -1;
1312 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 outcome = PyInt_AsLong(res);
1314 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001315 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 PyErr_SetString(PyExc_ValueError,
1317 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 return -1;
1319 }
1320 return outcome > 0;
1321}
1322
1323UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001324UNARY(instance_int, "__int__")
1325UNARY(instance_long, "__long__")
1326UNARY(instance_float, "__float__")
1327UNARY(instance_oct, "__oct__")
1328UNARY(instance_hex, "__hex__")
1329
Guido van Rossum03093a21994-09-28 15:51:32 +00001330/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001332instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 PyObject *v;
1334 PyObject *w;
1335 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001336{
1337 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyObject *func;
1339 PyObject *args;
1340 PyObject *result;
1341 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001342
1343 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001344 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001346 if (func == NULL)
1347 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001349 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001351 return NULL;
1352 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 result = PyEval_CallObject(func, args);
1354 Py_DECREF(func);
1355 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001356 return result;
1357}
1358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001360 0, /*nb_add*/
1361 0, /*nb_subtract*/
1362 0, /*nb_multiply*/
1363 0, /*nb_divide*/
1364 0, /*nb_remainder*/
1365 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001366 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001367 (unaryfunc)instance_neg, /*nb_negative*/
1368 (unaryfunc)instance_pos, /*nb_positive*/
1369 (unaryfunc)instance_abs, /*nb_absolute*/
1370 (inquiry)instance_nonzero, /*nb_nonzero*/
1371 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001372 0, /*nb_lshift*/
1373 0, /*nb_rshift*/
1374 0, /*nb_and*/
1375 0, /*nb_xor*/
1376 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001377 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001378 (unaryfunc)instance_int, /*nb_int*/
1379 (unaryfunc)instance_long, /*nb_long*/
1380 (unaryfunc)instance_float, /*nb_float*/
1381 (unaryfunc)instance_oct, /*nb_oct*/
1382 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001383};
1384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385PyTypeObject PyInstance_Type = {
1386 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001387 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001388 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001391 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001392 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001393 0, /*tp_getattr*/
1394 0, /*tp_setattr*/
1395 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001396 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001397 &instance_as_number, /*tp_as_number*/
1398 &instance_as_sequence, /*tp_as_sequence*/
1399 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001400 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001401 0, /*tp_call*/
1402 0, /*tp_str*/
1403 (getattrofunc)instance_getattr, /*tp_getattro*/
1404 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001405};
1406
1407
Guido van Rossum81daa321993-05-20 14:24:46 +00001408/* Instance method objects are used for two purposes:
1409 (a) as bound instance methods (returned by instancename.methodname)
1410 (b) as unbound methods (returned by ClassName.methodname)
1411 In case (b), im_self is NULL
1412*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001413
1414typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 PyObject_HEAD
1416 PyObject *im_func; /* The function implementing the method */
1417 PyObject *im_self; /* The instance it is bound to, or NULL */
1418 PyObject *im_class; /* The class that defined the method */
1419} PyMethodObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001420
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001421
1422static PyMethodObject *free_list;
1423
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424PyObject *
1425PyMethod_New(func, self, class)
1426 PyObject *func;
1427 PyObject *self;
1428 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001429{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001431 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001433 return NULL;
1434 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001435 im = free_list;
1436 if (im != NULL) {
1437 free_list = (PyMethodObject *)(im->im_self);
1438 im->ob_type = &PyMethod_Type;
1439 _Py_NewReference(im);
1440 }
1441 else {
1442 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1443 if (im == NULL)
1444 return NULL;
1445 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001447 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001449 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001451 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455PyObject *
1456PyMethod_Function(im)
1457 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001458{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 if (!PyMethod_Check(im)) {
1460 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001461 return NULL;
1462 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001464}
1465
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466PyObject *
1467PyMethod_Self(im)
1468 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001469{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 if (!PyMethod_Check(im)) {
1471 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001472 return NULL;
1473 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001475}
1476
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477PyObject *
1478PyMethod_Class(im)
1479 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001480{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 if (!PyMethod_Check(im)) {
1482 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001483 return NULL;
1484 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001486}
1487
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001488/* Class method methods */
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491
Guido van Rossume8122f11991-05-05 20:03:07 +00001492static struct memberlist instancemethod_memberlist[] = {
1493 {"im_func", T_OBJECT, OFF(im_func)},
1494 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001495 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001496 /* Dummies that are not handled by getattr() except for __members__ */
1497 {"__doc__", T_INT, 0},
1498 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 {NULL} /* Sentinel */
1500};
1501
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001503instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 register PyMethodObject *im;
1505 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001508 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001509 /* Inherit __name__ and __doc__ from the callable object
1510 implementing the method */
1511 if (strcmp(sname, "__name__") == 0 ||
1512 strcmp(sname, "__doc__") == 0)
1513 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001514 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 if (PyEval_GetRestricted()) {
1516 PyErr_SetString(PyExc_RuntimeError,
1517 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001518 return NULL;
1519 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521}
1522
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001523static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001524instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001526{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 Py_DECREF(im->im_func);
1528 Py_XDECREF(im->im_self);
1529 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001530 im->im_self = (PyObject *)free_list;
1531 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001532}
1533
Guido van Rossumebc8c511992-09-03 20:39:51 +00001534static int
1535instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001537{
Guido van Rossume9df7271995-04-06 14:46:51 +00001538 if (a->im_self != b->im_self)
1539 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001541}
1542
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001544instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001546{
1547 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001549 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001550 PyClassObject *class = (PyClassObject *)(a->im_class);
1551 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001552 char *fcname, *icname, *fname;
1553 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001554 if (PyFunction_Check(func)) {
1555 funcname = ((PyFunctionObject *)func)->func_name;
1556 Py_INCREF(funcname);
1557 }
1558 else {
1559 funcname = PyObject_GetAttrString(func,"__name__");
1560 if (funcname == NULL)
1561 PyErr_Clear();
1562 }
1563 if (funcname != NULL && PyString_Check(funcname))
1564 fname = PyString_AS_STRING(funcname);
1565 else
1566 fname = "?";
1567 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 if (fclassname != NULL && PyString_Check(fclassname))
1569 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001570 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001571 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001572 if (self == NULL)
1573 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1574 else {
1575 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 if (iclassname != NULL && PyString_Check(iclassname))
1577 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001578 else
1579 icname = "?";
1580 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1581 fcname, fname, icname, (long)self);
1582 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001584}
1585
Guido van Rossum9bfef441993-03-29 10:43:31 +00001586static long
1587instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001589{
1590 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001591 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001593 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001595 if (x == -1)
1596 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001598 if (y == -1)
1599 return -1;
1600 return x ^ y;
1601}
1602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603PyTypeObject PyMethod_Type = {
1604 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001605 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001606 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001608 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001609 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001610 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001611 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001612 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001613 (cmpfunc)instancemethod_compare, /*tp_compare*/
1614 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001615 0, /*tp_as_number*/
1616 0, /*tp_as_sequence*/
1617 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001618 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001619 0, /*tp_call*/
1620 0, /*tp_str*/
1621 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1622 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001623};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001624
1625/* Clear out the free list */
1626
1627void
1628PyMethod_Fini()
1629{
1630 while (free_list) {
1631 PyMethodObject *v = free_list;
1632 free_list = (PyMethodObject *)(v->im_self);
1633 PyMem_DEL(v);
1634 }
1635}