blob: 4fb1167489ed134ead2a22373942a820fa453d22 [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 Rossum5f8b12f2000-04-10 13:03:19 +0000595 PyErr_Format(PyExc_AttributeError,
596 "'%.50s' instance has no attribute '%.400s'",
597 PyString_AsString(inst->in_class->cl_name),
598 sname);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000599 return NULL;
600 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000602 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000603 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 if (PyFunction_Check(v)) {
605 PyObject *w = PyMethod_New(v, (PyObject *)inst,
606 (PyObject *)class);
607 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000608 v = w;
609 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 else if (PyMethod_Check(v)) {
611 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000612 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
614 PyObject *im_func = PyMethod_Function(v);
615 PyObject *w = PyMethod_New(im_func,
616 (PyObject *)inst, im_class);
617 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000618 v = w;
619 }
620 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000621 }
622 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000626instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 register PyInstanceObject *inst;
628 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000631 res = instance_getattr1(inst, name);
632 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 PyObject *args;
634 PyErr_Clear();
635 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000636 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000637 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 res = PyEval_CallObject(func, args);
639 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000640 }
641 return res;
642}
643
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644static int
Guido van Rossume7737541994-09-05 07:31:41 +0000645instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyInstanceObject *inst;
647 PyObject *name;
648 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649{
Guido van Rossum94472a01992-09-04 09:45:18 +0000650 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000652 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000654 "delete non-existing instance attribute");
655 return rv;
656 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659}
660
Guido van Rossume7737541994-09-05 07:31:41 +0000661static int
662instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 PyInstanceObject *inst;
664 PyObject *name;
665 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000666{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000667 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000669 if (sname[0] == '_' && sname[1] == '_') {
670 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000671 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000672 if (strcmp(sname, "__dict__") == 0) {
673 if (PyEval_GetRestricted()) {
674 PyErr_SetString(PyExc_RuntimeError,
675 "__dict__ not accessible in restricted mode");
676 return -1;
677 }
678 if (v == NULL || !PyDict_Check(v)) {
679 PyErr_SetString(PyExc_TypeError,
680 "__dict__ must be set to a dictionary");
681 return -1;
682 }
683 tmp = inst->in_dict;
684 Py_INCREF(v);
685 inst->in_dict = v;
686 Py_DECREF(tmp);
687 return 0;
688 }
689 if (strcmp(sname, "__class__") == 0) {
690 if (PyEval_GetRestricted()) {
691 PyErr_SetString(PyExc_RuntimeError,
692 "__class__ not accessible in restricted mode");
693 return -1;
694 }
695 if (v == NULL || !PyClass_Check(v)) {
696 PyErr_SetString(PyExc_TypeError,
697 "__class__ must be set to a class");
698 return -1;
699 }
700 tmp = (PyObject *)(inst->in_class);
701 Py_INCREF(v);
702 inst->in_class = (PyClassObject *)v;
703 Py_DECREF(tmp);
704 return 0;
705 }
Guido van Rossume7737541994-09-05 07:31:41 +0000706 }
Guido van Rossume7737541994-09-05 07:31:41 +0000707 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000708 if (v == NULL)
709 func = inst->in_class->cl_delattr;
710 else
711 func = inst->in_class->cl_setattr;
712 if (func == NULL)
713 return instance_setattr1(inst, name, v);
714 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000716 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000718 if (args == NULL)
719 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 res = PyEval_CallObject(func, args);
721 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000722 if (res == NULL)
723 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000725 return 0;
726}
727
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000729instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000731{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 PyObject *func;
733 PyObject *res;
734 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735
Guido van Rossum2878a691996-08-09 20:53:24 +0000736 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000737 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000738 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000739 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000740 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000742 PyObject *mod = PyDict_GetItemString(
743 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000744 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 if (classname != NULL && PyString_Check(classname))
746 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000747 else
748 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000750 if (mod == NULL || !PyString_Check(mod))
751 sprintf(buf, "<?.%.100s instance at %lx>",
752 cname, (long)inst);
753 else
754 sprintf(buf, "<%.50s.%.50s instance at %lx>",
755 PyString_AsString(mod),
756 cname, (long)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000758 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 res = PyEval_CallObject(func, (PyObject *)NULL);
760 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000761 return res;
762}
763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000765instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000767{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000769 instance_compare1);
770}
771
Guido van Rossum9bfef441993-03-29 10:43:31 +0000772static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000773instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000775{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000777 long outcome;
778 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000779 if (result == NULL)
780 return -1;
781 if (!PyInt_Check(result)) {
782 Py_DECREF(result);
783 PyErr_SetString(PyExc_TypeError,
784 "comparison did not return an int");
785 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000786 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 outcome = PyInt_AsLong(result);
788 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000789 if (outcome < 0)
790 return -1;
791 else if (outcome > 0)
792 return 1;
793 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794}
795
Guido van Rossum9bfef441993-03-29 10:43:31 +0000796static long
797instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 PyObject *func;
801 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000802 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000804
Guido van Rossum2878a691996-08-09 20:53:24 +0000805 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000806 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000807 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000808 if (func == NULL) {
809 /* If there is no __cmp__ method, we hash on the address.
810 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000812 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000813 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000814 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000815 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 PyErr_Clear();
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000817 outcome = (long)inst;
818 if (outcome == -1)
819 outcome = -2;
820 return outcome;
821 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000823 return -1;
824 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 res = PyEval_CallObject(func, (PyObject *)NULL);
826 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000827 if (res == NULL)
828 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 if (PyInt_Check(res)) {
830 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 if (outcome == -1)
832 outcome = -2;
833 }
834 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 PyErr_SetString(PyExc_TypeError,
836 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000837 outcome = -1;
838 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000840 return outcome;
841}
842
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000844
Guido van Rossum9bfef441993-03-29 10:43:31 +0000845static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000846instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000848{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 PyObject *func;
850 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851 int outcome;
852
Guido van Rossum2878a691996-08-09 20:53:24 +0000853 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000854 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000855 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 if (func == NULL)
857 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 res = PyEval_CallObject(func, (PyObject *)NULL);
859 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000860 if (res == NULL)
861 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 if (PyInt_Check(res)) {
863 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyErr_SetString(PyExc_ValueError,
866 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000867 }
868 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyErr_SetString(PyExc_TypeError,
870 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000871 outcome = -1;
872 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000874 return outcome;
875}
876
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000878instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 PyInstanceObject *inst;
880 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 PyObject *func;
883 PyObject *arg;
884 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000885
Guido van Rossum2878a691996-08-09 20:53:24 +0000886 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000887 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000888 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 if (func == NULL)
890 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 return NULL;
895 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 res = PyEval_CallObject(func, arg);
897 Py_DECREF(func);
898 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899 return res;
900}
901
Guido van Rossum9bfef441993-03-29 10:43:31 +0000902static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 PyInstanceObject*inst;
905 PyObject *key;
906 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 PyObject *func;
909 PyObject *arg;
910 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000911
Guido van Rossum2878a691996-08-09 20:53:24 +0000912 if (value == NULL) {
913 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000914 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000915 func = instance_getattr(inst, delitemstr);
916 }
917 else {
918 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000919 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000920 func = instance_getattr(inst, setitemstr);
921 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 if (func == NULL)
923 return -1;
924 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000930 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 res = PyEval_CallObject(func, arg);
933 Py_DECREF(func);
934 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 if (res == NULL)
936 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 return 0;
939}
940
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000942 (inquiry)instance_length, /*mp_length*/
943 (binaryfunc)instance_subscript, /*mp_subscript*/
944 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945};
946
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950 int i;
951{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000953
Guido van Rossum2878a691996-08-09 20:53:24 +0000954 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000955 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000956 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000957 if (func == NULL)
958 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000962 return NULL;
963 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 res = PyEval_CallObject(func, arg);
965 Py_DECREF(func);
966 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000967 return res;
968}
969
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000971instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000973 int i, j;
974{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyObject *func, *arg, *res;
976 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000977
Guido van Rossum2878a691996-08-09 20:53:24 +0000978 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000979 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000980 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981 if (func == NULL)
982 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986 return NULL;
987 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 res = PyEval_CallObject(func, arg);
989 Py_DECREF(func);
990 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000991 return res;
992}
993
994static int
995instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001001
Guido van Rossum2878a691996-08-09 20:53:24 +00001002 if (item == NULL) {
1003 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001004 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001005 func = instance_getattr(inst, delitemstr);
1006 }
1007 else {
1008 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001009 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001010 func = instance_getattr(inst, setitemstr);
1011 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001012 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001013 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001014 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001018 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001020 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 res = PyEval_CallObject(func, arg);
1023 Py_DECREF(func);
1024 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001025 if (res == NULL)
1026 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001028 return 0;
1029}
1030
1031static int
1032instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001034 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001036{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 PyObject *func, *arg, *res;
1038 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039
Guido van Rossum2878a691996-08-09 20:53:24 +00001040 if (value == NULL) {
1041 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001042 delslicestr =
1043 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001044 func = instance_getattr(inst, delslicestr);
1045 }
1046 else {
1047 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 setslicestr =
1049 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001050 func = instance_getattr(inst, setslicestr);
1051 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001053 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001060 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001061 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 res = PyEval_CallObject(func, arg);
1063 Py_DECREF(func);
1064 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001065 if (res == NULL)
1066 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 return 0;
1069}
1070
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001071static int instance_contains(PyInstanceObject *inst, PyObject *member)
1072{
1073 static PyObject *__contains__;
1074 PyObject *func, *arg, *res;
1075 int ret;
1076
1077 if(__contains__ == NULL) {
1078 __contains__ = PyString_InternFromString("__contains__");
1079 if(__contains__ == NULL)
1080 return -1;
1081 }
1082 func = instance_getattr(inst, __contains__);
1083 if(func == NULL) {
1084 /* fall back to previous behaviour */
1085 int i, cmp_res;
1086
1087 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1088 return -1;
1089 PyErr_Clear();
1090 for(i=0;;i++) {
1091 PyObject *obj = instance_item(inst, i);
1092 int ret = 0;
1093
1094 if(obj == NULL) {
1095 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1096 return -1;
1097 PyErr_Clear();
1098 return 0;
1099 }
1100 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1101 ret = -1;
1102 if(cmp_res == 0)
1103 ret = 1;
1104 Py_DECREF(obj);
1105 if(ret)
1106 return ret;
1107 }
1108 }
1109 arg = Py_BuildValue("(O)", member);
1110 if(arg == NULL) {
1111 Py_DECREF(func);
1112 return -1;
1113 }
1114 res = PyEval_CallObject(func, arg);
1115 Py_DECREF(func);
1116 Py_DECREF(arg);
1117 if(res == NULL)
1118 return -1;
1119 ret = PyObject_IsTrue(res);
1120 Py_DECREF(res);
1121 return ret;
1122}
1123
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001125 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001126 0, /*sq_concat*/
1127 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001128 (intargfunc)instance_item, /*sq_item*/
1129 (intintargfunc)instance_slice, /*sq_slice*/
1130 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1131 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001132 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133};
1134
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 PyInstanceObject *self;
1138 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141
1142 if ((func = instance_getattr(self, methodname)) == NULL)
1143 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 res = PyEval_CallObject(func, (PyObject *)NULL);
1145 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 return res;
1147}
1148
Guido van Rossum03093a21994-09-28 15:51:32 +00001149
1150/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1152 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001153
1154
1155/* Implement a binary operator involving at least one class instance. */
1156
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157PyObject *
1158PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1159 PyObject *v;
1160 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001161 char *opname;
1162 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001164{
1165 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001167 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001168 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001169 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001170 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001171 /* Sigh -- special case for comnparisons */
1172 if (strcmp(opname, "__cmp__") == 0) {
1173 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1174 return PyInt_FromLong(c);
1175 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001176 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001178 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001179}
1180
Guido van Rossum03093a21994-09-28 15:51:32 +00001181
1182/* Try one half of a binary operator involving a class instance.
1183 Return value:
1184 -1 if an exception is to be reported right away
1185 0 if we have a valid result
1186 1 if we could try another operation
1187*/
1188
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001190
Guido van Rossum03093a21994-09-28 15:51:32 +00001191static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001192halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 PyObject *v;
1194 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001195 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 PyObject **r_result;
1197 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001198 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001199{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyObject *func;
1201 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001202 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyObject *coerced = NULL;
1204 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001208 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001209 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001210 if (coerce_obj == NULL)
1211 return -1;
1212 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001213 coercefunc = PyObject_GetAttr(v, coerce_obj);
1214 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001216 }
1217 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001219 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001220 return -1;
1221 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001222 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001224 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001225 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001226 return -1;
1227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 if (coerced == Py_None) {
1229 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001230 return 1;
1231 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1233 Py_DECREF(coerced);
1234 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001235 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001236 return -1;
1237 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 v1 = PyTuple_GetItem(coerced, 0);
1239 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001240 if (v1 != v) {
1241 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001243 if (swapped)
1244 *r_result = (*thisfunc)(w, v);
1245 else
1246 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001248 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001249 }
1250 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001251 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001253 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001255 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001256 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001258 return 1;
1259 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001261 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262 Py_DECREF(func);
1263 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001264 return -1;
1265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 *r_result = PyEval_CallObject(func, args);
1267 Py_DECREF(args);
1268 Py_DECREF(func);
1269 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001270 return *r_result == NULL ? -1 : 0;
1271}
1272
Guido van Rossum879c5811995-01-10 15:24:06 +00001273static int
1274instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 PyObject **pv;
1276 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001277{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyObject *v = *pv;
1279 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001280 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 PyObject *args;
1282 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001283
Guido van Rossum2878a691996-08-09 20:53:24 +00001284 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001285 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001286 if (coerce_obj == NULL)
1287 return -1;
1288 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001289 coercefunc = PyObject_GetAttr(v, coerce_obj);
1290 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001291 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyErr_Clear();
1293 Py_INCREF(v);
1294 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001295 return 0;
1296 }
1297 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001299 if (args == NULL) {
1300 return -1;
1301 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001302 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001304 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001305 if (coerced == NULL) {
1306 /* __coerce__ call raised an exception */
1307 return -1;
1308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001310 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001312 return 1;
1313 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001315 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 Py_DECREF(coerced);
1317 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001318 "coercion should return None or 2-tuple");
1319 return -1;
1320 }
1321 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 *pv = PyTuple_GetItem(coerced, 0);
1323 *pw = PyTuple_GetItem(coerced, 1);
1324 Py_INCREF(*pv);
1325 Py_INCREF(*pw);
1326 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001327 return 0;
1328}
1329
Guido van Rossum03093a21994-09-28 15:51:32 +00001330
Guido van Rossum04691fc1992-08-12 15:35:34 +00001331#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332static PyObject *funcname(self) PyInstanceObject *self; { \
1333 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001334 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001335 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001336}
1337
Guido van Rossum04691fc1992-08-12 15:35:34 +00001338UNARY(instance_neg, "__neg__")
1339UNARY(instance_pos, "__pos__")
1340UNARY(instance_abs, "__abs__")
1341
Guido van Rossum9bfef441993-03-29 10:43:31 +00001342static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001343instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001345{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001347 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001349
Guido van Rossum2878a691996-08-09 20:53:24 +00001350 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001351 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001352 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001354 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001355 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001356 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001358 /* Fall back to the default behavior:
1359 all instances are nonzero */
1360 return 1;
1361 }
1362 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 res = PyEval_CallObject(func, (PyObject *)NULL);
1364 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001365 if (res == NULL)
1366 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 if (!PyInt_Check(res)) {
1368 Py_DECREF(res);
1369 PyErr_SetString(PyExc_TypeError,
1370 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001371 return -1;
1372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 outcome = PyInt_AsLong(res);
1374 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001375 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 PyErr_SetString(PyExc_ValueError,
1377 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001378 return -1;
1379 }
1380 return outcome > 0;
1381}
1382
1383UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001384UNARY(instance_int, "__int__")
1385UNARY(instance_long, "__long__")
1386UNARY(instance_float, "__float__")
1387UNARY(instance_oct, "__oct__")
1388UNARY(instance_hex, "__hex__")
1389
Guido van Rossum03093a21994-09-28 15:51:32 +00001390/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001392instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 PyObject *v;
1394 PyObject *w;
1395 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001396{
1397 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 PyObject *func;
1399 PyObject *args;
1400 PyObject *result;
1401 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001402
1403 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001404 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001406 if (func == NULL)
1407 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001409 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001411 return NULL;
1412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 result = PyEval_CallObject(func, args);
1414 Py_DECREF(func);
1415 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001416 return result;
1417}
1418
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001420 0, /*nb_add*/
1421 0, /*nb_subtract*/
1422 0, /*nb_multiply*/
1423 0, /*nb_divide*/
1424 0, /*nb_remainder*/
1425 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001426 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001427 (unaryfunc)instance_neg, /*nb_negative*/
1428 (unaryfunc)instance_pos, /*nb_positive*/
1429 (unaryfunc)instance_abs, /*nb_absolute*/
1430 (inquiry)instance_nonzero, /*nb_nonzero*/
1431 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001432 0, /*nb_lshift*/
1433 0, /*nb_rshift*/
1434 0, /*nb_and*/
1435 0, /*nb_xor*/
1436 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001437 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001438 (unaryfunc)instance_int, /*nb_int*/
1439 (unaryfunc)instance_long, /*nb_long*/
1440 (unaryfunc)instance_float, /*nb_float*/
1441 (unaryfunc)instance_oct, /*nb_oct*/
1442 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001443};
1444
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445PyTypeObject PyInstance_Type = {
1446 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001447 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001448 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001450 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001451 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001452 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001453 0, /*tp_getattr*/
1454 0, /*tp_setattr*/
1455 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001456 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001457 &instance_as_number, /*tp_as_number*/
1458 &instance_as_sequence, /*tp_as_sequence*/
1459 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001460 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001461 0, /*tp_call*/
1462 0, /*tp_str*/
1463 (getattrofunc)instance_getattr, /*tp_getattro*/
1464 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001465 0, /* tp_as_buffer */
1466 Py_TPFLAGS_DEFAULT, /*tp_flags */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001467};
1468
1469
Guido van Rossum81daa321993-05-20 14:24:46 +00001470/* Instance method objects are used for two purposes:
1471 (a) as bound instance methods (returned by instancename.methodname)
1472 (b) as unbound methods (returned by ClassName.methodname)
1473 In case (b), im_self is NULL
1474*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001475
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001476static PyMethodObject *free_list;
1477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478PyObject *
1479PyMethod_New(func, self, class)
1480 PyObject *func;
1481 PyObject *self;
1482 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001483{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001485 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001487 return NULL;
1488 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001489 im = free_list;
1490 if (im != NULL) {
1491 free_list = (PyMethodObject *)(im->im_self);
1492 im->ob_type = &PyMethod_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001493 _Py_NewReference((PyObject *)im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001494 }
1495 else {
1496 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1497 if (im == NULL)
1498 return NULL;
1499 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001501 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001503 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001505 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509PyObject *
1510PyMethod_Function(im)
1511 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001512{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 if (!PyMethod_Check(im)) {
1514 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001515 return NULL;
1516 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001518}
1519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520PyObject *
1521PyMethod_Self(im)
1522 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001523{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 if (!PyMethod_Check(im)) {
1525 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001526 return NULL;
1527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001529}
1530
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531PyObject *
1532PyMethod_Class(im)
1533 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001534{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001535 if (!PyMethod_Check(im)) {
1536 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001537 return NULL;
1538 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001540}
1541
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001542/* Class method methods */
1543
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001544#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545
Guido van Rossume8122f11991-05-05 20:03:07 +00001546static struct memberlist instancemethod_memberlist[] = {
1547 {"im_func", T_OBJECT, OFF(im_func)},
1548 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001549 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001550 /* Dummies that are not handled by getattr() except for __members__ */
1551 {"__doc__", T_INT, 0},
1552 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553 {NULL} /* Sentinel */
1554};
1555
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001557instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 register PyMethodObject *im;
1559 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001560{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001562 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001563 /* Inherit __name__ and __doc__ from the callable object
1564 implementing the method */
1565 if (strcmp(sname, "__name__") == 0 ||
1566 strcmp(sname, "__doc__") == 0)
1567 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 if (PyEval_GetRestricted()) {
1570 PyErr_SetString(PyExc_RuntimeError,
1571 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001572 return NULL;
1573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575}
1576
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001577static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001578instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001580{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581 Py_DECREF(im->im_func);
1582 Py_XDECREF(im->im_self);
1583 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001584 im->im_self = (PyObject *)free_list;
1585 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001586}
1587
Guido van Rossumebc8c511992-09-03 20:39:51 +00001588static int
1589instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001591{
Guido van Rossume9df7271995-04-06 14:46:51 +00001592 if (a->im_self != b->im_self)
1593 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001595}
1596
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001598instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001600{
1601 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001603 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604 PyClassObject *class = (PyClassObject *)(a->im_class);
1605 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001606 char *fcname, *icname, *fname;
1607 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001608 if (PyFunction_Check(func)) {
1609 funcname = ((PyFunctionObject *)func)->func_name;
1610 Py_INCREF(funcname);
1611 }
1612 else {
1613 funcname = PyObject_GetAttrString(func,"__name__");
1614 if (funcname == NULL)
1615 PyErr_Clear();
1616 }
1617 if (funcname != NULL && PyString_Check(funcname))
1618 fname = PyString_AS_STRING(funcname);
1619 else
1620 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 if (fclassname != NULL && PyString_Check(fclassname))
1622 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001623 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001624 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001625 if (self == NULL)
1626 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1627 else {
1628 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 if (iclassname != NULL && PyString_Check(iclassname))
1630 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001631 else
1632 icname = "?";
1633 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1634 fcname, fname, icname, (long)self);
1635 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001636 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001638}
1639
Guido van Rossum9bfef441993-03-29 10:43:31 +00001640static long
1641instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001643{
1644 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001645 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001647 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001649 if (x == -1)
1650 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001652 if (y == -1)
1653 return -1;
1654 return x ^ y;
1655}
1656
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657PyTypeObject PyMethod_Type = {
1658 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001659 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001660 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001661 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001662 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001663 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001664 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001665 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001666 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001667 (cmpfunc)instancemethod_compare, /*tp_compare*/
1668 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001669 0, /*tp_as_number*/
1670 0, /*tp_as_sequence*/
1671 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001672 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001673 0, /*tp_call*/
1674 0, /*tp_str*/
1675 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1676 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001677};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001678
1679/* Clear out the free list */
1680
1681void
1682PyMethod_Fini()
1683{
1684 while (free_list) {
1685 PyMethodObject *v = free_list;
1686 free_list = (PyMethodObject *)(v->im_self);
1687 PyMem_DEL(v);
1688 }
1689}