blob: 17b7bf464ae6cf9f9920e47f43bd60b77ea9c336 [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 *));
Jeremy Hylton9e392e22000-04-26 20:39:20 +000041static PyObject *instance_getattr2 Py_PROTO((PyInstanceObject *, PyObject *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042
Guido van Rossuma63eff61998-05-29 21:37:21 +000043static PyObject *getattrstr, *setattrstr, *delattrstr;
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
46PyClass_New(bases, dict, name)
47 PyObject *bases; /* NULL or tuple of classobjects! */
48 PyObject *dict;
Guido van Rossum04d73c41997-10-07 14:54:11 +000049 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 PyClassObject *op, *dummy;
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000052 static PyObject *docstr, *modstr, *namestr;
Guido van Rossum019f4241996-08-21 14:54:28 +000053 if (docstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +000054 docstr= PyString_InternFromString("__doc__");
Guido van Rossum019f4241996-08-21 14:54:28 +000055 if (docstr == NULL)
56 return NULL;
57 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000058 if (modstr == NULL) {
59 modstr= PyString_InternFromString("__module__");
60 if (modstr == NULL)
61 return NULL;
62 }
63 if (namestr == NULL) {
64 namestr= PyString_InternFromString("__name__");
65 if (namestr == NULL)
66 return NULL;
67 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000068 if (name == NULL || !PyString_Check(name)) {
69 PyErr_SetString(PyExc_SystemError,
70 "PyClass_New: name must be a string");
71 return NULL;
72 }
73 if (dict == NULL || !PyDict_Check(dict)) {
74 PyErr_SetString(PyExc_SystemError,
75 "PyClass_New: dict must be a dictionary");
76 return NULL;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 if (PyDict_GetItem(dict, docstr) == NULL) {
79 if (PyDict_SetItem(dict, docstr, Py_None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000080 return NULL;
81 }
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000082 if (PyDict_GetItem(dict, modstr) == NULL) {
83 PyObject *globals = PyEval_GetGlobals();
84 if (globals != NULL) {
Guido van Rossum04d73c41997-10-07 14:54:11 +000085 PyObject *modname = PyDict_GetItem(globals, namestr);
86 if (modname != NULL) {
87 if (PyDict_SetItem(dict, modstr, modname) < 0)
Guido van Rossum7cc56eb1997-09-12 20:04:46 +000088 return NULL;
89 }
90 }
91 }
Guido van Rossume2966a61991-12-10 13:53:23 +000092 if (bases == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 bases = PyTuple_New(0);
Guido van Rossume2966a61991-12-10 13:53:23 +000094 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000095 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000096 }
Guido van Rossum04d73c41997-10-07 14:54:11 +000097 else {
98 int i;
99 if (!PyTuple_Check(bases)) {
100 PyErr_SetString(PyExc_SystemError,
101 "PyClass_New: bases must be a tuple");
102 return NULL;
103 }
104 i = PyTuple_Size(bases);
105 while (--i >= 0) {
106 if (!PyClass_Check(PyTuple_GetItem(bases, i))) {
107 PyErr_SetString(PyExc_SystemError,
108 "PyClass_New: base must be a class");
109 return NULL;
110 }
111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 Py_INCREF(bases);
Guido van Rossum04d73c41997-10-07 14:54:11 +0000113 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 op = PyObject_NEW(PyClassObject, &PyClass_Type);
Guido van Rossume2966a61991-12-10 13:53:23 +0000115 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +0000118 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 op->cl_bases = bases;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 Py_INCREF(dict);
Guido van Rossum81daa321993-05-20 14:24:46 +0000121 op->cl_dict = dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XINCREF(name);
Guido van Rossum94308391991-10-20 20:11:48 +0000123 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +0000124 if (getattrstr == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +0000125 getattrstr = PyString_InternFromString("__getattr__");
126 setattrstr = PyString_InternFromString("__setattr__");
127 delattrstr = PyString_InternFromString("__delattr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000128 }
129 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
130 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
131 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 Py_XINCREF(op->cl_getattr);
133 Py_XINCREF(op->cl_setattr);
134 Py_XINCREF(op->cl_delattr);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000135 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137}
138
139/* Class methods */
140
141static void
142class_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 PyClassObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000145 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 Py_DECREF(op->cl_bases);
147 Py_DECREF(op->cl_dict);
148 Py_XDECREF(op->cl_name);
Guido van Rossum152d8171998-08-04 14:59:16 +0000149 Py_XDECREF(op->cl_getattr);
150 Py_XDECREF(op->cl_setattr);
151 Py_XDECREF(op->cl_delattr);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000152 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153}
154
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155static PyObject *
Guido van Rossum81daa321993-05-20 14:24:46 +0000156class_lookup(cp, name, pclass)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 PyClassObject *cp;
158 PyObject *name;
159 PyClassObject **pclass;
Guido van Rossum81daa321993-05-20 14:24:46 +0000160{
161 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 PyObject *value = PyDict_GetItem(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000163 if (value != NULL) {
164 *pclass = cp;
165 return value;
166 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000168 for (i = 0; i < n; i++) {
Guido van Rossum7cc56eb1997-09-12 20:04:46 +0000169 /* XXX What if one of the bases is not a class? */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 PyObject *v = class_lookup(
171 (PyClassObject *)
172 PyTuple_GetItem(cp->cl_bases, i), name, pclass);
Guido van Rossum81daa321993-05-20 14:24:46 +0000173 if (v != NULL)
174 return v;
175 }
176 return NULL;
177}
178
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180class_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 register PyClassObject *op;
182 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 register PyObject *v;
185 register char *sname = PyString_AsString(name);
186 PyClassObject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000187 if (sname[0] == '_' && sname[1] == '_') {
188 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 if (PyEval_GetRestricted()) {
190 PyErr_SetString(PyExc_RuntimeError,
191 "class.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000192 return NULL;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 Py_INCREF(op->cl_dict);
Guido van Rossum10393b11995-01-10 10:39:49 +0000195 return op->cl_dict;
196 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000197 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 Py_INCREF(op->cl_bases);
Guido van Rossum10393b11995-01-10 10:39:49 +0000199 return op->cl_bases;
200 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000201 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000202 if (op->cl_name == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 v = Py_None;
Guido van Rossum10393b11995-01-10 10:39:49 +0000204 else
205 v = op->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 Py_INCREF(v);
Guido van Rossum10393b11995-01-10 10:39:49 +0000207 return v;
208 }
Guido van Rossum94308391991-10-20 20:11:48 +0000209 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000210 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000211 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 PyErr_SetObject(PyExc_AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000213 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000215 Py_INCREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 if (PyFunction_Check(v)) {
217 PyObject *w = PyMethod_New(v, (PyObject *)NULL,
218 (PyObject *)class);
219 Py_DECREF(v);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000220 v = w;
221 }
222 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223}
224
Guido van Rossuma63eff61998-05-29 21:37:21 +0000225static void
226set_slot(slot, v)
227 PyObject **slot;
228 PyObject *v;
229{
230 PyObject *temp = *slot;
231 Py_XINCREF(v);
232 *slot = v;
233 Py_XDECREF(temp);
234}
235
Guido van Rossum7ba30431998-07-08 13:34:48 +0000236static void
237set_attr_slots(c)
238 PyClassObject *c;
239{
240 PyClassObject *dummy;
241
242 set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
243 set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
244 set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
245}
246
Guido van Rossuma63eff61998-05-29 21:37:21 +0000247static char *
248set_dict(c, v)
249 PyClassObject *c;
250 PyObject *v;
251{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000252 if (v == NULL || !PyDict_Check(v))
253 return "__dict__ must be a dictionary object";
254 set_slot(&c->cl_dict, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000255 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000256 return "";
257}
258
259static char *
260set_bases(c, v)
261 PyClassObject *c;
262 PyObject *v;
263{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000264 int i, n;
265
266 if (v == NULL || !PyTuple_Check(v))
267 return "__bases__ must be a tuple object";
268 n = PyTuple_Size(v);
269 for (i = 0; i < n; i++) {
270 PyObject *x = PyTuple_GET_ITEM(v, i);
271 if (!PyClass_Check(x))
272 return "__bases__ items must be classes";
273 if (PyClass_IsSubclass(x, (PyObject *)c))
274 return "a __bases__ item causes an inheritance cycle";
275 }
276 set_slot(&c->cl_bases, v);
Guido van Rossum7ba30431998-07-08 13:34:48 +0000277 set_attr_slots(c);
Guido van Rossuma63eff61998-05-29 21:37:21 +0000278 return "";
279}
280
281static char *
282set_name(c, v)
283 PyClassObject *c;
284 PyObject *v;
285{
Guido van Rossuma63eff61998-05-29 21:37:21 +0000286 if (v == NULL || !PyString_Check(v))
287 return "__name__ must be a string object";
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000288 if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
Guido van Rossuma63eff61998-05-29 21:37:21 +0000289 return "__name__ must not contain null bytes";
290 set_slot(&c->cl_name, v);
291 return "";
292}
293
Guido van Rossum94308391991-10-20 20:11:48 +0000294static int
295class_setattr(op, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 PyClassObject *op;
297 PyObject *name;
298 PyObject *v;
Guido van Rossum94308391991-10-20 20:11:48 +0000299{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000300 char *sname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 if (PyEval_GetRestricted()) {
302 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000303 "classes are read-only in restricted mode");
304 return -1;
305 }
Guido van Rossumb2173c31997-08-25 21:23:56 +0000306 sname = PyString_AsString(name);
307 if (sname[0] == '_' && sname[1] == '_') {
308 int n = PyString_Size(name);
309 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossuma63eff61998-05-29 21:37:21 +0000310 char *err = NULL;
311 if (strcmp(sname, "__dict__") == 0)
312 err = set_dict(op, v);
313 else if (strcmp(sname, "__bases__") == 0)
314 err = set_bases(op, v);
315 else if (strcmp(sname, "__name__") == 0)
316 err = set_name(op, v);
317 else if (strcmp(sname, "__getattr__") == 0)
318 set_slot(&op->cl_getattr, v);
319 else if (strcmp(sname, "__setattr__") == 0)
320 set_slot(&op->cl_setattr, v);
321 else if (strcmp(sname, "__delattr__") == 0)
322 set_slot(&op->cl_delattr, v);
323 /* For the last three, we fall through to update the
324 dictionary as well. */
325 if (err != NULL) {
326 if (*err == '\0')
327 return 0;
328 PyErr_SetString(PyExc_TypeError, err);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000329 return -1;
330 }
331 }
332 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000333 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 int rv = PyDict_DelItem(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000335 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000337 "delete non-existing class attribute");
338 return rv;
339 }
Guido van Rossum94308391991-10-20 20:11:48 +0000340 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 return PyDict_SetItem(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000342}
343
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +0000345class_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 PyClassObject *op;
Guido van Rossum25831651993-05-19 14:50:45 +0000347{
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000348 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000349 char buf[140];
350 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (op->cl_name == NULL || !PyString_Check(op->cl_name))
Guido van Rossum25831651993-05-19 14:50:45 +0000352 name = "?";
353 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 name = PyString_AsString(op->cl_name);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000355 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000356 sprintf(buf, "<class ?.%.100s at %p>", name, op);
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000357 else
Fred Drakea44d3532000-06-30 15:01:00 +0000358 sprintf(buf, "<class %.50s.%.50s at %p>",
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000359 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000360 name, op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +0000362}
363
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000364static PyObject *
365class_str(op)
366 PyClassObject *op;
367{
368 PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
369 PyObject *name = op->cl_name;
370 PyObject *res;
371 int m, n;
372
373 if (name == NULL || !PyString_Check(name))
374 return class_repr(op);
375 if (mod == NULL || !PyString_Check(mod)) {
376 Py_INCREF(name);
377 return name;
378 }
379 m = PyString_Size(mod);
380 n = PyString_Size(name);
381 res = PyString_FromStringAndSize((char *)NULL, m+1+n);
382 if (res != NULL) {
383 char *s = PyString_AsString(res);
384 memcpy(s, PyString_AsString(mod), m);
385 s += m;
386 *s++ = '.';
387 memcpy(s, PyString_AsString(name), n);
388 }
389 return res;
390}
391
Jeremy Hylton8caad492000-06-23 14:18:11 +0000392static int
393class_traverse(PyClassObject *o, visitproc visit, void *arg)
394{
395 int err;
396 if (o->cl_bases) {
397 err = visit(o->cl_bases, arg);
398 if (err)
399 return err;
400 }
401 if (o->cl_dict) {
402 err = visit(o->cl_dict, arg);
403 if (err)
404 return err;
405 }
406 if (o->cl_name) {
407 err = visit(o->cl_name, arg);
408 if (err)
409 return err;
410 }
411 if (o->cl_getattr) {
412 err = visit(o->cl_getattr, arg);
413 if (err)
414 return err;
415 }
416 if (o->cl_setattr) {
417 err = visit(o->cl_setattr, arg);
418 if (err)
419 return err;
420 }
421 if (o->cl_delattr) {
422 err = visit(o->cl_delattr, arg);
423 if (err)
424 return err;
425 }
426 return 0;
427}
428
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429PyTypeObject PyClass_Type = {
430 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431 0,
432 "class",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000433 sizeof(PyClassObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000435 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000437 0, /*tp_getattr*/
438 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000440 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441 0, /*tp_as_number*/
442 0, /*tp_as_sequence*/
443 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000444 0, /*tp_hash*/
445 0, /*tp_call*/
Guido van Rossum4a2a6211997-10-20 23:26:11 +0000446 (reprfunc)class_str, /*tp_str*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000447 (getattrofunc)class_getattr, /*tp_getattro*/
448 (setattrofunc)class_setattr, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000449 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000450 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000451 0, /* tp_doc */
452 (traverseproc)class_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453};
454
Guido van Rossum81daa321993-05-20 14:24:46 +0000455int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456PyClass_IsSubclass(class, base)
457 PyObject *class;
458 PyObject *base;
Guido van Rossum81daa321993-05-20 14:24:46 +0000459{
460 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 PyClassObject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000462 if (class == base)
463 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 if (class == NULL || !PyClass_Check(class))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000465 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 cp = (PyClassObject *)class;
467 n = PyTuple_Size(cp->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000468 for (i = 0; i < n; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
Guido van Rossum81daa321993-05-20 14:24:46 +0000470 return 1;
471 }
472 return 0;
473}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474
Guido van Rossum81daa321993-05-20 14:24:46 +0000475
476/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478PyObject *
479PyInstance_New(class, arg, kw)
480 PyObject *class;
481 PyObject *arg;
482 PyObject *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 register PyInstanceObject *inst;
485 PyObject *init;
486 static PyObject *initstr;
487 if (!PyClass_Check(class)) {
488 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 return NULL;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
Guido van Rossume8122f11991-05-05 20:03:07 +0000492 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 inst->in_dict = PyDict_New();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000495 PyObject_GC_Init(inst);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000496 if (inst->in_dict == NULL) {
Guido van Rossumd7823f22000-06-28 23:46:07 +0000497 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 return NULL;
499 }
Guido van Rossumd7823f22000-06-28 23:46:07 +0000500 Py_INCREF(class);
501 inst->in_class = (PyClassObject *)class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000502 if (initstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000503 initstr = PyString_InternFromString("__init__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000504 init = instance_getattr2(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000505 if (init == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 if ((arg != NULL && (!PyTuple_Check(arg) ||
507 PyTuple_Size(arg) != 0))
508 || (kw != NULL && (!PyDict_Check(kw) ||
509 PyDict_Size(kw) != 0))) {
510 PyErr_SetString(PyExc_TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000511 "this constructor takes no arguments");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000513 inst = NULL;
514 }
515 }
516 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
518 Py_DECREF(init);
Guido van Rossum25831651993-05-19 14:50:45 +0000519 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000521 inst = NULL;
522 }
523 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 if (res != Py_None) {
525 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +0000526 "__init__() should return None");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 Py_DECREF(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 inst = NULL;
529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 Py_DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000531 }
532 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 return (PyObject *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534}
535
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000536/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537
538static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000539instance_dealloc(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 register PyInstanceObject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyObject *error_type, *error_value, *error_traceback;
543 PyObject *del;
544 static PyObject *delstr;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000545 extern long _Py_RefTotal;
546 PyObject_GC_Fini(inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000547 /* Call the __del__ method if it exists. First temporarily
548 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000549#ifdef Py_TRACE_REFS
550 /* much too complicated if Py_TRACE_REFS defined */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 inst->ob_type = &PyInstance_Type;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000552 _Py_NewReference((PyObject *)inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 _Py_RefTotal--; /* compensate for increment in NEWREF */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000554#ifdef COUNT_ALLOCS
555 inst->ob_type->tp_alloc--; /* ditto */
556#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000557#else /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 Py_INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000559#endif /* !Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000561 if (delstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000562 delstr = PyString_InternFromString("__del__");
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000563 if ((del = instance_getattr2(inst, delstr)) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000565 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyObject *f, *t, *v, *tb;
567 PyErr_Fetch(&t, &v, &tb);
568 f = PySys_GetObject("stderr");
Guido van Rossum22a85e51996-09-11 22:51:57 +0000569 if (f != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyFile_WriteString("Exception ", f);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000571 if (t) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 PyFile_WriteObject(t, f, Py_PRINT_RAW);
573 if (v && v != Py_None) {
574 PyFile_WriteString(": ", f);
575 PyFile_WriteObject(v, f, 0);
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000576 }
577 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyFile_WriteString(" in ", f);
579 PyFile_WriteObject(del, f, 0);
580 PyFile_WriteString(" ignored\n", f);
581 PyErr_Clear(); /* Just in case */
Guido van Rossum22a85e51996-09-11 22:51:57 +0000582 }
Guido van Rossumcbd1e4e1996-12-05 21:52:32 +0000583 Py_XDECREF(t);
584 Py_XDECREF(v);
585 Py_XDECREF(tb);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000586 }
587 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 Py_DECREF(res);
589 Py_DECREF(del);
Guido van Rossum25831651993-05-19 14:50:45 +0000590 }
591 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000593 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000594 if (--inst->ob_refcnt > 0) {
595#ifdef COUNT_ALLOCS
596 inst->ob_type->tp_free--;
597#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000598 PyObject_GC_Init((PyObject *)inst);
Guido van Rossum25831651993-05-19 14:50:45 +0000599 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000600 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000601#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000602#ifdef COUNT_ALLOCS
603 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
604#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000605 _Py_ForgetReference((PyObject *)inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000606#ifndef WITH_CYCLE_GC
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000607 inst->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000608#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000609#endif /* Py_TRACE_REFS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 Py_DECREF(inst->in_class);
611 Py_XDECREF(inst->in_dict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000612 PyObject_DEL(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613}
614
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000616instance_getattr1(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 register PyInstanceObject *inst;
618 PyObject *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 register PyObject *v;
621 register char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000622 if (sname[0] == '_' && sname[1] == '_') {
623 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 if (PyEval_GetRestricted()) {
625 PyErr_SetString(PyExc_RuntimeError,
626 "instance.__dict__ not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +0000627 return NULL;
628 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 Py_INCREF(inst->in_dict);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000630 return inst->in_dict;
631 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000632 if (strcmp(sname, "__class__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633 Py_INCREF(inst->in_class);
634 return (PyObject *)inst->in_class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000635 }
Guido van Rossum94308391991-10-20 20:11:48 +0000636 }
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000637 v = instance_getattr2(inst, name);
638 if (v == NULL) {
639 PyErr_Format(PyExc_AttributeError,"'%.50s' instance has no attribute '%.400s'",
640 PyString_AS_STRING(inst->in_class->cl_name), sname);
641 }
642 return v;
643}
644
645static PyObject *
646instance_getattr2(inst, name)
647 register PyInstanceObject *inst;
648 PyObject *name;
649{
650 register PyObject *v;
651 PyClassObject *class;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000652 class = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 v = PyDict_GetItem(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000654 if (v == NULL) {
655 v = class_lookup(inst->in_class, name, &class);
Jeremy Hylton9e392e22000-04-26 20:39:20 +0000656 if (v == NULL)
657 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000659 Py_INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000660 if (class != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 if (PyFunction_Check(v)) {
662 PyObject *w = PyMethod_New(v, (PyObject *)inst,
663 (PyObject *)class);
664 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000665 v = w;
666 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 else if (PyMethod_Check(v)) {
668 PyObject *im_class = PyMethod_Class(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000669 /* Only if classes are compatible */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 if (PyClass_IsSubclass((PyObject *)class, im_class)) {
671 PyObject *im_func = PyMethod_Function(v);
672 PyObject *w = PyMethod_New(im_func,
673 (PyObject *)inst, im_class);
674 Py_DECREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000675 v = w;
676 }
677 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000678 }
679 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680}
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyObject *
Guido van Rossume7737541994-09-05 07:31:41 +0000683instance_getattr(inst, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 register PyInstanceObject *inst;
685 PyObject *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000686{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 register PyObject *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000688 res = instance_getattr1(inst, name);
689 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 PyObject *args;
691 PyErr_Clear();
692 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000693 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000694 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 res = PyEval_CallObject(func, args);
696 Py_DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000697 }
698 return res;
699}
700
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000701static int
Guido van Rossume7737541994-09-05 07:31:41 +0000702instance_setattr1(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 PyInstanceObject *inst;
704 PyObject *name;
705 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706{
Guido van Rossum94472a01992-09-04 09:45:18 +0000707 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 int rv = PyDict_DelItem(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000709 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000711 "delete non-existing instance attribute");
712 return rv;
713 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000714 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 return PyDict_SetItem(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000716}
717
Guido van Rossume7737541994-09-05 07:31:41 +0000718static int
719instance_setattr(inst, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 PyInstanceObject *inst;
721 PyObject *name;
722 PyObject *v;
Guido van Rossume7737541994-09-05 07:31:41 +0000723{
Guido van Rossumb2173c31997-08-25 21:23:56 +0000724 PyObject *func, *args, *res, *tmp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 char *sname = PyString_AsString(name);
Guido van Rossumb2173c31997-08-25 21:23:56 +0000726 if (sname[0] == '_' && sname[1] == '_') {
727 int n = PyString_Size(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000728 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossumb2173c31997-08-25 21:23:56 +0000729 if (strcmp(sname, "__dict__") == 0) {
730 if (PyEval_GetRestricted()) {
731 PyErr_SetString(PyExc_RuntimeError,
732 "__dict__ not accessible in restricted mode");
733 return -1;
734 }
735 if (v == NULL || !PyDict_Check(v)) {
736 PyErr_SetString(PyExc_TypeError,
737 "__dict__ must be set to a dictionary");
738 return -1;
739 }
740 tmp = inst->in_dict;
741 Py_INCREF(v);
742 inst->in_dict = v;
743 Py_DECREF(tmp);
744 return 0;
745 }
746 if (strcmp(sname, "__class__") == 0) {
747 if (PyEval_GetRestricted()) {
748 PyErr_SetString(PyExc_RuntimeError,
749 "__class__ not accessible in restricted mode");
750 return -1;
751 }
752 if (v == NULL || !PyClass_Check(v)) {
753 PyErr_SetString(PyExc_TypeError,
754 "__class__ must be set to a class");
755 return -1;
756 }
757 tmp = (PyObject *)(inst->in_class);
758 Py_INCREF(v);
759 inst->in_class = (PyClassObject *)v;
760 Py_DECREF(tmp);
761 return 0;
762 }
Guido van Rossume7737541994-09-05 07:31:41 +0000763 }
Guido van Rossume7737541994-09-05 07:31:41 +0000764 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000765 if (v == NULL)
766 func = inst->in_class->cl_delattr;
767 else
768 func = inst->in_class->cl_setattr;
769 if (func == NULL)
770 return instance_setattr1(inst, name, v);
771 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 args = Py_BuildValue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000773 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 args = Py_BuildValue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000775 if (args == NULL)
776 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 res = PyEval_CallObject(func, args);
778 Py_DECREF(args);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000779 if (res == NULL)
780 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 Py_DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000782 return 0;
783}
784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000786instance_repr(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 PyObject *func;
790 PyObject *res;
791 static PyObject *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000792
Guido van Rossum2878a691996-08-09 20:53:24 +0000793 if (reprstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000794 reprstr = PyString_InternFromString("__repr__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000795 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000797 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyObject *classname = inst->in_class->cl_name;
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000799 PyObject *mod = PyDict_GetItemString(
800 inst->in_class->cl_dict, "__module__");
Guido van Rossum25831651993-05-19 14:50:45 +0000801 char *cname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 if (classname != NULL && PyString_Check(classname))
803 cname = PyString_AsString(classname);
Guido van Rossum25831651993-05-19 14:50:45 +0000804 else
805 cname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 PyErr_Clear();
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000807 if (mod == NULL || !PyString_Check(mod))
Fred Drakea44d3532000-06-30 15:01:00 +0000808 sprintf(buf, "<?.%.100s instance at %p>",
809 cname, inst);
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000810 else
Fred Drakea44d3532000-06-30 15:01:00 +0000811 sprintf(buf, "<%.50s.%.50s instance at %p>",
Guido van Rossumb7f1afe1997-12-03 00:06:02 +0000812 PyString_AsString(mod),
Fred Drakea44d3532000-06-30 15:01:00 +0000813 cname, inst);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 return PyString_FromString(buf);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000815 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 res = PyEval_CallObject(func, (PyObject *)NULL);
817 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 return res;
819}
820
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821static PyObject *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000822instance_compare1(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyObject *inst, *other;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000824{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 return PyInstance_DoBinOp(inst, other, "__cmp__", "__rcmp__",
Guido van Rossume7d444f1995-01-07 12:35:18 +0000826 instance_compare1);
827}
828
Guido van Rossum9bfef441993-03-29 10:43:31 +0000829static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000830instance_compare(inst, other)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyObject *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000832{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyObject *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000834 long outcome;
835 result = instance_compare1(inst, other);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000836 if (result == NULL)
837 return -1;
838 if (!PyInt_Check(result)) {
839 Py_DECREF(result);
840 PyErr_SetString(PyExc_TypeError,
841 "comparison did not return an int");
842 return -1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000843 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 outcome = PyInt_AsLong(result);
845 Py_DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000846 if (outcome < 0)
847 return -1;
848 else if (outcome > 0)
849 return 1;
850 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851}
852
Guido van Rossum9bfef441993-03-29 10:43:31 +0000853static long
854instance_hash(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 PyInstanceObject *inst;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000856{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 PyObject *func;
858 PyObject *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000859 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 static PyObject *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000861
Guido van Rossum2878a691996-08-09 20:53:24 +0000862 if (hashstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000863 hashstr = PyString_InternFromString("__hash__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000864 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000865 if (func == NULL) {
866 /* If there is no __cmp__ method, we hash on the address.
867 If a __cmp__ method exists, there must be a __hash__. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000869 if (cmpstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000870 cmpstr = PyString_InternFromString("__cmp__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000871 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000872 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 PyErr_Clear();
Fred Drake13634cf2000-06-29 19:17:04 +0000874 return _Py_HashPointer(inst);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000875 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyErr_SetString(PyExc_TypeError, "unhashable instance");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000877 return -1;
878 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 res = PyEval_CallObject(func, (PyObject *)NULL);
880 Py_DECREF(func);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000881 if (res == NULL)
882 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 if (PyInt_Check(res)) {
884 outcome = PyInt_AsLong(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000885 if (outcome == -1)
886 outcome = -2;
887 }
888 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 PyErr_SetString(PyExc_TypeError,
890 "__hash__() should return an int");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000891 outcome = -1;
892 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 Py_DECREF(res);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000894 return outcome;
895}
896
Jeremy Hylton8caad492000-06-23 14:18:11 +0000897static int
898instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
899{
900 int err;
901 if (o->in_class) {
902 err = visit((PyObject *)(o->in_class), arg);
903 if (err)
904 return err;
905 }
906 if (o->in_dict) {
907 err = visit(o->in_dict, arg);
908 if (err)
909 return err;
910 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +0000911 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000912}
913
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
Guido van Rossum2878a691996-08-09 20:53:24 +0000915
Guido van Rossum9bfef441993-03-29 10:43:31 +0000916static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917instance_length(inst)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 PyObject *func;
921 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 int outcome;
923
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000925 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000926 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 if (func == NULL)
928 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 res = PyEval_CallObject(func, (PyObject *)NULL);
930 Py_DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000931 if (res == NULL)
932 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 if (PyInt_Check(res)) {
934 outcome = PyInt_AsLong(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935 if (outcome < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 PyErr_SetString(PyExc_ValueError,
937 "__len__() should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000938 }
939 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyErr_SetString(PyExc_TypeError,
941 "__len__() should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942 outcome = -1;
943 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945 return outcome;
946}
947
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000949instance_subscript(inst, key)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 PyInstanceObject *inst;
951 PyObject *key;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 PyObject *func;
954 PyObject *arg;
955 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000956
Guido van Rossum2878a691996-08-09 20:53:24 +0000957 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000958 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000959 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960 if (func == NULL)
961 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000963 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000965 return NULL;
966 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 res = PyEval_CallObject(func, arg);
968 Py_DECREF(func);
969 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000970 return res;
971}
972
Guido van Rossum9bfef441993-03-29 10:43:31 +0000973static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000974instance_ass_subscript(inst, key, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyInstanceObject*inst;
976 PyObject *key;
977 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000978{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 PyObject *func;
980 PyObject *arg;
981 PyObject *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982
Guido van Rossum2878a691996-08-09 20:53:24 +0000983 if (value == NULL) {
984 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000985 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000986 func = instance_getattr(inst, delitemstr);
987 }
988 else {
989 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +0000990 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +0000991 func = instance_getattr(inst, setitemstr);
992 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 if (func == NULL)
994 return -1;
995 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 arg = Py_BuildValue("(O)", key);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 arg = Py_BuildValue("(OO)", key, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001001 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001002 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 res = PyEval_CallObject(func, arg);
1004 Py_DECREF(func);
1005 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006 if (res == NULL)
1007 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009 return 0;
1010}
1011
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012static PyMappingMethods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001013 (inquiry)instance_length, /*mp_length*/
1014 (binaryfunc)instance_subscript, /*mp_subscript*/
1015 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001016};
1017
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001019instance_item(inst, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001021 int i;
1022{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024
Guido van Rossum2878a691996-08-09 20:53:24 +00001025 if (getitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001026 getitemstr = PyString_InternFromString("__getitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001027 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001028 if (func == NULL)
1029 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 arg = Py_BuildValue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001031 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033 return NULL;
1034 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 res = PyEval_CallObject(func, arg);
1036 Py_DECREF(func);
1037 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001038 return res;
1039}
1040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001042instance_slice(inst, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001044 int i, j;
1045{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 PyObject *func, *arg, *res;
1047 static PyObject *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048
Guido van Rossum2878a691996-08-09 20:53:24 +00001049 if (getslicestr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001050 getslicestr = PyString_InternFromString("__getslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001051 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 if (func == NULL)
1053 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 arg = Py_BuildValue("(ii)", i, j);
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 Rossum04691fc1992-08-12 15:35:34 +00001057 return NULL;
1058 }
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 return res;
1063}
1064
1065static int
1066instance_ass_item(inst, i, item)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 PyObject *item;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071 PyObject *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072
Guido van Rossum2878a691996-08-09 20:53:24 +00001073 if (item == NULL) {
1074 if (delitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001075 delitemstr = PyString_InternFromString("__delitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001076 func = instance_getattr(inst, delitemstr);
1077 }
1078 else {
1079 if (setitemstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001080 setitemstr = PyString_InternFromString("__setitem__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001081 func = instance_getattr(inst, setitemstr);
1082 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001084 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001085 if (item == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 arg = Py_BuildValue("i", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 arg = Py_BuildValue("(iO)", i, item);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001091 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093 res = PyEval_CallObject(func, arg);
1094 Py_DECREF(func);
1095 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001096 if (res == NULL)
1097 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001099 return 0;
1100}
1101
1102static int
1103instance_ass_slice(inst, i, j, value)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 PyInstanceObject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001105 int i, j;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 PyObject *value;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 PyObject *func, *arg, *res;
1109 static PyObject *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001110
Guido van Rossum2878a691996-08-09 20:53:24 +00001111 if (value == NULL) {
1112 if (delslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 delslicestr =
1114 PyString_InternFromString("__delslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001115 func = instance_getattr(inst, delslicestr);
1116 }
1117 else {
1118 if (setslicestr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119 setslicestr =
1120 PyString_InternFromString("__setslice__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001121 func = instance_getattr(inst, setslicestr);
1122 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +00001124 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125 if (value == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 arg = Py_BuildValue("(ii)", i, j);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128 arg = Py_BuildValue("(iiO)", i, j, value);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001129 if (arg == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 Py_DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +00001131 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001132 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 res = PyEval_CallObject(func, arg);
1134 Py_DECREF(func);
1135 Py_DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001136 if (res == NULL)
1137 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 return 0;
1140}
1141
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001142static int instance_contains(PyInstanceObject *inst, PyObject *member)
1143{
1144 static PyObject *__contains__;
1145 PyObject *func, *arg, *res;
1146 int ret;
1147
1148 if(__contains__ == NULL) {
1149 __contains__ = PyString_InternFromString("__contains__");
1150 if(__contains__ == NULL)
1151 return -1;
1152 }
1153 func = instance_getattr(inst, __contains__);
1154 if(func == NULL) {
1155 /* fall back to previous behaviour */
1156 int i, cmp_res;
1157
1158 if(!PyErr_ExceptionMatches(PyExc_AttributeError))
1159 return -1;
1160 PyErr_Clear();
1161 for(i=0;;i++) {
1162 PyObject *obj = instance_item(inst, i);
1163 int ret = 0;
1164
1165 if(obj == NULL) {
1166 if(!PyErr_ExceptionMatches(PyExc_IndexError))
1167 return -1;
1168 PyErr_Clear();
1169 return 0;
1170 }
1171 if(PyObject_Cmp(obj, member, &cmp_res) == -1)
1172 ret = -1;
1173 if(cmp_res == 0)
1174 ret = 1;
1175 Py_DECREF(obj);
1176 if(ret)
1177 return ret;
1178 }
1179 }
1180 arg = Py_BuildValue("(O)", member);
1181 if(arg == NULL) {
1182 Py_DECREF(func);
1183 return -1;
1184 }
1185 res = PyEval_CallObject(func, arg);
1186 Py_DECREF(func);
1187 Py_DECREF(arg);
1188 if(res == NULL)
1189 return -1;
1190 ret = PyObject_IsTrue(res);
1191 Py_DECREF(res);
1192 return ret;
1193}
1194
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195static PySequenceMethods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001196 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001197 0, /*sq_concat*/
1198 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001199 (intargfunc)instance_item, /*sq_item*/
1200 (intintargfunc)instance_slice, /*sq_slice*/
1201 (intobjargproc)instance_ass_item, /*sq_ass_item*/
1202 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001203 (objobjproc)instance_contains, /* sq_contains */
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204};
1205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206static PyObject *
Guido van Rossum04691fc1992-08-12 15:35:34 +00001207generic_unary_op(self, methodname)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 PyInstanceObject *self;
1209 PyObject *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001210{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001212
1213 if ((func = instance_getattr(self, methodname)) == NULL)
1214 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 res = PyEval_CallObject(func, (PyObject *)NULL);
1216 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001217 return res;
1218}
1219
Guido van Rossum03093a21994-09-28 15:51:32 +00001220
1221/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222static int halfbinop Py_PROTO((PyObject *, PyObject *, char *, PyObject **,
1223 PyObject * (*) Py_PROTO((PyObject *, PyObject *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +00001224
1225
1226/* Implement a binary operator involving at least one class instance. */
1227
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228PyObject *
1229PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
1230 PyObject *v;
1231 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001232 char *opname;
1233 char *ropname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossum03093a21994-09-28 15:51:32 +00001235{
1236 char buf[256];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 PyObject *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001238 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001239 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001240 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +00001241 return result;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001242 /* Sigh -- special case for comnparisons */
1243 if (strcmp(opname, "__cmp__") == 0) {
1244 long c = (v < w) ? -1 : (v > w) ? 1 : 0;
1245 return PyInt_FromLong(c);
1246 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001247 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyErr_SetString(PyExc_TypeError, buf);
Guido van Rossum03093a21994-09-28 15:51:32 +00001249 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001250}
1251
Guido van Rossum03093a21994-09-28 15:51:32 +00001252
1253/* Try one half of a binary operator involving a class instance.
1254 Return value:
1255 -1 if an exception is to be reported right away
1256 0 if we have a valid result
1257 1 if we could try another operation
1258*/
1259
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260static PyObject *coerce_obj;
Guido van Rossum2878a691996-08-09 20:53:24 +00001261
Guido van Rossum03093a21994-09-28 15:51:32 +00001262static int
Guido van Rossume7d444f1995-01-07 12:35:18 +00001263halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 PyObject *v;
1265 PyObject *w;
Guido van Rossum03093a21994-09-28 15:51:32 +00001266 char *opname;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 PyObject **r_result;
1268 PyObject * (*thisfunc) Py_PROTO((PyObject *, PyObject *));
Guido van Rossume7d444f1995-01-07 12:35:18 +00001269 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +00001270{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 PyObject *func;
1272 PyObject *args;
Guido van Rossum3931df91997-11-18 19:23:07 +00001273 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 PyObject *coerced = NULL;
1275 PyObject *v1;
Guido van Rossum03093a21994-09-28 15:51:32 +00001276
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 if (!PyInstance_Check(v))
Guido van Rossum03093a21994-09-28 15:51:32 +00001278 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +00001279 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001280 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001281 if (coerce_obj == NULL)
1282 return -1;
1283 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001284 coercefunc = PyObject_GetAttr(v, coerce_obj);
1285 if (coercefunc == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 PyErr_Clear();
Guido van Rossum03093a21994-09-28 15:51:32 +00001287 }
1288 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001290 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001291 return -1;
1292 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001293 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001295 Py_DECREF(coercefunc);
Guido van Rossum03093a21994-09-28 15:51:32 +00001296 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001297 return -1;
1298 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299 if (coerced == Py_None) {
1300 Py_DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001301 return 1;
1302 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1304 Py_DECREF(coerced);
1305 PyErr_SetString(PyExc_TypeError,
Guido van Rossume7d444f1995-01-07 12:35:18 +00001306 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001307 return -1;
1308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 v1 = PyTuple_GetItem(coerced, 0);
1310 w = PyTuple_GetItem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001311 if (v1 != v) {
1312 v = v1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
Guido van Rossume7d444f1995-01-07 12:35:18 +00001314 if (swapped)
1315 *r_result = (*thisfunc)(w, v);
1316 else
1317 *r_result = (*thisfunc)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 Py_DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001319 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001320 }
1321 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 func = PyObject_GetAttrString(v, opname);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001324 if (func == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 Py_XDECREF(coerced);
Guido van Rossum617c1b01998-05-28 19:50:02 +00001326 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
Guido van Rossume7d444f1995-01-07 12:35:18 +00001327 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 PyErr_Clear();
Guido van Rossume7d444f1995-01-07 12:35:18 +00001329 return 1;
1330 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 args = Py_BuildValue("(O)", w);
Guido van Rossum03093a21994-09-28 15:51:32 +00001332 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 Py_DECREF(func);
1334 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001335 return -1;
1336 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 *r_result = PyEval_CallObject(func, args);
1338 Py_DECREF(args);
1339 Py_DECREF(func);
1340 Py_XDECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001341 return *r_result == NULL ? -1 : 0;
1342}
1343
Guido van Rossum879c5811995-01-10 15:24:06 +00001344static int
1345instance_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 PyObject **pv;
1347 PyObject **pw;
Guido van Rossum879c5811995-01-10 15:24:06 +00001348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 PyObject *v = *pv;
1350 PyObject *w = *pw;
Guido van Rossum3931df91997-11-18 19:23:07 +00001351 PyObject *coercefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 PyObject *args;
1353 PyObject *coerced;
Guido van Rossum879c5811995-01-10 15:24:06 +00001354
Guido van Rossum2878a691996-08-09 20:53:24 +00001355 if (coerce_obj == NULL) {
Guido van Rossuma412d241997-01-18 07:59:12 +00001356 coerce_obj = PyString_InternFromString("__coerce__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001357 if (coerce_obj == NULL)
1358 return -1;
1359 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001360 coercefunc = PyObject_GetAttr(v, coerce_obj);
1361 if (coercefunc == NULL) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001362 /* No __coerce__ method: always OK */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 PyErr_Clear();
1364 Py_INCREF(v);
1365 Py_INCREF(w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001366 return 0;
1367 }
1368 /* Has __coerce__ method: call it */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 args = Py_BuildValue("(O)", w);
Guido van Rossum879c5811995-01-10 15:24:06 +00001370 if (args == NULL) {
1371 return -1;
1372 }
Guido van Rossum3931df91997-11-18 19:23:07 +00001373 coerced = PyEval_CallObject(coercefunc, args);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 Py_DECREF(args);
Guido van Rossum3931df91997-11-18 19:23:07 +00001375 Py_DECREF(coercefunc);
Guido van Rossum879c5811995-01-10 15:24:06 +00001376 if (coerced == NULL) {
1377 /* __coerce__ call raised an exception */
1378 return -1;
1379 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 if (coerced == Py_None) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001381 /* __coerce__ says "I can't do it" */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001383 return 1;
1384 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
Guido van Rossum879c5811995-01-10 15:24:06 +00001386 /* __coerce__ return value is malformed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 Py_DECREF(coerced);
1388 PyErr_SetString(PyExc_TypeError,
Guido van Rossum879c5811995-01-10 15:24:06 +00001389 "coercion should return None or 2-tuple");
1390 return -1;
1391 }
1392 /* __coerce__ returned two new values */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 *pv = PyTuple_GetItem(coerced, 0);
1394 *pw = PyTuple_GetItem(coerced, 1);
1395 Py_INCREF(*pv);
1396 Py_INCREF(*pw);
1397 Py_DECREF(coerced);
Guido van Rossum879c5811995-01-10 15:24:06 +00001398 return 0;
1399}
1400
Guido van Rossum03093a21994-09-28 15:51:32 +00001401
Guido van Rossum04691fc1992-08-12 15:35:34 +00001402#define UNARY(funcname, methodname) \
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403static PyObject *funcname(self) PyInstanceObject *self; { \
1404 static PyObject *o; \
Guido van Rossuma412d241997-01-18 07:59:12 +00001405 if (o == NULL) o = PyString_InternFromString(methodname); \
Guido van Rossum2878a691996-08-09 20:53:24 +00001406 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001407}
1408
Guido van Rossum04691fc1992-08-12 15:35:34 +00001409UNARY(instance_neg, "__neg__")
1410UNARY(instance_pos, "__pos__")
1411UNARY(instance_abs, "__abs__")
1412
Guido van Rossum9bfef441993-03-29 10:43:31 +00001413static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001414instance_nonzero(self)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 PyInstanceObject *self;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001416{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 PyObject *func, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001418 long outcome;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 static PyObject *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001420
Guido van Rossum2878a691996-08-09 20:53:24 +00001421 if (nonzerostr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001422 nonzerostr = PyString_InternFromString("__nonzero__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001423 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 PyErr_Clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001425 if (lenstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001426 lenstr = PyString_InternFromString("__len__");
Guido van Rossum2878a691996-08-09 20:53:24 +00001427 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 PyErr_Clear();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429 /* Fall back to the default behavior:
1430 all instances are nonzero */
1431 return 1;
1432 }
1433 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 res = PyEval_CallObject(func, (PyObject *)NULL);
1435 Py_DECREF(func);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001436 if (res == NULL)
1437 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 if (!PyInt_Check(res)) {
1439 Py_DECREF(res);
1440 PyErr_SetString(PyExc_TypeError,
1441 "__nonzero__ should return an int");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001442 return -1;
1443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 outcome = PyInt_AsLong(res);
1445 Py_DECREF(res);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001446 if (outcome < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 PyErr_SetString(PyExc_ValueError,
1448 "__nonzero__ should return >= 0");
Guido van Rossum04691fc1992-08-12 15:35:34 +00001449 return -1;
1450 }
1451 return outcome > 0;
1452}
1453
1454UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001455UNARY(instance_int, "__int__")
1456UNARY(instance_long, "__long__")
1457UNARY(instance_float, "__float__")
1458UNARY(instance_oct, "__oct__")
1459UNARY(instance_hex, "__hex__")
1460
Guido van Rossum03093a21994-09-28 15:51:32 +00001461/* This version is for ternary calls only (z != None) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462static PyObject *
Guido van Rossum03093a21994-09-28 15:51:32 +00001463instance_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 PyObject *v;
1465 PyObject *w;
1466 PyObject *z;
Guido van Rossum03093a21994-09-28 15:51:32 +00001467{
1468 /* XXX Doesn't do coercions... */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 PyObject *func;
1470 PyObject *args;
1471 PyObject *result;
1472 static PyObject *powstr;
Guido van Rossum2878a691996-08-09 20:53:24 +00001473
1474 if (powstr == NULL)
Guido van Rossuma412d241997-01-18 07:59:12 +00001475 powstr = PyString_InternFromString("__pow__");
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 func = PyObject_GetAttr(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001477 if (func == NULL)
1478 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 args = Py_BuildValue("(OO)", w, z);
Guido van Rossum03093a21994-09-28 15:51:32 +00001480 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 Py_DECREF(func);
Guido van Rossum03093a21994-09-28 15:51:32 +00001482 return NULL;
1483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 result = PyEval_CallObject(func, args);
1485 Py_DECREF(func);
1486 Py_DECREF(args);
Guido van Rossum03093a21994-09-28 15:51:32 +00001487 return result;
1488}
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490static PyNumberMethods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001491 0, /*nb_add*/
1492 0, /*nb_subtract*/
1493 0, /*nb_multiply*/
1494 0, /*nb_divide*/
1495 0, /*nb_remainder*/
1496 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001497 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001498 (unaryfunc)instance_neg, /*nb_negative*/
1499 (unaryfunc)instance_pos, /*nb_positive*/
1500 (unaryfunc)instance_abs, /*nb_absolute*/
1501 (inquiry)instance_nonzero, /*nb_nonzero*/
1502 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001503 0, /*nb_lshift*/
1504 0, /*nb_rshift*/
1505 0, /*nb_and*/
1506 0, /*nb_xor*/
1507 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001508 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001509 (unaryfunc)instance_int, /*nb_int*/
1510 (unaryfunc)instance_long, /*nb_long*/
1511 (unaryfunc)instance_float, /*nb_float*/
1512 (unaryfunc)instance_oct, /*nb_oct*/
1513 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001514};
1515
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516PyTypeObject PyInstance_Type = {
1517 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001518 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001519 "instance",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001520 sizeof(PyInstanceObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001521 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001522 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001523 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001524 0, /*tp_getattr*/
1525 0, /*tp_setattr*/
1526 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001527 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001528 &instance_as_number, /*tp_as_number*/
1529 &instance_as_sequence, /*tp_as_sequence*/
1530 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001531 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001532 0, /*tp_call*/
1533 0, /*tp_str*/
1534 (getattrofunc)instance_getattr, /*tp_getattro*/
1535 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossumee28c3a2000-02-28 15:03:15 +00001536 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001537 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001538 0, /* tp_doc */
1539 (traverseproc)instance_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001540};
1541
1542
Guido van Rossum81daa321993-05-20 14:24:46 +00001543/* Instance method objects are used for two purposes:
1544 (a) as bound instance methods (returned by instancename.methodname)
1545 (b) as unbound methods (returned by ClassName.methodname)
1546 In case (b), im_self is NULL
1547*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001548
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001549static PyMethodObject *free_list;
1550
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551PyObject *
1552PyMethod_New(func, self, class)
1553 PyObject *func;
1554 PyObject *self;
1555 PyObject *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001556{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 register PyMethodObject *im;
Guido van Rossum7859f871998-07-08 14:58:16 +00001558 if (!PyCallable_Check(func)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001560 return NULL;
1561 }
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001562 im = free_list;
1563 if (im != NULL) {
1564 free_list = (PyMethodObject *)(im->im_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001565 PyObject_INIT(im, &PyMethod_Type);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001566 }
1567 else {
1568 im = PyObject_NEW(PyMethodObject, &PyMethod_Type);
1569 if (im == NULL)
1570 return NULL;
1571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 Py_INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001573 im->im_func = func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 Py_XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001575 im->im_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 Py_INCREF(class);
Guido van Rossum81daa321993-05-20 14:24:46 +00001577 im->im_class = class;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001578 PyObject_GC_Init(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 return (PyObject *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001580}
1581
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582PyObject *
1583PyMethod_Function(im)
1584 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001585{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 if (!PyMethod_Check(im)) {
1587 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001588 return NULL;
1589 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 return ((PyMethodObject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001591}
1592
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593PyObject *
1594PyMethod_Self(im)
1595 register PyObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001596{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 if (!PyMethod_Check(im)) {
1598 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001599 return NULL;
1600 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 return ((PyMethodObject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001602}
1603
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604PyObject *
1605PyMethod_Class(im)
1606 register PyObject *im;
Guido van Rossum81daa321993-05-20 14:24:46 +00001607{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001608 if (!PyMethod_Check(im)) {
1609 PyErr_BadInternalCall();
Guido van Rossum81daa321993-05-20 14:24:46 +00001610 return NULL;
1611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612 return ((PyMethodObject *)im)->im_class;
Guido van Rossum81daa321993-05-20 14:24:46 +00001613}
1614
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001615/* Class method methods */
1616
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617#define OFF(x) offsetof(PyMethodObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618
Guido van Rossume8122f11991-05-05 20:03:07 +00001619static struct memberlist instancemethod_memberlist[] = {
1620 {"im_func", T_OBJECT, OFF(im_func)},
1621 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001622 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001623 /* Dummies that are not handled by getattr() except for __members__ */
1624 {"__doc__", T_INT, 0},
1625 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 {NULL} /* Sentinel */
1627};
1628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629static PyObject *
Guido van Rossume8122f11991-05-05 20:03:07 +00001630instancemethod_getattr(im, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 register PyMethodObject *im;
1632 PyObject *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 char *sname = PyString_AsString(name);
Guido van Rossum2878a691996-08-09 20:53:24 +00001635 if (sname[0] == '_') {
Guido van Rossum7859f871998-07-08 14:58:16 +00001636 /* Inherit __name__ and __doc__ from the callable object
1637 implementing the method */
1638 if (strcmp(sname, "__name__") == 0 ||
1639 strcmp(sname, "__doc__") == 0)
1640 return PyObject_GetAttr(im->im_func, name);
Guido van Rossum6dabc981996-05-14 21:54:20 +00001641 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 if (PyEval_GetRestricted()) {
1643 PyErr_SetString(PyExc_RuntimeError,
1644 "instance-method attributes not accessible in restricted mode");
Guido van Rossum10393b11995-01-10 10:39:49 +00001645 return NULL;
1646 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 return PyMember_Get((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648}
1649
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001650static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001651instancemethod_dealloc(im)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 register PyMethodObject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001653{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001654 PyObject_GC_Fini(im);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 Py_DECREF(im->im_func);
1656 Py_XDECREF(im->im_self);
1657 Py_DECREF(im->im_class);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001658 im->im_self = (PyObject *)free_list;
1659 free_list = im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660}
1661
Guido van Rossumebc8c511992-09-03 20:39:51 +00001662static int
1663instancemethod_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664 PyMethodObject *a, *b;
Guido van Rossumebc8c511992-09-03 20:39:51 +00001665{
Guido van Rossume9df7271995-04-06 14:46:51 +00001666 if (a->im_self != b->im_self)
1667 return (a->im_self < b->im_self) ? -1 : 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001668 return PyObject_Compare(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001669}
1670
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00001672instancemethod_repr(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001673 PyMethodObject *a;
Guido van Rossum25831651993-05-19 14:50:45 +00001674{
1675 char buf[240];
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676 PyInstanceObject *self = (PyInstanceObject *)(a->im_self);
Guido van Rossum7859f871998-07-08 14:58:16 +00001677 PyObject *func = a->im_func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678 PyClassObject *class = (PyClassObject *)(a->im_class);
1679 PyObject *fclassname, *iclassname, *funcname;
Guido van Rossum81daa321993-05-20 14:24:46 +00001680 char *fcname, *icname, *fname;
1681 fclassname = class->cl_name;
Guido van Rossum7859f871998-07-08 14:58:16 +00001682 if (PyFunction_Check(func)) {
1683 funcname = ((PyFunctionObject *)func)->func_name;
1684 Py_INCREF(funcname);
1685 }
1686 else {
1687 funcname = PyObject_GetAttrString(func,"__name__");
1688 if (funcname == NULL)
1689 PyErr_Clear();
1690 }
1691 if (funcname != NULL && PyString_Check(funcname))
1692 fname = PyString_AS_STRING(funcname);
1693 else
1694 fname = "?";
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 if (fclassname != NULL && PyString_Check(fclassname))
1696 fcname = PyString_AsString(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001697 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001698 fcname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001699 if (self == NULL)
1700 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1701 else {
1702 iclassname = self->in_class->cl_name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703 if (iclassname != NULL && PyString_Check(iclassname))
1704 icname = PyString_AsString(iclassname);
Guido van Rossum81daa321993-05-20 14:24:46 +00001705 else
1706 icname = "?";
Fred Drakea44d3532000-06-30 15:01:00 +00001707 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %p>",
1708 fcname, fname, icname, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00001709 }
Guido van Rossum42636dc1999-10-11 14:03:12 +00001710 Py_XDECREF(funcname);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711 return PyString_FromString(buf);
Guido van Rossum25831651993-05-19 14:50:45 +00001712}
1713
Guido van Rossum9bfef441993-03-29 10:43:31 +00001714static long
1715instancemethod_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001716 PyMethodObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001717{
1718 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001719 if (a->im_self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 x = PyObject_Hash(Py_None);
Guido van Rossum81daa321993-05-20 14:24:46 +00001721 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001722 x = PyObject_Hash(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001723 if (x == -1)
1724 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725 y = PyObject_Hash(a->im_func);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001726 if (y == -1)
1727 return -1;
1728 return x ^ y;
1729}
1730
Jeremy Hylton8caad492000-06-23 14:18:11 +00001731static int
1732instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
1733{
1734 int err;
1735 if (im->im_func) {
1736 err = visit(im->im_func, arg);
1737 if (err)
1738 return err;
1739 }
1740 if (im->im_self) {
1741 err = visit(im->im_self, arg);
1742 if (err)
1743 return err;
1744 }
1745 if (im->im_class) {
1746 err = visit(im->im_class, arg);
1747 if (err)
1748 return err;
1749 }
Jeremy Hyltond22162b2000-06-23 17:14:56 +00001750 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +00001751}
1752
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001753PyTypeObject PyMethod_Type = {
1754 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001755 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001756 "instance method",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001757 sizeof(PyMethodObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001758 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001760 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001761 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001762 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001763 (cmpfunc)instancemethod_compare, /*tp_compare*/
1764 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001765 0, /*tp_as_number*/
1766 0, /*tp_as_sequence*/
1767 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001768 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001769 0, /*tp_call*/
1770 0, /*tp_str*/
1771 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1772 0, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001773 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +00001774 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +00001775 0, /* tp_doc */
1776 (traverseproc)instancemethod_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001777};
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001778
1779/* Clear out the free list */
1780
1781void
1782PyMethod_Fini()
1783{
1784 while (free_list) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001785 PyMethodObject *im = free_list;
1786 free_list = (PyMethodObject *)(im->im_self);
1787 PyObject_DEL(im);
Guido van Rossuma0d349f1997-08-05 02:06:53 +00001788 }
1789}