blob: 305c07e494432f8c9a74c6700315463fbc96b9dd [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;
507 _Py_NewReference(inst);
508 _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 Rossumc0b618a1997-05-02 03:12:38 +0000559 _Py_ForgetReference(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 Rossumc0b618a1997-05-02 03:12:38 +00001068static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001069 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001070 0, /*sq_concat*/
1071 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001072 (intargfunc)instance_item, /*sq_item*/
1073 (intintargfunc)instance_slice, /*sq_slice*/
1074 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1075 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076};
1077
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyInstanceObject *self;
1081 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001082{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001084
1085 if ((func = instance_getattr(self, methodname)) == NULL)
1086 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 res = PyEval_CallObject(func, (PyObject *)NULL);
1088 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 return res;
1090}
1091
Guido van Rossum03093a21994-09-28 15:51:32 +00001092
1093/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1095 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001096
1097
1098/* Implement a binary operator involving at least one class instance. */
1099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100PyObject *
1101PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1102 PyObject *v;
1103 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001104 char *opname;
1105 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001107{
1108 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001110 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001111 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001112 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001113 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001114 /* Sigh -- special case for comnparisons */
1115 if (strcmp(opname, "__cmp__") == 0) {
1116 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1117 return PyInt_FromLong(c);
1118 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001119 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001121 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001122}
1123
Guido van Rossum03093a21994-09-28 15:51:32 +00001124
1125/* Try one half of a binary operator involving a class instance.
1126 Return value:
1127 -1 if an exception is to be reported right away
1128 0 if we have a valid result
1129 1 if we could try another operation
1130*/
1131
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001133
Guido van Rossum03093a21994-09-28 15:51:32 +00001134static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001135halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 PyObject *v;
1137 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001138 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 PyObject **r_result;
1140 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001141 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 PyObject *func;
1144 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001145 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 PyObject *coerced = NULL;
1147 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001148
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001150 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001151 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001152 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001153 if (coerce_obj == NULL)
1154 return -1;
1155 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001156 coercefunc = PyObject_GetAttr(v, coerce_obj);
1157 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001159 }
1160 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001161 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001162 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001163 return -1;
1164 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001165 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001167 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001168 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001169 return -1;
1170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 if (coerced == Py_None) {
1172 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001173 return 1;
1174 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1176 Py_DECREF(coerced);
1177 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001178 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001179 return -1;
1180 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 v1 = PyTuple_GetItem(coerced, 0);
1182 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001183 if (v1 != v) {
1184 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001186 if (swapped)
1187 *r_result = (*thisfunc)(w, v);
1188 else
1189 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001191 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001192 }
1193 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001194 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001196 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001198 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001199 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001201 return 1;
1202 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001204 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 Py_DECREF(func);
1206 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 return -1;
1208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 *r_result = PyEval_CallObject(func, args);
1210 Py_DECREF(args);
1211 Py_DECREF(func);
1212 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001213 return *r_result == NULL ? -1 : 0;
1214}
1215
Guido van Rossum879c5811995-01-10 15:24:06 +00001216static int
1217instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 PyObject **pv;
1219 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001220{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 PyObject *v = *pv;
1222 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001223 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 PyObject *args;
1225 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001226
Guido van Rossum2878a691996-08-09 20:53:24 +00001227 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001228 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001229 if (coerce_obj == NULL)
1230 return -1;
1231 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001232 coercefunc = PyObject_GetAttr(v, coerce_obj);
1233 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001234 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyErr_Clear();
1236 Py_INCREF(v);
1237 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001238 return 0;
1239 }
1240 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001242 if (args == NULL) {
1243 return -1;
1244 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001245 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001247 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001248 if (coerced == NULL) {
1249 /* __coerce__ call raised an exception */
1250 return -1;
1251 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001253 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001255 return 1;
1256 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001258 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 Py_DECREF(coerced);
1260 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001261 "coercion should return None or 2-tuple");
1262 return -1;
1263 }
1264 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 *pv = PyTuple_GetItem(coerced, 0);
1266 *pw = PyTuple_GetItem(coerced, 1);
1267 Py_INCREF(*pv);
1268 Py_INCREF(*pw);
1269 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001270 return 0;
1271}
1272
Guido van Rossum03093a21994-09-28 15:51:32 +00001273
Guido van Rossum04691fc1992-08-12 15:35:34 +00001274#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275static PyObject *funcname(self) PyInstanceObject *self; { \
1276 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001277 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001278 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001279}
1280
Guido van Rossum04691fc1992-08-12 15:35:34 +00001281UNARY(instance_neg, "__neg__")
1282UNARY(instance_pos, "__pos__")
1283UNARY(instance_abs, "__abs__")
1284
Guido van Rossum9bfef441993-03-29 10:43:31 +00001285static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001286instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001288{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001290 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001292
Guido van Rossum2878a691996-08-09 20:53:24 +00001293 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001294 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001295 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001297 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001298 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001299 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001301 /* Fall back to the default behavior:
1302 all instances are nonzero */
1303 return 1;
1304 }
1305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 res = PyEval_CallObject(func, (PyObject *)NULL);
1307 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001308 if (res == NULL)
1309 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 if (!PyInt_Check(res)) {
1311 Py_DECREF(res);
1312 PyErr_SetString(PyExc_TypeError,
1313 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001314 return -1;
1315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 outcome = PyInt_AsLong(res);
1317 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 PyErr_SetString(PyExc_ValueError,
1320 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321 return -1;
1322 }
1323 return outcome > 0;
1324}
1325
1326UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001327UNARY(instance_int, "__int__")
1328UNARY(instance_long, "__long__")
1329UNARY(instance_float, "__float__")
1330UNARY(instance_oct, "__oct__")
1331UNARY(instance_hex, "__hex__")
1332
Guido van Rossum03093a21994-09-28 15:51:32 +00001333/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001335instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 PyObject *v;
1337 PyObject *w;
1338 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001339{
1340 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyObject *func;
1342 PyObject *args;
1343 PyObject *result;
1344 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001345
1346 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001347 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001349 if (func == NULL)
1350 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001352 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001354 return NULL;
1355 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 result = PyEval_CallObject(func, args);
1357 Py_DECREF(func);
1358 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001359 return result;
1360}
1361
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001363 0, /*nb_add*/
1364 0, /*nb_subtract*/
1365 0, /*nb_multiply*/
1366 0, /*nb_divide*/
1367 0, /*nb_remainder*/
1368 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001369 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001370 (unaryfunc)instance_neg, /*nb_negative*/
1371 (unaryfunc)instance_pos, /*nb_positive*/
1372 (unaryfunc)instance_abs, /*nb_absolute*/
1373 (inquiry)instance_nonzero, /*nb_nonzero*/
1374 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001375 0, /*nb_lshift*/
1376 0, /*nb_rshift*/
1377 0, /*nb_and*/
1378 0, /*nb_xor*/
1379 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001380 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001381 (unaryfunc)instance_int, /*nb_int*/
1382 (unaryfunc)instance_long, /*nb_long*/
1383 (unaryfunc)instance_float, /*nb_float*/
1384 (unaryfunc)instance_oct, /*nb_oct*/
1385 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001386};
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388PyTypeObject PyInstance_Type = {
1389 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001391 "instance",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 sizeof(PyInstanceObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001393 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001394 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001395 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001396 0, /*tp_getattr*/
1397 0, /*tp_setattr*/
1398 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001399 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001400 &instance_as_number, /*tp_as_number*/
1401 &instance_as_sequence, /*tp_as_sequence*/
1402 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001404 0, /*tp_call*/
1405 0, /*tp_str*/
1406 (getattrofunc)instance_getattr, /*tp_getattro*/
1407 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001408};
1409
1410
Guido van Rossum81daa321993-05-20 14:24:46 +00001411/* Instance method objects are used for two purposes:
1412 (a) as bound instance methods (returned by instancename.methodname)
1413 (b) as unbound methods (returned by ClassName.methodname)
1414 In case (b), im_self is NULL
1415*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001416
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001417static PyMethodObject *free_list;
1418
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419PyObject *
1420PyMethod_New(func, self, class)
1421 PyObject *func;
1422 PyObject *self;
1423 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001424{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001426 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001428 return NULL;
1429 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001430 im = free_list;
1431 if (im != NULL) {
1432 free_list = (PyMethodObject *)(im->im_self);
1433 im->ob_type = &PyMethod_Type;
1434 _Py_NewReference(im);
1435 }
1436 else {
1437 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1438 if (im == NULL)
1439 return NULL;
1440 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001442 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001444 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001446 im->im_class = class;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001448}
1449
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450PyObject *
1451PyMethod_Function(im)
1452 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001453{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 if (!PyMethod_Check(im)) {
1455 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001456 return NULL;
1457 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459}
1460
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461PyObject *
1462PyMethod_Self(im)
1463 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001464{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 if (!PyMethod_Check(im)) {
1466 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001467 return NULL;
1468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001470}
1471
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472PyObject *
1473PyMethod_Class(im)
1474 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001475{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 if (!PyMethod_Check(im)) {
1477 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001478 return NULL;
1479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001481}
1482
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001483/* Class method methods */
1484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001486
Guido van Rossume8122f11991-05-05 20:03:07 +00001487static struct memberlist instancemethod_memberlist[] = {
1488 {"im_func", T_OBJECT, OFF(im_func)},
1489 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001490 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001491 /* Dummies that are not handled by getattr() except for __members__ */
1492 {"__doc__", T_INT, 0},
1493 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494 {NULL} /* Sentinel */
1495};
1496
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001498instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 register PyMethodObject *im;
1500 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001501{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001503 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001504 /* Inherit __name__ and __doc__ from the callable object
1505 implementing the method */
1506 if (strcmp(sname, "__name__") == 0 ||
1507 strcmp(sname, "__doc__") == 0)
1508 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001509 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 if (PyEval_GetRestricted()) {
1511 PyErr_SetString(PyExc_RuntimeError,
1512 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001513 return NULL;
1514 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516}
1517
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001518static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001519instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001521{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522 Py_DECREF(im->im_func);
1523 Py_XDECREF(im->im_self);
1524 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001525 im->im_self = (PyObject *)free_list;
1526 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001527}
1528
Guido van Rossumebc8c511992-09-03 20:39:51 +00001529static int
1530instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001532{
Guido van Rossume9df7271995-04-06 14:46:51 +00001533 if (a->im_self != b->im_self)
1534 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001535 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001536}
1537
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001538static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001539instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001541{
1542 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001544 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 PyClassObject *class = (PyClassObject *)(a->im_class);
1546 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001547 char *fcname, *icname, *fname;
1548 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001549 if (PyFunction_Check(func)) {
1550 funcname = ((PyFunctionObject *)func)->func_name;
1551 Py_INCREF(funcname);
1552 }
1553 else {
1554 funcname = PyObject_GetAttrString(func,"__name__");
1555 if (funcname == NULL)
1556 PyErr_Clear();
1557 }
1558 if (funcname != NULL && PyString_Check(funcname))
1559 fname = PyString_AS_STRING(funcname);
1560 else
1561 fname = "?";
1562 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 if (fclassname != NULL && PyString_Check(fclassname))
1564 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001565 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001566 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001567 if (self == NULL)
1568 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1569 else {
1570 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 if (iclassname != NULL && PyString_Check(iclassname))
1572 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001573 else
1574 icname = "?";
1575 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1576 fcname, fname, icname, (long)self);
1577 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001579}
1580
Guido van Rossum9bfef441993-03-29 10:43:31 +00001581static long
1582instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001584{
1585 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001586 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001588 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001590 if (x == -1)
1591 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001593 if (y == -1)
1594 return -1;
1595 return x ^ y;
1596}
1597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598PyTypeObject PyMethod_Type = {
1599 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001600 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001601 "instance method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 sizeof(PyMethodObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001603 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001604 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001605 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001606 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001607 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001608 (cmpfunc)instancemethod_compare, /*tp_compare*/
1609 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001610 0, /*tp_as_number*/
1611 0, /*tp_as_sequence*/
1612 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001613 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001614 0, /*tp_call*/
1615 0, /*tp_str*/
1616 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1617 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001618};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001619
1620/* Clear out the free list */
1621
1622void
1623PyMethod_Fini()
1624{
1625 while (free_list) {
1626 PyMethodObject *v = free_list;
1627 free_list = (PyMethodObject *)(v->im_self);
1628 PyMem_DEL(v);
1629 }
1630}