blob: 4ac6a0eff6b3b7cb17a1e75b894eb68a00ba6537 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Class object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000029
Guido van Rossum52ca98a1994-09-05 07:32:29 +000030/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +000031static object *class_lookup PROTO((classobject *, object *, classobject **));
32static object *instance_getattr1 PROTO((instanceobject *, object *));
Guido van Rossum52ca98a1994-09-05 07:32:29 +000033
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034object *
Guido van Rossum81daa321993-05-20 14:24:46 +000035newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000037 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000038 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
Guido van Rossum0dfcf751996-08-12 22:00:53 +000040#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000041 int pos;
42 object *key, *value;
Guido van Rossum0dfcf751996-08-12 22:00:53 +000043#endif
Guido van Rossum52ca98a1994-09-05 07:32:29 +000044 classobject *op, *dummy;
Guido van Rossum2878a691996-08-09 20:53:24 +000045 static object *getattrstr, *setattrstr, *delattrstr;
Guido van Rossum019f4241996-08-21 14:54:28 +000046 static object *docstr;
47 if (docstr == NULL) {
48 docstr= newstringobject("__doc__");
49 if (docstr == NULL)
50 return NULL;
51 }
52 if (mappinglookup(dict, docstr) == NULL) {
53 if (mappinginsert(dict, docstr, None) < 0)
Guido van Rossume7d444f1995-01-07 12:35:18 +000054 return NULL;
55 }
Guido van Rossume2966a61991-12-10 13:53:23 +000056 if (bases == NULL) {
57 bases = newtupleobject(0);
58 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000059 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000060 }
61 else
62 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000064 if (op == NULL) {
65 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000067 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000069 INCREF(dict);
70 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000071 XINCREF(name);
72 op->cl_name = name;
Guido van Rossum2878a691996-08-09 20:53:24 +000073 if (getattrstr == NULL) {
74 getattrstr = newstringobject("__getattr__");
75 setattrstr = newstringobject("__setattr__");
76 delattrstr = newstringobject("__delattr__");
77 }
78 op->cl_getattr = class_lookup(op, getattrstr, &dummy);
79 op->cl_setattr = class_lookup(op, setattrstr, &dummy);
80 op->cl_delattr = class_lookup(op, delattrstr, &dummy);
Guido van Rossum52ca98a1994-09-05 07:32:29 +000081 XINCREF(op->cl_getattr);
82 XINCREF(op->cl_setattr);
83 XINCREF(op->cl_delattr);
Guido van Rossum0dfcf751996-08-12 22:00:53 +000084#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +000085 pos = 0;
86 while (mappinggetnext(dict, &pos, &key, &value)) {
87 if (is_accessobject(value))
88 setaccessowner(value, (object *)op);
89 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +000090#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091 return (object *) op;
92}
93
94/* Class methods */
95
96static void
97class_dealloc(op)
98 classobject *op;
99{
Guido van Rossume2966a61991-12-10 13:53:23 +0000100 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +0000101 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +0000102 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 free((ANY *)op);
104}
105
106static object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000107class_lookup(cp, name, pclass)
108 classobject *cp;
Guido van Rossum2878a691996-08-09 20:53:24 +0000109 object *name;
Guido van Rossum81daa321993-05-20 14:24:46 +0000110 classobject **pclass;
111{
112 int i, n;
Guido van Rossum2878a691996-08-09 20:53:24 +0000113 object *value = mappinglookup(cp->cl_dict, name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000114 if (value != NULL) {
115 *pclass = cp;
116 return value;
117 }
118 n = gettuplesize(cp->cl_bases);
119 for (i = 0; i < n; i++) {
120 object *v = class_lookup((classobject *)
121 gettupleitem(cp->cl_bases, i), name, pclass);
122 if (v != NULL)
123 return v;
124 }
125 return NULL;
126}
127
128static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129class_getattr(op, name)
130 register classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000131 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
133 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000134 register char *sname = getstringvalue(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000136 if (sname[0] == '_' && sname[1] == '_') {
137 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000138 if (getrestricted()) {
139 err_setstr(RuntimeError,
140 "class.__dict__ not accessible in restricted mode");
141 return NULL;
142 }
143 INCREF(op->cl_dict);
144 return op->cl_dict;
145 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000146 if (strcmp(sname, "__bases__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000147 INCREF(op->cl_bases);
148 return op->cl_bases;
149 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000150 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000151 if (op->cl_name == NULL)
152 v = None;
153 else
154 v = op->cl_name;
155 INCREF(v);
156 return v;
157 }
Guido van Rossum94308391991-10-20 20:11:48 +0000158 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000159 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000160 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000161 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000162 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000164#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000165 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000166 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000167 if (v == NULL)
168 return NULL;
169 }
170 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000171#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000172 INCREF(v);
173 if (is_funcobject(v)) {
174 object *w = newinstancemethodobject(v, (object *)NULL,
175 (object *)class);
176 DECREF(v);
177 v = w;
178 }
179 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180}
181
Guido van Rossum94308391991-10-20 20:11:48 +0000182static int
183class_setattr(op, name, v)
184 classobject *op;
Guido van Rossum2878a691996-08-09 20:53:24 +0000185 object *name;
Guido van Rossum94308391991-10-20 20:11:48 +0000186 object *v;
187{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000188#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000189 object *ac;
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000190#endif
Guido van Rossum2878a691996-08-09 20:53:24 +0000191 char *sname = getstringvalue(name);
192 if (sname[0] == '_' && sname[1] == '_') {
193 int n = getstringsize(name);
194 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000195 err_setstr(TypeError, "read-only special attribute");
196 return -1;
197 }
198 }
Guido van Rossumac21f6a1995-08-04 04:05:31 +0000199 if (getrestricted()) {
200 err_setstr(RuntimeError,
201 "classes are read-only in restricted mode");
202 return -1;
203 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000204#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum2878a691996-08-09 20:53:24 +0000205 ac = mappinglookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000206 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000207 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000208#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000209 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000210 int rv = mappingremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000211 if (rv < 0)
212 err_setstr(AttributeError,
213 "delete non-existing class attribute");
214 return rv;
215 }
Guido van Rossum94308391991-10-20 20:11:48 +0000216 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000217 return mappinginsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000218}
219
Guido van Rossum25831651993-05-19 14:50:45 +0000220static object *
221class_repr(op)
222 classobject *op;
223{
224 char buf[140];
225 char *name;
226 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
227 name = "?";
228 else
229 name = getstringvalue(op->cl_name);
230 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
231 return newstringobject(buf);
232}
233
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234typeobject Classtype = {
235 OB_HEAD_INIT(&Typetype)
236 0,
237 "class",
238 sizeof(classobject),
239 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000240 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000242 0, /*tp_getattr*/
243 0, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 0, /*tp_as_number*/
247 0, /*tp_as_sequence*/
248 0, /*tp_as_mapping*/
Guido van Rossum2878a691996-08-09 20:53:24 +0000249 0, /*tp_hash*/
250 0, /*tp_call*/
251 0, /*tp_str*/
252 (getattrofunc)class_getattr, /*tp_getattro*/
253 (setattrofunc)class_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254};
255
Guido van Rossum81daa321993-05-20 14:24:46 +0000256int
257issubclass(class, base)
258 object *class;
259 object *base;
260{
261 int i, n;
262 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000263 if (class == base)
264 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000265 if (class == NULL || !is_classobject(class))
266 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000267 cp = (classobject *)class;
268 n = gettuplesize(cp->cl_bases);
269 for (i = 0; i < n; i++) {
270 if (issubclass(gettupleitem(cp->cl_bases, i), base))
271 return 1;
272 }
273 return 0;
274}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275
Guido van Rossum81daa321993-05-20 14:24:46 +0000276
277/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000279#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum81daa321993-05-20 14:24:46 +0000280static int
281addaccess(class, inst)
282 classobject *class;
283 instanceobject *inst;
284{
285 int i, n, pos, ret;
286 object *key, *value, *ac;
287
288 n = gettuplesize(class->cl_bases);
289 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000290 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000291 return -1;
292 }
293
294 pos = 0;
295 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
296 if (!is_accessobject(value))
297 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000298 if (hasaccessvalue(value))
299 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000300 ac = dict2lookup(inst->in_dict, key);
301 if (ac != NULL && is_accessobject(ac)) {
302 err_setval(ConflictError, key);
303 return -1;
304 }
305 ac = cloneaccessobject(value);
306 if (ac == NULL)
307 return -1;
308 ret = dict2insert(inst->in_dict, key, ac);
309 DECREF(ac);
310 if (ret != 0)
311 return -1;
312 }
313 return 0;
314}
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000315#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000316
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000318newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000319 object *class;
320 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000321 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322{
Guido van Rossume8122f11991-05-05 20:03:07 +0000323 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000324 object *init;
Guido van Rossum2878a691996-08-09 20:53:24 +0000325 static object *initstr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000327 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 return NULL;
329 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000330 inst = NEWOBJ(instanceobject, &Instancetype);
331 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 return NULL;
333 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000334 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000335 inst->in_dict = newdictobject();
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000336 if (inst->in_dict == NULL
337#ifdef SUPPORT_OBSOLETE_ACCESS
338 || addaccess((classobject *)class, inst) != 0
339#endif
340 ) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000341 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 return NULL;
343 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000344 if (initstr == NULL)
345 initstr = newstringobject("__init__");
346 init = instance_getattr1(inst, initstr);
Guido van Rossum25831651993-05-19 14:50:45 +0000347 if (init == NULL) {
348 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000349 if (arg != NULL && (!is_tupleobject(arg) ||
350 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000351 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000352 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000353 DECREF(inst);
354 inst = NULL;
355 }
356 }
357 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000358 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000359 DECREF(init);
360 if (res == NULL) {
361 DECREF(inst);
362 inst = NULL;
363 }
364 else {
365 if (res != None) {
366 err_setstr(TypeError,
367 "__init__() should return None");
368 DECREF(inst);
369 inst = NULL;
370 }
371 DECREF(res);
372 }
373 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000374 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000377/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378
379static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000380instance_dealloc(inst)
381 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000383 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000384 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000385 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000386 /* Call the __del__ method if it exists. First temporarily
387 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000388#ifdef Py_TRACE_REFS
389 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000390 extern long ref_total;
391 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000392 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000393 ref_total--; /* compensate for increment in NEWREF */
394#ifdef COUNT_ALLOCS
395 inst->ob_type->tp_alloc--; /* ditto */
396#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000397#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000398 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000399#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000400 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000401 if (delstr == NULL)
402 delstr = newstringobject("__del__");
403 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000404 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000405 DECREF(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000406 if (res == NULL) {
Guido van Rossumad899781996-08-22 23:15:42 +0000407 PyObject *f = sysget("stderr");
408 err_clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000409 if (f != NULL) {
410 writestring("exception in ", f);
411 writestring(PyString_AsString(
412 inst->in_class->cl_name), f);
413 writestring(".__del__() ignored\n", f);
414 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000415 }
416 else
417 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000418 }
419 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000420 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000421 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000422 if (--inst->ob_refcnt > 0) {
423#ifdef COUNT_ALLOCS
424 inst->ob_type->tp_free--;
425#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000426 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000427 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000428#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000429#ifdef COUNT_ALLOCS
430 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
431#endif
432 UNREF(inst);
433 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000434#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000435 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000436 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000437 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438}
439
Guido van Rossume7737541994-09-05 07:31:41 +0000440static object *
441instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000442 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000443 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Guido van Rossum94308391991-10-20 20:11:48 +0000445 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000446 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000447 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000448 if (sname[0] == '_' && sname[1] == '_') {
449 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000450 if (getrestricted()) {
451 err_setstr(RuntimeError,
452 "instance.__dict__ not accessible in restricted mode");
453 return NULL;
454 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000455 INCREF(inst->in_dict);
456 return inst->in_dict;
457 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000458 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000459 INCREF(inst->in_class);
460 return (object *)inst->in_class;
461 }
Guido van Rossum94308391991-10-20 20:11:48 +0000462 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000463 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000464 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000465 if (v == NULL) {
466 v = class_lookup(inst->in_class, name, &class);
467 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000468 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000469 return NULL;
470 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000472#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000473 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000474 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000475 if (v == NULL)
476 return NULL;
477 }
478 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000479#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000480 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000481 if (class != NULL) {
482 if (is_funcobject(v)) {
483 object *w = newinstancemethodobject(v, (object *)inst,
484 (object *)class);
485 DECREF(v);
486 v = w;
487 }
488 else if (is_instancemethodobject(v)) {
489 object *im_class = instancemethodgetclass(v);
490 /* Only if classes are compatible */
491 if (issubclass((object *)class, im_class)) {
492 object *im_func = instancemethodgetfunc(v);
493 object *w = newinstancemethodobject(im_func,
494 (object *)inst, im_class);
495 DECREF(v);
496 v = w;
497 }
498 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000499 }
500 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501}
502
Guido van Rossume7737541994-09-05 07:31:41 +0000503static object *
504instance_getattr(inst, name)
505 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000506 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000507{
508 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000509 res = instance_getattr1(inst, name);
510 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
511 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000512 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000513 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000514 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000515 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000516 res = call_object(func, args);
517 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000518 }
519 return res;
520}
521
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522static int
Guido van Rossume7737541994-09-05 07:31:41 +0000523instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000524 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000525 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000526 object *v;
527{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000528#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000529 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000530 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000531 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000532 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000533#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000534 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000535 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000536 if (rv < 0)
537 err_setstr(AttributeError,
538 "delete non-existing instance attribute");
539 return rv;
540 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000542 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543}
544
Guido van Rossume7737541994-09-05 07:31:41 +0000545static int
546instance_setattr(inst, name, v)
547 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000548 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000549 object *v;
550{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000551 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000552 char *sname = getstringvalue(name);
553 if (sname[0] == '_' && sname[1] == '_'
554 && (strcmp(sname, "__dict__") == 0 ||
555 strcmp(sname, "__class__") == 0)) {
Guido van Rossume5920bc1996-08-26 14:58:03 +0000556 int n = getstringsize(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000557 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000558 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000559 return -1;
560 }
Guido van Rossume7737541994-09-05 07:31:41 +0000561 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000562 if (v == NULL)
563 func = inst->in_class->cl_delattr;
564 else
565 func = inst->in_class->cl_setattr;
566 if (func == NULL)
567 return instance_setattr1(inst, name, v);
568 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000569 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000570 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000571 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000572 if (args == NULL)
573 return -1;
574 res = call_object(func, args);
575 DECREF(args);
576 if (res == NULL)
577 return -1;
578 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000579 return 0;
580}
581
Guido van Rossum9bfef441993-03-29 10:43:31 +0000582static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000583instance_repr(inst)
584 instanceobject *inst;
585{
586 object *func;
587 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000588 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000589
Guido van Rossum2878a691996-08-09 20:53:24 +0000590 if (reprstr == NULL)
591 reprstr = newstringobject("__repr__");
592 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000593 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000594 char buf[140];
595 object *classname = inst->in_class->cl_name;
596 char *cname;
597 if (classname != NULL && is_stringobject(classname))
598 cname = getstringvalue(classname);
599 else
600 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000601 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000602 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000603 return newstringobject(buf);
604 }
605 res = call_object(func, (object *)NULL);
606 DECREF(func);
607 return res;
608}
609
Guido van Rossume7d444f1995-01-07 12:35:18 +0000610static object *
611instance_compare1(inst, other)
612 object *inst, *other;
613{
614 return instancebinop(inst, other, "__cmp__", "__rcmp__",
615 instance_compare1);
616}
617
Guido van Rossum9bfef441993-03-29 10:43:31 +0000618static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000619instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000620 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000621{
Guido van Rossum03093a21994-09-28 15:51:32 +0000622 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000623 long outcome;
624 result = instance_compare1(inst, other);
625 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000626 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000627 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000628 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000629 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000630 outcome = getintvalue(result);
631 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000632 if (outcome < 0)
633 return -1;
634 else if (outcome > 0)
635 return 1;
636 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000637}
638
Guido van Rossum9bfef441993-03-29 10:43:31 +0000639static long
640instance_hash(inst)
641 instanceobject *inst;
642{
643 object *func;
644 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000645 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000646 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000647
Guido van Rossum2878a691996-08-09 20:53:24 +0000648 if (hashstr == NULL)
649 hashstr = newstringobject("__hash__");
650 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000651 if (func == NULL) {
652 /* If there is no __cmp__ method, we hash on the address.
653 If a __cmp__ method exists, there must be a __hash__. */
654 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000655 if (cmpstr == NULL)
656 cmpstr = newstringobject("__cmp__");
657 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000658 if (func == NULL) {
659 err_clear();
660 outcome = (long)inst;
661 if (outcome == -1)
662 outcome = -2;
663 return outcome;
664 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000665 err_setstr(TypeError, "unhashable instance");
666 return -1;
667 }
668 res = call_object(func, (object *)NULL);
669 DECREF(func);
670 if (res == NULL)
671 return -1;
672 if (is_intobject(res)) {
673 outcome = getintvalue(res);
674 if (outcome == -1)
675 outcome = -2;
676 }
677 else {
678 err_setstr(TypeError, "__hash__() should return an int");
679 outcome = -1;
680 }
681 DECREF(res);
682 return outcome;
683}
684
Guido van Rossum2878a691996-08-09 20:53:24 +0000685static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
686
Guido van Rossum9bfef441993-03-29 10:43:31 +0000687static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000688instance_length(inst)
689 instanceobject *inst;
690{
691 object *func;
692 object *res;
693 int outcome;
694
Guido van Rossum2878a691996-08-09 20:53:24 +0000695 if (lenstr == NULL)
696 lenstr = newstringobject("__len__");
697 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000698 if (func == NULL)
699 return -1;
700 res = call_object(func, (object *)NULL);
701 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000702 if (res == NULL)
703 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000704 if (is_intobject(res)) {
705 outcome = getintvalue(res);
706 if (outcome < 0)
707 err_setstr(ValueError, "__len__() should return >= 0");
708 }
709 else {
710 err_setstr(TypeError, "__len__() should return an int");
711 outcome = -1;
712 }
713 DECREF(res);
714 return outcome;
715}
716
Guido van Rossum9bfef441993-03-29 10:43:31 +0000717static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000718instance_subscript(inst, key)
719 instanceobject *inst;
720 object *key;
721{
722 object *func;
723 object *arg;
724 object *res;
725
Guido van Rossum2878a691996-08-09 20:53:24 +0000726 if (getitemstr == NULL)
727 getitemstr = newstringobject("__getitem__");
728 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000729 if (func == NULL)
730 return NULL;
731 arg = mkvalue("(O)", key);
732 if (arg == NULL) {
733 DECREF(func);
734 return NULL;
735 }
736 res = call_object(func, arg);
737 DECREF(func);
738 DECREF(arg);
739 return res;
740}
741
Guido van Rossum9bfef441993-03-29 10:43:31 +0000742static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743instance_ass_subscript(inst, key, value)
744 instanceobject*inst;
745 object *key;
746 object *value;
747{
748 object *func;
749 object *arg;
750 object *res;
751
Guido van Rossum2878a691996-08-09 20:53:24 +0000752 if (value == NULL) {
753 if (delitemstr == NULL)
754 delitemstr = newstringobject("__delitem__");
755 func = instance_getattr(inst, delitemstr);
756 }
757 else {
758 if (setitemstr == NULL)
759 setitemstr = newstringobject("__setitem__");
760 func = instance_getattr(inst, setitemstr);
761 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000762 if (func == NULL)
763 return -1;
764 if (value == NULL)
765 arg = mkvalue("(O)", key);
766 else
767 arg = mkvalue("(OO)", key, value);
768 if (arg == NULL) {
769 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000770 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000771 }
772 res = call_object(func, arg);
773 DECREF(func);
774 DECREF(arg);
775 if (res == NULL)
776 return -1;
777 DECREF(res);
778 return 0;
779}
780
Guido van Rossum9bfef441993-03-29 10:43:31 +0000781static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000782 (inquiry)instance_length, /*mp_length*/
783 (binaryfunc)instance_subscript, /*mp_subscript*/
784 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785};
786
787static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788instance_item(inst, i)
789 instanceobject *inst;
790 int i;
791{
792 object *func, *arg, *res;
793
Guido van Rossum2878a691996-08-09 20:53:24 +0000794 if (getitemstr == NULL)
795 getitemstr = newstringobject("__getitem__");
796 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 if (func == NULL)
798 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000799 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 if (arg == NULL) {
801 DECREF(func);
802 return NULL;
803 }
804 res = call_object(func, arg);
805 DECREF(func);
806 DECREF(arg);
807 return res;
808}
809
810static object *
811instance_slice(inst, i, j)
812 instanceobject *inst;
813 int i, j;
814{
815 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000816 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000817
Guido van Rossum2878a691996-08-09 20:53:24 +0000818 if (getslicestr == NULL)
819 getslicestr = newstringobject("__getslice__");
820 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821 if (func == NULL)
822 return NULL;
823 arg = mkvalue("(ii)", i, j);
824 if (arg == NULL) {
825 DECREF(func);
826 return NULL;
827 }
828 res = call_object(func, arg);
829 DECREF(func);
830 DECREF(arg);
831 return res;
832}
833
834static int
835instance_ass_item(inst, i, item)
836 instanceobject *inst;
837 int i;
838 object *item;
839{
840 object *func, *arg, *res;
841
Guido van Rossum2878a691996-08-09 20:53:24 +0000842 if (item == NULL) {
843 if (delitemstr == NULL)
844 delitemstr = newstringobject("__delitem__");
845 func = instance_getattr(inst, delitemstr);
846 }
847 else {
848 if (setitemstr == NULL)
849 setitemstr = newstringobject("__setitem__");
850 func = instance_getattr(inst, setitemstr);
851 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000852 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000853 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854 if (item == NULL)
855 arg = mkvalue("i", i);
856 else
857 arg = mkvalue("(iO)", i, item);
858 if (arg == NULL) {
859 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000860 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000861 }
862 res = call_object(func, arg);
863 DECREF(func);
864 DECREF(arg);
865 if (res == NULL)
866 return -1;
867 DECREF(res);
868 return 0;
869}
870
871static int
872instance_ass_slice(inst, i, j, value)
873 instanceobject *inst;
874 int i, j;
875 object *value;
876{
877 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000878 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000879
Guido van Rossum2878a691996-08-09 20:53:24 +0000880 if (value == NULL) {
881 if (delslicestr == NULL)
882 delslicestr = newstringobject("__delslice__");
883 func = instance_getattr(inst, delslicestr);
884 }
885 else {
886 if (setslicestr == NULL)
887 setslicestr = newstringobject("__setslice__");
888 func = instance_getattr(inst, setslicestr);
889 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000890 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000891 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 if (value == NULL)
893 arg = mkvalue("(ii)", i, j);
894 else
895 arg = mkvalue("(iiO)", i, j, value);
896 if (arg == NULL) {
897 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000898 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000899 }
900 res = call_object(func, arg);
901 DECREF(func);
902 DECREF(arg);
903 if (res == NULL)
904 return -1;
905 DECREF(res);
906 return 0;
907}
908
909static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000911 0, /*sq_concat*/
912 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000913 (intargfunc)instance_item, /*sq_item*/
914 (intintargfunc)instance_slice, /*sq_slice*/
915 (intobjargproc)instance_ass_item, /*sq_ass_item*/
916 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917};
918
919static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920generic_unary_op(self, methodname)
921 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000922 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923{
924 object *func, *res;
925
926 if ((func = instance_getattr(self, methodname)) == NULL)
927 return NULL;
928 res = call_object(func, (object *)NULL);
929 DECREF(func);
930 return res;
931}
932
Guido van Rossum03093a21994-09-28 15:51:32 +0000933
934/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000935static int halfbinop Py_PROTO((object *, object *, char *, object **,
936 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000937
938
939/* Implement a binary operator involving at least one class instance. */
940
941object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000942instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000943 object *v;
944 object *w;
945 char *opname;
946 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000947 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000948{
949 char buf[256];
950 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000951 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000952 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000953 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000954 return result;
955 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
956 err_setstr(TypeError, buf);
957 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000958}
959
Guido van Rossum03093a21994-09-28 15:51:32 +0000960
961/* Try one half of a binary operator involving a class instance.
962 Return value:
963 -1 if an exception is to be reported right away
964 0 if we have a valid result
965 1 if we could try another operation
966*/
967
Guido van Rossum2878a691996-08-09 20:53:24 +0000968static object *coerce_obj;
969
Guido van Rossum03093a21994-09-28 15:51:32 +0000970static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000971halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000972 object *v;
973 object *w;
974 char *opname;
975 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000976 object * (*thisfunc) PROTO((object *, object *));
977 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000978{
979 object *func;
980 object *args;
981 object *coerce;
982 object *coerced = NULL;
983 object *v1;
984
985 if (!is_instanceobject(v))
986 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000987 if (coerce_obj == NULL) {
988 coerce_obj = newstringobject("__coerce__");
989 if (coerce_obj == NULL)
990 return -1;
991 }
992 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000993 if (coerce == NULL) {
994 err_clear();
995 }
996 else {
997 args = mkvalue("(O)", w);
998 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000999 return -1;
1000 }
1001 coerced = call_object(coerce, args);
1002 DECREF(args);
1003 DECREF(coerce);
1004 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001005 return -1;
1006 }
1007 if (coerced == None) {
1008 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001009 return 1;
1010 }
1011 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1012 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001013 err_setstr(TypeError,
1014 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001015 return -1;
1016 }
1017 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001018 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001019 if (v1 != v) {
1020 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001021 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1022 if (swapped)
1023 *r_result = (*thisfunc)(w, v);
1024 else
1025 *r_result = (*thisfunc)(v, w);
1026 DECREF(coerced);
1027 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001028 }
1029 }
1030 w = gettupleitem(coerced, 1);
1031 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001032 func = getattr(v, opname);
1033 if (func == NULL) {
1034 XDECREF(coerced);
1035 if (err_occurred() != AttributeError)
1036 return -1;
1037 err_clear();
1038 return 1;
1039 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001040 args = mkvalue("(O)", w);
1041 if (args == NULL) {
1042 DECREF(func);
1043 XDECREF(coerced);
1044 return -1;
1045 }
1046 *r_result = call_object(func, args);
1047 DECREF(args);
1048 DECREF(func);
1049 XDECREF(coerced);
1050 return *r_result == NULL ? -1 : 0;
1051}
1052
Guido van Rossum879c5811995-01-10 15:24:06 +00001053static int
1054instance_coerce(pv, pw)
1055 object **pv;
1056 object **pw;
1057{
1058 object *v = *pv;
1059 object *w = *pw;
1060 object *coerce;
1061 object *args;
1062 object *coerced;
1063
Guido van Rossum2878a691996-08-09 20:53:24 +00001064 if (coerce_obj == NULL) {
1065 coerce_obj = newstringobject("__coerce__");
1066 if (coerce_obj == NULL)
1067 return -1;
1068 }
1069 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001070 if (coerce == NULL) {
1071 /* No __coerce__ method: always OK */
1072 err_clear();
1073 INCREF(v);
1074 INCREF(w);
1075 return 0;
1076 }
1077 /* Has __coerce__ method: call it */
1078 args = mkvalue("(O)", w);
1079 if (args == NULL) {
1080 return -1;
1081 }
1082 coerced = call_object(coerce, args);
1083 DECREF(args);
1084 DECREF(coerce);
1085 if (coerced == NULL) {
1086 /* __coerce__ call raised an exception */
1087 return -1;
1088 }
1089 if (coerced == None) {
1090 /* __coerce__ says "I can't do it" */
1091 DECREF(coerced);
1092 return 1;
1093 }
1094 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1095 /* __coerce__ return value is malformed */
1096 DECREF(coerced);
1097 err_setstr(TypeError,
1098 "coercion should return None or 2-tuple");
1099 return -1;
1100 }
1101 /* __coerce__ returned two new values */
1102 *pv = gettupleitem(coerced, 0);
1103 *pw = gettupleitem(coerced, 1);
1104 INCREF(*pv);
1105 INCREF(*pw);
1106 DECREF(coerced);
1107 return 0;
1108}
1109
Guido van Rossum03093a21994-09-28 15:51:32 +00001110
Guido van Rossum04691fc1992-08-12 15:35:34 +00001111#define UNARY(funcname, methodname) \
1112static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001113 static object *o; \
1114 if (o == NULL) o = newstringobject(methodname); \
1115 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001116}
1117
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118UNARY(instance_neg, "__neg__")
1119UNARY(instance_pos, "__pos__")
1120UNARY(instance_abs, "__abs__")
1121
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001123instance_nonzero(self)
1124 instanceobject *self;
1125{
1126 object *func, *res;
1127 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001128 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001129
Guido van Rossum2878a691996-08-09 20:53:24 +00001130 if (nonzerostr == NULL)
1131 nonzerostr = newstringobject("__nonzero__");
1132 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001134 if (lenstr == NULL)
1135 lenstr = newstringobject("__len__");
1136 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137 err_clear();
1138 /* Fall back to the default behavior:
1139 all instances are nonzero */
1140 return 1;
1141 }
1142 }
1143 res = call_object(func, (object *)NULL);
1144 DECREF(func);
1145 if (res == NULL)
1146 return -1;
1147 if (!is_intobject(res)) {
1148 DECREF(res);
1149 err_setstr(TypeError, "__nonzero__ should return an int");
1150 return -1;
1151 }
1152 outcome = getintvalue(res);
1153 DECREF(res);
1154 if (outcome < 0) {
1155 err_setstr(ValueError, "__nonzero__ should return >= 0");
1156 return -1;
1157 }
1158 return outcome > 0;
1159}
1160
1161UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001162UNARY(instance_int, "__int__")
1163UNARY(instance_long, "__long__")
1164UNARY(instance_float, "__float__")
1165UNARY(instance_oct, "__oct__")
1166UNARY(instance_hex, "__hex__")
1167
Guido van Rossum03093a21994-09-28 15:51:32 +00001168/* This version is for ternary calls only (z != None) */
1169static object *
1170instance_pow(v, w, z)
1171 object *v;
1172 object *w;
1173 object *z;
1174{
1175 /* XXX Doesn't do coercions... */
1176 object *func;
1177 object *args;
1178 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001179 static object *powstr;
1180
1181 if (powstr == NULL)
1182 powstr = newstringobject("__pow__");
1183 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001184 if (func == NULL)
1185 return NULL;
1186 args = mkvalue("(OO)", w, z);
1187 if (args == NULL) {
1188 DECREF(func);
1189 return NULL;
1190 }
1191 result = call_object(func, args);
1192 DECREF(func);
1193 DECREF(args);
1194 return result;
1195}
1196
Guido van Rossum04691fc1992-08-12 15:35:34 +00001197static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001198 0, /*nb_add*/
1199 0, /*nb_subtract*/
1200 0, /*nb_multiply*/
1201 0, /*nb_divide*/
1202 0, /*nb_remainder*/
1203 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001204 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001205 (unaryfunc)instance_neg, /*nb_negative*/
1206 (unaryfunc)instance_pos, /*nb_positive*/
1207 (unaryfunc)instance_abs, /*nb_absolute*/
1208 (inquiry)instance_nonzero, /*nb_nonzero*/
1209 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001210 0, /*nb_lshift*/
1211 0, /*nb_rshift*/
1212 0, /*nb_and*/
1213 0, /*nb_xor*/
1214 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001215 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001216 (unaryfunc)instance_int, /*nb_int*/
1217 (unaryfunc)instance_long, /*nb_long*/
1218 (unaryfunc)instance_float, /*nb_float*/
1219 (unaryfunc)instance_oct, /*nb_oct*/
1220 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001221};
1222
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001223typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001224 OB_HEAD_INIT(&Typetype)
1225 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001226 "instance",
1227 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001228 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001229 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001230 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001231 0, /*tp_getattr*/
1232 0, /*tp_setattr*/
1233 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001234 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001235 &instance_as_number, /*tp_as_number*/
1236 &instance_as_sequence, /*tp_as_sequence*/
1237 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001238 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001239 0, /*tp_call*/
1240 0, /*tp_str*/
1241 (getattrofunc)instance_getattr, /*tp_getattro*/
1242 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001243};
1244
1245
Guido van Rossum81daa321993-05-20 14:24:46 +00001246/* Instance method objects are used for two purposes:
1247 (a) as bound instance methods (returned by instancename.methodname)
1248 (b) as unbound methods (returned by ClassName.methodname)
1249 In case (b), im_self is NULL
1250*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001251
1252typedef struct {
1253 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001254 object *im_func; /* The function implementing the method */
1255 object *im_self; /* The instance it is bound to, or NULL */
1256 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001257} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258
1259object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001260newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261 object *func;
1262 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001263 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001264{
Guido van Rossume8122f11991-05-05 20:03:07 +00001265 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001266 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001267 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268 return NULL;
1269 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001270 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1271 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001272 return NULL;
1273 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001274 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001275 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001276 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001277 INCREF(class);
1278 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001279 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001280}
1281
1282object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001283instancemethodgetfunc(im)
1284 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285{
Guido van Rossume8122f11991-05-05 20:03:07 +00001286 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001287 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001288 return NULL;
1289 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001290 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001291}
1292
1293object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001294instancemethodgetself(im)
1295 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001296{
Guido van Rossume8122f11991-05-05 20:03:07 +00001297 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001298 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001299 return NULL;
1300 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001301 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001302}
1303
Guido van Rossum81daa321993-05-20 14:24:46 +00001304object *
1305instancemethodgetclass(im)
1306 register object *im;
1307{
1308 if (!is_instancemethodobject(im)) {
1309 err_badcall();
1310 return NULL;
1311 }
1312 return ((instancemethodobject *)im)->im_class;
1313}
1314
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001315/* Class method methods */
1316
Guido van Rossume8122f11991-05-05 20:03:07 +00001317#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318
Guido van Rossume8122f11991-05-05 20:03:07 +00001319static struct memberlist instancemethod_memberlist[] = {
1320 {"im_func", T_OBJECT, OFF(im_func)},
1321 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001322 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001323 /* Dummies that are not handled by getattr() except for __members__ */
1324 {"__doc__", T_INT, 0},
1325 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001326 {NULL} /* Sentinel */
1327};
1328
1329static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001330instancemethod_getattr(im, name)
1331 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001332 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001333{
Guido van Rossum2878a691996-08-09 20:53:24 +00001334 char *sname = getstringvalue(name);
1335 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001336 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001337 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001338 INCREF(func->func_name);
1339 return func->func_name;
1340 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001341 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001342 INCREF(func->func_doc);
1343 return func->func_doc;
1344 }
1345 }
1346 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001347 err_setstr(RuntimeError,
1348 "instance-method attributes not accessible in restricted mode");
1349 return NULL;
1350 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001351 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352}
1353
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001354static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001355instancemethod_dealloc(im)
1356 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001357{
Guido van Rossume8122f11991-05-05 20:03:07 +00001358 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001359 XDECREF(im->im_self);
1360 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001361 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001362}
1363
Guido van Rossumebc8c511992-09-03 20:39:51 +00001364static int
1365instancemethod_compare(a, b)
1366 instancemethodobject *a, *b;
1367{
Guido van Rossume9df7271995-04-06 14:46:51 +00001368 if (a->im_self != b->im_self)
1369 return (a->im_self < b->im_self) ? -1 : 1;
1370 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001371}
1372
Guido van Rossum25831651993-05-19 14:50:45 +00001373static object *
1374instancemethod_repr(a)
1375 instancemethodobject *a;
1376{
1377 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001378 instanceobject *self = (instanceobject *)(a->im_self);
1379 funcobject *func = (funcobject *)(a->im_func);
1380 classobject *class = (classobject *)(a->im_class);
1381 object *fclassname, *iclassname, *funcname;
1382 char *fcname, *icname, *fname;
1383 fclassname = class->cl_name;
1384 funcname = func->func_name;
1385 if (fclassname != NULL && is_stringobject(fclassname))
1386 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001387 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001388 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001389 if (funcname != NULL && is_stringobject(funcname))
1390 fname = getstringvalue(funcname);
1391 else
1392 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001393 if (self == NULL)
1394 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1395 else {
1396 iclassname = self->in_class->cl_name;
1397 if (iclassname != NULL && is_stringobject(iclassname))
1398 icname = getstringvalue(iclassname);
1399 else
1400 icname = "?";
1401 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1402 fcname, fname, icname, (long)self);
1403 }
Guido van Rossum25831651993-05-19 14:50:45 +00001404 return newstringobject(buf);
1405}
1406
Guido van Rossum9bfef441993-03-29 10:43:31 +00001407static long
1408instancemethod_hash(a)
1409 instancemethodobject *a;
1410{
1411 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001412 if (a->im_self == NULL)
1413 x = hashobject(None);
1414 else
1415 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001416 if (x == -1)
1417 return -1;
1418 y = hashobject(a->im_func);
1419 if (y == -1)
1420 return -1;
1421 return x ^ y;
1422}
1423
Guido van Rossume8122f11991-05-05 20:03:07 +00001424typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001425 OB_HEAD_INIT(&Typetype)
1426 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001427 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001428 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001429 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001430 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001431 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001432 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001433 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001434 (cmpfunc)instancemethod_compare, /*tp_compare*/
1435 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001436 0, /*tp_as_number*/
1437 0, /*tp_as_sequence*/
1438 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001439 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001440 0, /*tp_call*/
1441 0, /*tp_str*/
1442 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1443 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001444};