blob: 8ee13444b8da8207aeb015a5b893b651775a49d0 [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 Rossum152d8171998-08-04 14:59:16 +0000146 Py_XDECREF(op->cl_getattr);
147 Py_XDECREF(op->cl_setattr);
148 Py_XDECREF(op->cl_delattr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149 free((ANY *)op);
150}
151
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000153class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 PyClassObject *cp;
155 PyObject *name;
156 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000157{
158 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000160 if (value != NULL) {
161 *pclass = cp;
162 return value;
163 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000165 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000166 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyObject *v = class_lookup(
168 (PyClassObject *)
169 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000170 if (v != NULL)
171 return v;
172 }
173 return NULL;
174}
175
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 register PyClassObject *op;
179 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 register PyObject *v;
182 register char *sname = PyString_AsString(name);
183 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000184 if (sname[0] == '_' && sname[1] == '_') {
185 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 if (PyEval_GetRestricted()) {
187 PyErr_SetString(PyExc_RuntimeError,
188 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000189 return NULL;
190 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000192 return op->cl_dict;
193 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000194 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000196 return op->cl_bases;
197 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000198 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000199 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000201 else
202 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000204 return v;
205 }
Guido van Rossum94308391991-10-20 20:11:48 +0000206 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000207 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000208 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000210 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000212 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (PyFunction_Check(v)) {
214 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
215 (PyObject *)class);
216 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000217 v = w;
218 }
219 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
Guido van Rossuma63eff61998-05-29 21:37:21 +0000222static void
223set_slot(slot, v)
224 PyObject **slot;
225 PyObject *v;
226{
227 PyObject *temp = *slot;
228 Py_XINCREF(v);
229 *slot = v;
230 Py_XDECREF(temp);
231}
232
Guido van Rossum7ba30431998-07-08 13:34:48 +0000233static void
234set_attr_slots(c)
235 PyClassObject *c;
236{
237 PyClassObject *dummy;
238
239 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
240 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
241 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
242}
243
Guido van Rossuma63eff61998-05-29 21:37:21 +0000244static char *
245set_dict(c, v)
246 PyClassObject *c;
247 PyObject *v;
248{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000249 if (v == NULL || !PyDict_Check(v))
250 return "__dict__ must be a dictionary object";
251 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000252 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000253 return "";
254}
255
256static char *
257set_bases(c, v)
258 PyClassObject *c;
259 PyObject *v;
260{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000261 int i, n;
262
263 if (v == NULL || !PyTuple_Check(v))
264 return "__bases__ must be a tuple object";
265 n = PyTuple_Size(v);
266 for (i = 0; i < n; i++) {
267 PyObject *x = PyTuple_GET_ITEM(v, i);
268 if (!PyClass_Check(x))
269 return "__bases__ items must be classes";
270 if (PyClass_IsSubclass(x, (PyObject *)c))
271 return "a __bases__ item causes an inheritance cycle";
272 }
273 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000274 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000275 return "";
276}
277
278static char *
279set_name(c, v)
280 PyClassObject *c;
281 PyObject *v;
282{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000283 if (v == NULL || !PyString_Check(v))
284 return "__name__ must be a string object";
Guido van Rossume0fdf6f1998-06-12 15:03:58 +0000285 if ((long)strlen(PyString_AS_STRING(v)) != PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000286 return "__name__ must not contain null bytes";
287 set_slot(&c->cl_name, v);
288 return "";
289}
290
Guido van Rossum94308391991-10-20 20:11:48 +0000291static int
292class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 PyClassObject *op;
294 PyObject *name;
295 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000296{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000297 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 if (PyEval_GetRestricted()) {
299 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000300 "classes are read-only in restricted mode");
301 return -1;
302 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000303 sname = PyString_AsString(name);
304 if (sname[0] == '_' && sname[1] == '_') {
305 int n = PyString_Size(name);
306 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000307 char *err = NULL;
308 if (strcmp(sname, "__dict__") == 0)
309 err = set_dict(op, v);
310 else if (strcmp(sname, "__bases__") == 0)
311 err = set_bases(op, v);
312 else if (strcmp(sname, "__name__") == 0)
313 err = set_name(op, v);
314 else if (strcmp(sname, "__getattr__") == 0)
315 set_slot(&op->cl_getattr, v);
316 else if (strcmp(sname, "__setattr__") == 0)
317 set_slot(&op->cl_setattr, v);
318 else if (strcmp(sname, "__delattr__") == 0)
319 set_slot(&op->cl_delattr, v);
320 /* For the last three, we fall through to update the
321 dictionary as well. */
322 if (err != NULL) {
323 if (*err == '\0')
324 return 0;
325 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000326 return -1;
327 }
328 }
329 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000330 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000332 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000334 "delete non-existing class attribute");
335 return rv;
336 }
Guido van Rossum94308391991-10-20 20:11:48 +0000337 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000339}
340
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000342class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000344{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000345 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000346 char buf[140];
347 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000349 name = "?";
350 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000352 if (mod == NULL || !PyString_Check(mod))
353 sprintf(buf, "<class ?.%.100s at %lx>", name, (long)op);
354 else
355 sprintf(buf, "<class %.50s.%.50s at %lx>",
356 PyString_AsString(mod),
357 name, (long)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000359}
360
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000361static PyObject *
362class_str(op)
363 PyClassObject *op;
364{
365 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
366 PyObject *name = op->cl_name;
367 PyObject *res;
368 int m, n;
369
370 if (name == NULL || !PyString_Check(name))
371 return class_repr(op);
372 if (mod == NULL || !PyString_Check(mod)) {
373 Py_INCREF(name);
374 return name;
375 }
376 m = PyString_Size(mod);
377 n = PyString_Size(name);
378 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
379 if (res != NULL) {
380 char *s = PyString_AsString(res);
381 memcpy(s, PyString_AsString(mod), m);
382 s += m;
383 *s++ = '.';
384 memcpy(s, PyString_AsString(name), n);
385 }
386 return res;
387}
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389PyTypeObject PyClass_Type = {
390 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 0,
392 "class",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 sizeof(PyClassObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000395 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000397 0, /*tp_getattr*/
398 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000400 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 0, /*tp_as_number*/
402 0, /*tp_as_sequence*/
403 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000404 0, /*tp_hash*/
405 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000406 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000407 (getattrofunc)class_getattr, /*tp_getattro*/
408 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409};
410
Guido van Rossum81daa321993-05-20 14:24:46 +0000411int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412PyClass_IsSubclass(class, base)
413 PyObject *class;
414 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000415{
416 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000418 if (class == base)
419 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000421 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 cp = (PyClassObject *)class;
423 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000424 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000426 return 1;
427 }
428 return 0;
429}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430
Guido van Rossum81daa321993-05-20 14:24:46 +0000431
432/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434PyObject *
435PyInstance_New(class, arg, kw)
436 PyObject *class;
437 PyObject *arg;
438 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 register PyInstanceObject *inst;
441 PyObject *init;
442 static PyObject *initstr;
443 if (!PyClass_Check(class)) {
444 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 return NULL;
446 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000448 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 Py_INCREF(class);
451 inst->in_class = (PyClassObject *)class;
452 inst->in_dict = PyDict_New();
Guido van Rossum0add15f1997-05-09 01:07:15 +0000453 if (inst->in_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 Py_DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455 return NULL;
456 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000457 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000458 initstr = PyString_InternFromString("__init__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000459 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000460 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 PyErr_Clear();
462 if ((arg != NULL && (!PyTuple_Check(arg) ||
463 PyTuple_Size(arg) != 0))
464 || (kw != NULL && (!PyDict_Check(kw) ||
465 PyDict_Size(kw) != 0))) {
466 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000467 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000469 inst = NULL;
470 }
471 }
472 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
474 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000475 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 inst = NULL;
478 }
479 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 if (res != Py_None) {
481 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000482 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000484 inst = NULL;
485 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000487 }
488 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490}
491
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000492/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493
494static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000495instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyObject *error_type, *error_value, *error_traceback;
499 PyObject *del;
500 static PyObject *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000501 /* Call the __del__ method if it exists. First temporarily
502 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000503#ifdef Py_TRACE_REFS
504 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 extern long _Py_RefTotal;
506 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000507 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000509#ifdef COUNT_ALLOCS
510 inst->ob_type->tp_alloc--; /* ditto */
511#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000512#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000514#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000516 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000517 delstr = PyString_InternFromString("__del__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000518 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000520 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyObject *f, *t, *v, *tb;
522 PyErr_Fetch(&t, &v, &tb);
523 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000524 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000526 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyFile_WriteObject(t, f, Py_PRINT_RAW);
528 if (v && v != Py_None) {
529 PyFile_WriteString(": ", f);
530 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000531 }
532 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 PyFile_WriteString(" in ", f);
534 PyFile_WriteObject(del, f, 0);
535 PyFile_WriteString(" ignored\n", f);
536 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000537 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000538 Py_XDECREF(t);
539 Py_XDECREF(v);
540 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000541 }
542 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 Py_DECREF(res);
544 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000545 }
546 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000548 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000549 if (--inst->ob_refcnt > 0) {
550#ifdef COUNT_ALLOCS
551 inst->ob_type->tp_free--;
552#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000553 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000554 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000555#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000556#ifdef COUNT_ALLOCS
557 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
558#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000559 _Py_ForgetReference((PyObject *)inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000560 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000561#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 Py_DECREF(inst->in_class);
563 Py_XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000564 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565}
566
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000568instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 register PyInstanceObject *inst;
570 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 register PyObject *v;
573 register char *sname = PyString_AsString(name);
574 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000575 if (sname[0] == '_' && sname[1] == '_') {
576 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 if (PyEval_GetRestricted()) {
578 PyErr_SetString(PyExc_RuntimeError,
579 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000580 return NULL;
581 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000583 return inst->in_dict;
584 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000585 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 Py_INCREF(inst->in_class);
587 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000588 }
Guido van Rossum94308391991-10-20 20:11:48 +0000589 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000590 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000592 if (v == NULL) {
593 v = class_lookup(inst->in_class, name, &class);
594 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000596 return NULL;
597 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000599 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000600 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 if (PyFunction_Check(v)) {
602 PyObject *w = PyMethod_New(v, (PyObject *)inst,
603 (PyObject *)class);
604 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000605 v = w;
606 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 else if (PyMethod_Check(v)) {
608 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000609 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
611 PyObject *im_func = PyMethod_Function(v);
612 PyObject *w = PyMethod_New(im_func,
613 (PyObject *)inst, im_class);
614 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000615 v = w;
616 }
617 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000618 }
619 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620}
621
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000623instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 register PyInstanceObject *inst;
625 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000626{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000628 res = instance_getattr1(inst, name);
629 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *args;
631 PyErr_Clear();
632 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000633 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000634 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 res = PyEval_CallObject(func, args);
636 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000637 }
638 return res;
639}
640
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641static int
Guido van Rossume7737541994-09-05 07:31:41 +0000642instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 PyInstanceObject *inst;
644 PyObject *name;
645 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646{
Guido van Rossum94472a01992-09-04 09:45:18 +0000647 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000649 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000651 "delete non-existing instance attribute");
652 return rv;
653 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656}
657
Guido van Rossume7737541994-09-05 07:31:41 +0000658static int
659instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyInstanceObject *inst;
661 PyObject *name;
662 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000663{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000664 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000666 if (sname[0] == '_' && sname[1] == '_') {
667 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000668 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000669 if (strcmp(sname, "__dict__") == 0) {
670 if (PyEval_GetRestricted()) {
671 PyErr_SetString(PyExc_RuntimeError,
672 "__dict__ not accessible in restricted mode");
673 return -1;
674 }
675 if (v == NULL || !PyDict_Check(v)) {
676 PyErr_SetString(PyExc_TypeError,
677 "__dict__ must be set to a dictionary");
678 return -1;
679 }
680 tmp = inst->in_dict;
681 Py_INCREF(v);
682 inst->in_dict = v;
683 Py_DECREF(tmp);
684 return 0;
685 }
686 if (strcmp(sname, "__class__") == 0) {
687 if (PyEval_GetRestricted()) {
688 PyErr_SetString(PyExc_RuntimeError,
689 "__class__ not accessible in restricted mode");
690 return -1;
691 }
692 if (v == NULL || !PyClass_Check(v)) {
693 PyErr_SetString(PyExc_TypeError,
694 "__class__ must be set to a class");
695 return -1;
696 }
697 tmp = (PyObject *)(inst->in_class);
698 Py_INCREF(v);
699 inst->in_class = (PyClassObject *)v;
700 Py_DECREF(tmp);
701 return 0;
702 }
Guido van Rossume7737541994-09-05 07:31:41 +0000703 }
Guido van Rossume7737541994-09-05 07:31:41 +0000704 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000705 if (v == NULL)
706 func = inst->in_class->cl_delattr;
707 else
708 func = inst->in_class->cl_setattr;
709 if (func == NULL)
710 return instance_setattr1(inst, name, v);
711 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000713 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000715 if (args == NULL)
716 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 res = PyEval_CallObject(func, args);
718 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000719 if (res == NULL)
720 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000722 return 0;
723}
724
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000728{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 PyObject *func;
730 PyObject *res;
731 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000732
Guido van Rossum2878a691996-08-09 20:53:24 +0000733 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000734 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000735 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000737 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000739 PyObject *mod = PyDict_GetItemString(
740 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000741 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 if (classname != NULL && PyString_Check(classname))
743 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000744 else
745 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000747 if (mod == NULL || !PyString_Check(mod))
748 sprintf(buf, "<?.%.100s instance at %lx>",
749 cname, (long)inst);
750 else
751 sprintf(buf, "<%.50s.%.50s instance at %lx>",
752 PyString_AsString(mod),
753 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000755 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 res = PyEval_CallObject(func, (PyObject *)NULL);
757 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000758 return res;
759}
760
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000762instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000764{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000766 instance_compare1);
767}
768
Guido van Rossum9bfef441993-03-29 10:43:31 +0000769static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000774 long outcome;
775 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000776 if (result == NULL)
777 return -1;
778 if (!PyInt_Check(result)) {
779 Py_DECREF(result);
780 PyErr_SetString(PyExc_TypeError,
781 "comparison did not return an int");
782 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000783 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 outcome = PyInt_AsLong(result);
785 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000786 if (outcome < 0)
787 return -1;
788 else if (outcome > 0)
789 return 1;
790 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000791}
792
Guido van Rossum9bfef441993-03-29 10:43:31 +0000793static long
794instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000796{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 PyObject *func;
798 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000799 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000801
Guido van Rossum2878a691996-08-09 20:53:24 +0000802 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000803 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000804 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000805 if (func == NULL) {
806 /* If there is no __cmp__ method, we hash on the address.
807 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000809 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000810 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000811 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000812 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000814 outcome = (long)inst;
815 if (outcome == -1)
816 outcome = -2;
817 return outcome;
818 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000820 return -1;
821 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 res = PyEval_CallObject(func, (PyObject *)NULL);
823 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000824 if (res == NULL)
825 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 if (PyInt_Check(res)) {
827 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 if (outcome == -1)
829 outcome = -2;
830 }
831 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 PyErr_SetString(PyExc_TypeError,
833 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000834 outcome = -1;
835 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000837 return outcome;
838}
839
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000841
Guido van Rossum9bfef441993-03-29 10:43:31 +0000842static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000845{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyObject *func;
847 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000848 int outcome;
849
Guido van Rossum2878a691996-08-09 20:53:24 +0000850 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000851 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000852 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000853 if (func == NULL)
854 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 res = PyEval_CallObject(func, (PyObject *)NULL);
856 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000857 if (res == NULL)
858 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 if (PyInt_Check(res)) {
860 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 PyErr_SetString(PyExc_ValueError,
863 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864 }
865 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 PyErr_SetString(PyExc_TypeError,
867 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000868 outcome = -1;
869 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871 return outcome;
872}
873
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000875instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyInstanceObject *inst;
877 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 PyObject *func;
880 PyObject *arg;
881 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000882
Guido van Rossum2878a691996-08-09 20:53:24 +0000883 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000884 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000885 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000886 if (func == NULL)
887 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891 return NULL;
892 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 res = PyEval_CallObject(func, arg);
894 Py_DECREF(func);
895 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 return res;
897}
898
Guido van Rossum9bfef441993-03-29 10:43:31 +0000899static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000900instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 PyInstanceObject*inst;
902 PyObject *key;
903 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000904{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 PyObject *func;
906 PyObject *arg;
907 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000908
Guido van Rossum2878a691996-08-09 20:53:24 +0000909 if (value == NULL) {
910 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000911 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000912 func = instance_getattr(inst, delitemstr);
913 }
914 else {
915 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000916 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000917 func = instance_getattr(inst, setitemstr);
918 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919 if (func == NULL)
920 return -1;
921 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000922 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000927 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 res = PyEval_CallObject(func, arg);
930 Py_DECREF(func);
931 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000932 if (res == NULL)
933 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 return 0;
936}
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000939 (inquiry)instance_length, /*mp_length*/
940 (binaryfunc)instance_subscript, /*mp_subscript*/
941 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942};
943
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000947 int i;
948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950
Guido van Rossum2878a691996-08-09 20:53:24 +0000951 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000952 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000953 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000954 if (func == NULL)
955 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000959 return NULL;
960 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 res = PyEval_CallObject(func, arg);
962 Py_DECREF(func);
963 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964 return res;
965}
966
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000968instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000970 int i, j;
971{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyObject *func, *arg, *res;
973 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000974
Guido van Rossum2878a691996-08-09 20:53:24 +0000975 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000976 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000977 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978 if (func == NULL)
979 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000983 return NULL;
984 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 res = PyEval_CallObject(func, arg);
986 Py_DECREF(func);
987 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000988 return res;
989}
990
991static int
992instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000994 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000996{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998
Guido van Rossum2878a691996-08-09 20:53:24 +0000999 if (item == NULL) {
1000 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001001 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001002 func = instance_getattr(inst, delitemstr);
1003 }
1004 else {
1005 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001006 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001007 func = instance_getattr(inst, setitemstr);
1008 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001010 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001011 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001013 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001017 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001018 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 res = PyEval_CallObject(func, arg);
1020 Py_DECREF(func);
1021 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 if (res == NULL)
1023 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 return 0;
1026}
1027
1028static int
1029instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 PyObject *func, *arg, *res;
1035 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001036
Guido van Rossum2878a691996-08-09 20:53:24 +00001037 if (value == NULL) {
1038 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 delslicestr =
1040 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001041 func = instance_getattr(inst, delslicestr);
1042 }
1043 else {
1044 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 setslicestr =
1046 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001047 func = instance_getattr(inst, setslicestr);
1048 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001049 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001050 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001057 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 res = PyEval_CallObject(func, arg);
1060 Py_DECREF(func);
1061 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 if (res == NULL)
1063 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065 return 0;
1066}
1067
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001068static int instance_contains(PyInstanceObject *inst, PyObject *member)
1069{
1070 static PyObject *__contains__;
1071 PyObject *func, *arg, *res;
1072 int ret;
1073
1074 if(__contains__ == NULL) {
1075 __contains__ = PyString_InternFromString("__contains__");
1076 if(__contains__ == NULL)
1077 return -1;
1078 }
1079 func = instance_getattr(inst, __contains__);
1080 if(func == NULL) {
1081 /* fall back to previous behaviour */
1082 int i, cmp_res;
1083
1084 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1085 return -1;
1086 PyErr_Clear();
1087 for(i=0;;i++) {
1088 PyObject *obj = instance_item(inst, i);
1089 int ret = 0;
1090
1091 if(obj == NULL) {
1092 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1093 return -1;
1094 PyErr_Clear();
1095 return 0;
1096 }
1097 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1098 ret = -1;
1099 if(cmp_res == 0)
1100 ret = 1;
1101 Py_DECREF(obj);
1102 if(ret)
1103 return ret;
1104 }
1105 }
1106 arg = Py_BuildValue("(O)", member);
1107 if(arg == NULL) {
1108 Py_DECREF(func);
1109 return -1;
1110 }
1111 res = PyEval_CallObject(func, arg);
1112 Py_DECREF(func);
1113 Py_DECREF(arg);
1114 if(res == NULL)
1115 return -1;
1116 ret = PyObject_IsTrue(res);
1117 Py_DECREF(res);
1118 return ret;
1119}
1120
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001122 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001123 0, /*sq_concat*/
1124 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001125 (intargfunc)instance_item, /*sq_item*/
1126 (intintargfunc)instance_slice, /*sq_slice*/
1127 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1128 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001129 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001130};
1131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 PyInstanceObject *self;
1135 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001138
1139 if ((func = instance_getattr(self, methodname)) == NULL)
1140 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 res = PyEval_CallObject(func, (PyObject *)NULL);
1142 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001143 return res;
1144}
1145
Guido van Rossum03093a21994-09-28 15:51:32 +00001146
1147/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1149 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001150
1151
1152/* Implement a binary operator involving at least one class instance. */
1153
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154PyObject *
1155PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1156 PyObject *v;
1157 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001158 char *opname;
1159 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001161{
1162 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001164 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001165 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001166 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001167 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001168 /* Sigh -- special case for comnparisons */
1169 if (strcmp(opname, "__cmp__") == 0) {
1170 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1171 return PyInt_FromLong(c);
1172 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001173 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001175 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001176}
1177
Guido van Rossum03093a21994-09-28 15:51:32 +00001178
1179/* Try one half of a binary operator involving a class instance.
1180 Return value:
1181 -1 if an exception is to be reported right away
1182 0 if we have a valid result
1183 1 if we could try another operation
1184*/
1185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001187
Guido van Rossum03093a21994-09-28 15:51:32 +00001188static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001189halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyObject *v;
1191 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001192 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 PyObject **r_result;
1194 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001195 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001196{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 PyObject *func;
1198 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001199 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyObject *coerced = NULL;
1201 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001205 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001206 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001207 if (coerce_obj == NULL)
1208 return -1;
1209 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001210 coercefunc = PyObject_GetAttr(v, coerce_obj);
1211 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001213 }
1214 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001216 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001217 return -1;
1218 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001219 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001221 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001222 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001223 return -1;
1224 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 if (coerced == Py_None) {
1226 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001227 return 1;
1228 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1230 Py_DECREF(coerced);
1231 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001232 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001233 return -1;
1234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 v1 = PyTuple_GetItem(coerced, 0);
1236 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001237 if (v1 != v) {
1238 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001240 if (swapped)
1241 *r_result = (*thisfunc)(w, v);
1242 else
1243 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001245 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001246 }
1247 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001248 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001250 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001252 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001253 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001255 return 1;
1256 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001258 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 Py_DECREF(func);
1260 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001261 return -1;
1262 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 *r_result = PyEval_CallObject(func, args);
1264 Py_DECREF(args);
1265 Py_DECREF(func);
1266 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001267 return *r_result == NULL ? -1 : 0;
1268}
1269
Guido van Rossum879c5811995-01-10 15:24:06 +00001270static int
1271instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272 PyObject **pv;
1273 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001274{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 PyObject *v = *pv;
1276 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001277 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyObject *args;
1279 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001280
Guido van Rossum2878a691996-08-09 20:53:24 +00001281 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001282 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001283 if (coerce_obj == NULL)
1284 return -1;
1285 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001286 coercefunc = PyObject_GetAttr(v, coerce_obj);
1287 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001288 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 PyErr_Clear();
1290 Py_INCREF(v);
1291 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001292 return 0;
1293 }
1294 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001296 if (args == NULL) {
1297 return -1;
1298 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001299 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001301 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001302 if (coerced == NULL) {
1303 /* __coerce__ call raised an exception */
1304 return -1;
1305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001307 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001309 return 1;
1310 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001312 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 Py_DECREF(coerced);
1314 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001315 "coercion should return None or 2-tuple");
1316 return -1;
1317 }
1318 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 *pv = PyTuple_GetItem(coerced, 0);
1320 *pw = PyTuple_GetItem(coerced, 1);
1321 Py_INCREF(*pv);
1322 Py_INCREF(*pw);
1323 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001324 return 0;
1325}
1326
Guido van Rossum03093a21994-09-28 15:51:32 +00001327
Guido van Rossum04691fc1992-08-12 15:35:34 +00001328#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329static PyObject *funcname(self) PyInstanceObject *self; { \
1330 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001331 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001332 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001333}
1334
Guido van Rossum04691fc1992-08-12 15:35:34 +00001335UNARY(instance_neg, "__neg__")
1336UNARY(instance_pos, "__pos__")
1337UNARY(instance_abs, "__abs__")
1338
Guido van Rossum9bfef441993-03-29 10:43:31 +00001339static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001340instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001342{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001344 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001346
Guido van Rossum2878a691996-08-09 20:53:24 +00001347 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001348 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001349 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001351 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001352 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001353 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001355 /* Fall back to the default behavior:
1356 all instances are nonzero */
1357 return 1;
1358 }
1359 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 res = PyEval_CallObject(func, (PyObject *)NULL);
1361 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362 if (res == NULL)
1363 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 if (!PyInt_Check(res)) {
1365 Py_DECREF(res);
1366 PyErr_SetString(PyExc_TypeError,
1367 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001368 return -1;
1369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 outcome = PyInt_AsLong(res);
1371 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001372 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 PyErr_SetString(PyExc_ValueError,
1374 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001375 return -1;
1376 }
1377 return outcome > 0;
1378}
1379
1380UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001381UNARY(instance_int, "__int__")
1382UNARY(instance_long, "__long__")
1383UNARY(instance_float, "__float__")
1384UNARY(instance_oct, "__oct__")
1385UNARY(instance_hex, "__hex__")
1386
Guido van Rossum03093a21994-09-28 15:51:32 +00001387/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001389instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyObject *v;
1391 PyObject *w;
1392 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001393{
1394 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 PyObject *func;
1396 PyObject *args;
1397 PyObject *result;
1398 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001399
1400 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001401 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001403 if (func == NULL)
1404 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001406 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001408 return NULL;
1409 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 result = PyEval_CallObject(func, args);
1411 Py_DECREF(func);
1412 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001413 return result;
1414}
1415
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001417 0, /*nb_add*/
1418 0, /*nb_subtract*/
1419 0, /*nb_multiply*/
1420 0, /*nb_divide*/
1421 0, /*nb_remainder*/
1422 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001423 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001424 (unaryfunc)instance_neg, /*nb_negative*/
1425 (unaryfunc)instance_pos, /*nb_positive*/
1426 (unaryfunc)instance_abs, /*nb_absolute*/
1427 (inquiry)instance_nonzero, /*nb_nonzero*/
1428 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001429 0, /*nb_lshift*/
1430 0, /*nb_rshift*/
1431 0, /*nb_and*/
1432 0, /*nb_xor*/
1433 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001434 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001435 (unaryfunc)instance_int, /*nb_int*/
1436 (unaryfunc)instance_long, /*nb_long*/
1437 (unaryfunc)instance_float, /*nb_float*/
1438 (unaryfunc)instance_oct, /*nb_oct*/
1439 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001440};
1441
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442PyTypeObject PyInstance_Type = {
1443 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001444 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001445 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001447 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001448 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001449 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001450 0, /*tp_getattr*/
1451 0, /*tp_setattr*/
1452 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001453 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001454 &instance_as_number, /*tp_as_number*/
1455 &instance_as_sequence, /*tp_as_sequence*/
1456 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001457 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001458 0, /*tp_call*/
1459 0, /*tp_str*/
1460 (getattrofunc)instance_getattr, /*tp_getattro*/
1461 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001462 0, /* tp_as_buffer */
1463 Py_TPFLAGS_DEFAULT, /*tp_flags */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001464};
1465
1466
Guido van Rossum81daa321993-05-20 14:24:46 +00001467/* Instance method objects are used for two purposes:
1468 (a) as bound instance methods (returned by instancename.methodname)
1469 (b) as unbound methods (returned by ClassName.methodname)
1470 In case (b), im_self is NULL
1471*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001472
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001473static PyMethodObject *free_list;
1474
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475PyObject *
1476PyMethod_New(func, self, class)
1477 PyObject *func;
1478 PyObject *self;
1479 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001480{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001482 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001484 return NULL;
1485 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001486 im = free_list;
1487 if (im != NULL) {
1488 free_list = (PyMethodObject *)(im->im_self);
1489 im->ob_type = &PyMethod_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001490 _Py_NewReference((PyObject *)im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001491 }
1492 else {
1493 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1494 if (im == NULL)
1495 return NULL;
1496 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001498 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001500 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001502 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001503 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001504}
1505
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506PyObject *
1507PyMethod_Function(im)
1508 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001509{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 if (!PyMethod_Check(im)) {
1511 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001512 return NULL;
1513 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001515}
1516
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517PyObject *
1518PyMethod_Self(im)
1519 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 if (!PyMethod_Check(im)) {
1522 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001523 return NULL;
1524 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001526}
1527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528PyObject *
1529PyMethod_Class(im)
1530 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001531{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001532 if (!PyMethod_Check(im)) {
1533 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001534 return NULL;
1535 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001537}
1538
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001539/* Class method methods */
1540
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001542
Guido van Rossume8122f11991-05-05 20:03:07 +00001543static struct memberlist instancemethod_memberlist[] = {
1544 {"im_func", T_OBJECT, OFF(im_func)},
1545 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001546 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001547 /* Dummies that are not handled by getattr() except for __members__ */
1548 {"__doc__", T_INT, 0},
1549 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550 {NULL} /* Sentinel */
1551};
1552
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001554instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 register PyMethodObject *im;
1556 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001557{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001559 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001560 /* Inherit __name__ and __doc__ from the callable object
1561 implementing the method */
1562 if (strcmp(sname, "__name__") == 0 ||
1563 strcmp(sname, "__doc__") == 0)
1564 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 if (PyEval_GetRestricted()) {
1567 PyErr_SetString(PyExc_RuntimeError,
1568 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001569 return NULL;
1570 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572}
1573
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001574static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001575instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001577{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 Py_DECREF(im->im_func);
1579 Py_XDECREF(im->im_self);
1580 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001581 im->im_self = (PyObject *)free_list;
1582 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001583}
1584
Guido van Rossumebc8c511992-09-03 20:39:51 +00001585static int
1586instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001588{
Guido van Rossume9df7271995-04-06 14:46:51 +00001589 if (a->im_self != b->im_self)
1590 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001592}
1593
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001595instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001597{
1598 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001600 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 PyClassObject *class = (PyClassObject *)(a->im_class);
1602 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001603 char *fcname, *icname, *fname;
1604 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001605 if (PyFunction_Check(func)) {
1606 funcname = ((PyFunctionObject *)func)->func_name;
1607 Py_INCREF(funcname);
1608 }
1609 else {
1610 funcname = PyObject_GetAttrString(func,"__name__");
1611 if (funcname == NULL)
1612 PyErr_Clear();
1613 }
1614 if (funcname != NULL && PyString_Check(funcname))
1615 fname = PyString_AS_STRING(funcname);
1616 else
1617 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 if (fclassname != NULL && PyString_Check(fclassname))
1619 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001620 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001621 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001622 if (self == NULL)
1623 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1624 else {
1625 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 if (iclassname != NULL && PyString_Check(iclassname))
1627 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001628 else
1629 icname = "?";
1630 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1631 fcname, fname, icname, (long)self);
1632 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001633 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001635}
1636
Guido van Rossum9bfef441993-03-29 10:43:31 +00001637static long
1638instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001640{
1641 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001642 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001644 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001646 if (x == -1)
1647 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001649 if (y == -1)
1650 return -1;
1651 return x ^ y;
1652}
1653
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654PyTypeObject PyMethod_Type = {
1655 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001656 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001657 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001659 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001660 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001661 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001662 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001663 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001664 (cmpfunc)instancemethod_compare, /*tp_compare*/
1665 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001666 0, /*tp_as_number*/
1667 0, /*tp_as_sequence*/
1668 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001669 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001670 0, /*tp_call*/
1671 0, /*tp_str*/
1672 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1673 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001674};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001675
1676/* Clear out the free list */
1677
1678void
1679PyMethod_Fini()
1680{
1681 while (free_list) {
1682 PyMethodObject *v = free_list;
1683 free_list = (PyMethodObject *)(v->im_self);
1684 PyMem_DEL(v);
1685 }
1686}