blob: f392fae13fca98c6cd77d38396aee1d5f3e64310 [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) ||
Guido van Rossum8bcf3691996-10-21 15:12:32 +0000350 gettuplesize(arg) != 0)
351 || kw != NULL && (!is_dictobject(kw) ||
352 getdictsize(kw) != 0)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000353 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000354 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000355 DECREF(inst);
356 inst = NULL;
357 }
358 }
359 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000360 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000361 DECREF(init);
362 if (res == NULL) {
363 DECREF(inst);
364 inst = NULL;
365 }
366 else {
367 if (res != None) {
368 err_setstr(TypeError,
369 "__init__() should return None");
370 DECREF(inst);
371 inst = NULL;
372 }
373 DECREF(res);
374 }
375 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000376 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377}
378
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000379/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380
381static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000382instance_dealloc(inst)
383 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000385 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000386 object *del;
Guido van Rossum2878a691996-08-09 20:53:24 +0000387 static object *delstr;
Guido van Rossum25831651993-05-19 14:50:45 +0000388 /* Call the __del__ method if it exists. First temporarily
389 revive the object and save the current exception, if any. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000390#ifdef Py_TRACE_REFS
391 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000392 extern long ref_total;
393 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000394 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000395 ref_total--; /* compensate for increment in NEWREF */
396#ifdef COUNT_ALLOCS
397 inst->ob_type->tp_alloc--; /* ditto */
398#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000399#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000400 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000401#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000402 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum2878a691996-08-09 20:53:24 +0000403 if (delstr == NULL)
404 delstr = newstringobject("__del__");
405 if ((del = instance_getattr1(inst, delstr)) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000406 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000407 DECREF(del);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000408 if (res == NULL) {
Guido van Rossumad899781996-08-22 23:15:42 +0000409 PyObject *f = sysget("stderr");
410 err_clear();
Guido van Rossum22a85e51996-09-11 22:51:57 +0000411 if (f != NULL) {
412 writestring("exception in ", f);
413 writestring(PyString_AsString(
414 inst->in_class->cl_name), f);
415 writestring(".__del__() ignored\n", f);
416 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000417 }
418 else
419 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000420 }
421 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000422 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000423 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000424 if (--inst->ob_refcnt > 0) {
425#ifdef COUNT_ALLOCS
426 inst->ob_type->tp_free--;
427#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000428 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000429 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000430#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000431#ifdef COUNT_ALLOCS
432 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
433#endif
434 UNREF(inst);
435 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000436#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000437 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000438 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000439 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440}
441
Guido van Rossume7737541994-09-05 07:31:41 +0000442static object *
443instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000444 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000445 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446{
Guido van Rossum94308391991-10-20 20:11:48 +0000447 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000448 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000449 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000450 if (sname[0] == '_' && sname[1] == '_') {
451 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000452 if (getrestricted()) {
453 err_setstr(RuntimeError,
454 "instance.__dict__ not accessible in restricted mode");
455 return NULL;
456 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000457 INCREF(inst->in_dict);
458 return inst->in_dict;
459 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000460 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000461 INCREF(inst->in_class);
462 return (object *)inst->in_class;
463 }
Guido van Rossum94308391991-10-20 20:11:48 +0000464 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000465 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000466 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000467 if (v == NULL) {
468 v = class_lookup(inst->in_class, name, &class);
469 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000470 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000471 return NULL;
472 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000474#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000475 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000476 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000477 if (v == NULL)
478 return NULL;
479 }
480 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000481#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000482 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000483 if (class != NULL) {
484 if (is_funcobject(v)) {
485 object *w = newinstancemethodobject(v, (object *)inst,
486 (object *)class);
487 DECREF(v);
488 v = w;
489 }
490 else if (is_instancemethodobject(v)) {
491 object *im_class = instancemethodgetclass(v);
492 /* Only if classes are compatible */
493 if (issubclass((object *)class, im_class)) {
494 object *im_func = instancemethodgetfunc(v);
495 object *w = newinstancemethodobject(im_func,
496 (object *)inst, im_class);
497 DECREF(v);
498 v = w;
499 }
500 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000501 }
502 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503}
504
Guido van Rossume7737541994-09-05 07:31:41 +0000505static object *
506instance_getattr(inst, name)
507 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000508 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000509{
510 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000511 res = instance_getattr1(inst, name);
512 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
513 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000514 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000515 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000516 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000517 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000518 res = call_object(func, args);
519 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000520 }
521 return res;
522}
523
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524static int
Guido van Rossume7737541994-09-05 07:31:41 +0000525instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000526 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000527 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528 object *v;
529{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000530#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000531 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000532 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000533 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000534 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000535#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000536 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000537 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000538 if (rv < 0)
539 err_setstr(AttributeError,
540 "delete non-existing instance attribute");
541 return rv;
542 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000544 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545}
546
Guido van Rossume7737541994-09-05 07:31:41 +0000547static int
548instance_setattr(inst, name, v)
549 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000550 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000551 object *v;
552{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000553 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000554 char *sname = getstringvalue(name);
555 if (sname[0] == '_' && sname[1] == '_'
556 && (strcmp(sname, "__dict__") == 0 ||
557 strcmp(sname, "__class__") == 0)) {
Guido van Rossume5920bc1996-08-26 14:58:03 +0000558 int n = getstringsize(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000559 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000560 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000561 return -1;
562 }
Guido van Rossume7737541994-09-05 07:31:41 +0000563 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000564 if (v == NULL)
565 func = inst->in_class->cl_delattr;
566 else
567 func = inst->in_class->cl_setattr;
568 if (func == NULL)
569 return instance_setattr1(inst, name, v);
570 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000571 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000572 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000573 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000574 if (args == NULL)
575 return -1;
576 res = call_object(func, args);
577 DECREF(args);
578 if (res == NULL)
579 return -1;
580 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000581 return 0;
582}
583
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000585instance_repr(inst)
586 instanceobject *inst;
587{
588 object *func;
589 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000590 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000591
Guido van Rossum2878a691996-08-09 20:53:24 +0000592 if (reprstr == NULL)
593 reprstr = newstringobject("__repr__");
594 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000595 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000596 char buf[140];
597 object *classname = inst->in_class->cl_name;
598 char *cname;
599 if (classname != NULL && is_stringobject(classname))
600 cname = getstringvalue(classname);
601 else
602 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000603 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000604 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000605 return newstringobject(buf);
606 }
607 res = call_object(func, (object *)NULL);
608 DECREF(func);
609 return res;
610}
611
Guido van Rossume7d444f1995-01-07 12:35:18 +0000612static object *
613instance_compare1(inst, other)
614 object *inst, *other;
615{
616 return instancebinop(inst, other, "__cmp__", "__rcmp__",
617 instance_compare1);
618}
619
Guido van Rossum9bfef441993-03-29 10:43:31 +0000620static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000621instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000622 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000623{
Guido van Rossum03093a21994-09-28 15:51:32 +0000624 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000625 long outcome;
626 result = instance_compare1(inst, other);
627 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000628 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000629 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000630 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000631 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000632 outcome = getintvalue(result);
633 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000634 if (outcome < 0)
635 return -1;
636 else if (outcome > 0)
637 return 1;
638 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000639}
640
Guido van Rossum9bfef441993-03-29 10:43:31 +0000641static long
642instance_hash(inst)
643 instanceobject *inst;
644{
645 object *func;
646 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000647 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000648 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000649
Guido van Rossum2878a691996-08-09 20:53:24 +0000650 if (hashstr == NULL)
651 hashstr = newstringobject("__hash__");
652 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000653 if (func == NULL) {
654 /* If there is no __cmp__ method, we hash on the address.
655 If a __cmp__ method exists, there must be a __hash__. */
656 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000657 if (cmpstr == NULL)
658 cmpstr = newstringobject("__cmp__");
659 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000660 if (func == NULL) {
661 err_clear();
662 outcome = (long)inst;
663 if (outcome == -1)
664 outcome = -2;
665 return outcome;
666 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000667 err_setstr(TypeError, "unhashable instance");
668 return -1;
669 }
670 res = call_object(func, (object *)NULL);
671 DECREF(func);
672 if (res == NULL)
673 return -1;
674 if (is_intobject(res)) {
675 outcome = getintvalue(res);
676 if (outcome == -1)
677 outcome = -2;
678 }
679 else {
680 err_setstr(TypeError, "__hash__() should return an int");
681 outcome = -1;
682 }
683 DECREF(res);
684 return outcome;
685}
686
Guido van Rossum2878a691996-08-09 20:53:24 +0000687static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
688
Guido van Rossum9bfef441993-03-29 10:43:31 +0000689static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000690instance_length(inst)
691 instanceobject *inst;
692{
693 object *func;
694 object *res;
695 int outcome;
696
Guido van Rossum2878a691996-08-09 20:53:24 +0000697 if (lenstr == NULL)
698 lenstr = newstringobject("__len__");
699 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000700 if (func == NULL)
701 return -1;
702 res = call_object(func, (object *)NULL);
703 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000704 if (res == NULL)
705 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000706 if (is_intobject(res)) {
707 outcome = getintvalue(res);
708 if (outcome < 0)
709 err_setstr(ValueError, "__len__() should return >= 0");
710 }
711 else {
712 err_setstr(TypeError, "__len__() should return an int");
713 outcome = -1;
714 }
715 DECREF(res);
716 return outcome;
717}
718
Guido van Rossum9bfef441993-03-29 10:43:31 +0000719static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000720instance_subscript(inst, key)
721 instanceobject *inst;
722 object *key;
723{
724 object *func;
725 object *arg;
726 object *res;
727
Guido van Rossum2878a691996-08-09 20:53:24 +0000728 if (getitemstr == NULL)
729 getitemstr = newstringobject("__getitem__");
730 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000731 if (func == NULL)
732 return NULL;
733 arg = mkvalue("(O)", key);
734 if (arg == NULL) {
735 DECREF(func);
736 return NULL;
737 }
738 res = call_object(func, arg);
739 DECREF(func);
740 DECREF(arg);
741 return res;
742}
743
Guido van Rossum9bfef441993-03-29 10:43:31 +0000744static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745instance_ass_subscript(inst, key, value)
746 instanceobject*inst;
747 object *key;
748 object *value;
749{
750 object *func;
751 object *arg;
752 object *res;
753
Guido van Rossum2878a691996-08-09 20:53:24 +0000754 if (value == NULL) {
755 if (delitemstr == NULL)
756 delitemstr = newstringobject("__delitem__");
757 func = instance_getattr(inst, delitemstr);
758 }
759 else {
760 if (setitemstr == NULL)
761 setitemstr = newstringobject("__setitem__");
762 func = instance_getattr(inst, setitemstr);
763 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764 if (func == NULL)
765 return -1;
766 if (value == NULL)
767 arg = mkvalue("(O)", key);
768 else
769 arg = mkvalue("(OO)", key, value);
770 if (arg == NULL) {
771 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000772 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000773 }
774 res = call_object(func, arg);
775 DECREF(func);
776 DECREF(arg);
777 if (res == NULL)
778 return -1;
779 DECREF(res);
780 return 0;
781}
782
Guido van Rossum9bfef441993-03-29 10:43:31 +0000783static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784 (inquiry)instance_length, /*mp_length*/
785 (binaryfunc)instance_subscript, /*mp_subscript*/
786 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000787};
788
789static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000790instance_item(inst, i)
791 instanceobject *inst;
792 int i;
793{
794 object *func, *arg, *res;
795
Guido van Rossum2878a691996-08-09 20:53:24 +0000796 if (getitemstr == NULL)
797 getitemstr = newstringobject("__getitem__");
798 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799 if (func == NULL)
800 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000801 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000802 if (arg == NULL) {
803 DECREF(func);
804 return NULL;
805 }
806 res = call_object(func, arg);
807 DECREF(func);
808 DECREF(arg);
809 return res;
810}
811
812static object *
813instance_slice(inst, i, j)
814 instanceobject *inst;
815 int i, j;
816{
817 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000818 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000819
Guido van Rossum2878a691996-08-09 20:53:24 +0000820 if (getslicestr == NULL)
821 getslicestr = newstringobject("__getslice__");
822 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000823 if (func == NULL)
824 return NULL;
825 arg = mkvalue("(ii)", i, j);
826 if (arg == NULL) {
827 DECREF(func);
828 return NULL;
829 }
830 res = call_object(func, arg);
831 DECREF(func);
832 DECREF(arg);
833 return res;
834}
835
836static int
837instance_ass_item(inst, i, item)
838 instanceobject *inst;
839 int i;
840 object *item;
841{
842 object *func, *arg, *res;
843
Guido van Rossum2878a691996-08-09 20:53:24 +0000844 if (item == NULL) {
845 if (delitemstr == NULL)
846 delitemstr = newstringobject("__delitem__");
847 func = instance_getattr(inst, delitemstr);
848 }
849 else {
850 if (setitemstr == NULL)
851 setitemstr = newstringobject("__setitem__");
852 func = instance_getattr(inst, setitemstr);
853 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000855 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 if (item == NULL)
857 arg = mkvalue("i", i);
858 else
859 arg = mkvalue("(iO)", i, item);
860 if (arg == NULL) {
861 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000862 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000863 }
864 res = call_object(func, arg);
865 DECREF(func);
866 DECREF(arg);
867 if (res == NULL)
868 return -1;
869 DECREF(res);
870 return 0;
871}
872
873static int
874instance_ass_slice(inst, i, j, value)
875 instanceobject *inst;
876 int i, j;
877 object *value;
878{
879 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000880 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000881
Guido van Rossum2878a691996-08-09 20:53:24 +0000882 if (value == NULL) {
883 if (delslicestr == NULL)
884 delslicestr = newstringobject("__delslice__");
885 func = instance_getattr(inst, delslicestr);
886 }
887 else {
888 if (setslicestr == NULL)
889 setslicestr = newstringobject("__setslice__");
890 func = instance_getattr(inst, setslicestr);
891 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000892 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000893 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894 if (value == NULL)
895 arg = mkvalue("(ii)", i, j);
896 else
897 arg = mkvalue("(iiO)", i, j, value);
898 if (arg == NULL) {
899 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000900 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000901 }
902 res = call_object(func, arg);
903 DECREF(func);
904 DECREF(arg);
905 if (res == NULL)
906 return -1;
907 DECREF(res);
908 return 0;
909}
910
911static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000913 0, /*sq_concat*/
914 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000915 (intargfunc)instance_item, /*sq_item*/
916 (intintargfunc)instance_slice, /*sq_slice*/
917 (intobjargproc)instance_ass_item, /*sq_ass_item*/
918 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919};
920
921static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922generic_unary_op(self, methodname)
923 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000924 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000925{
926 object *func, *res;
927
928 if ((func = instance_getattr(self, methodname)) == NULL)
929 return NULL;
930 res = call_object(func, (object *)NULL);
931 DECREF(func);
932 return res;
933}
934
Guido van Rossum03093a21994-09-28 15:51:32 +0000935
936/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000937static int halfbinop Py_PROTO((object *, object *, char *, object **,
938 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000939
940
941/* Implement a binary operator involving at least one class instance. */
942
943object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000944instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000945 object *v;
946 object *w;
947 char *opname;
948 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000949 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000950{
951 char buf[256];
952 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000953 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000954 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000955 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000956 return result;
957 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
958 err_setstr(TypeError, buf);
959 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000960}
961
Guido van Rossum03093a21994-09-28 15:51:32 +0000962
963/* Try one half of a binary operator involving a class instance.
964 Return value:
965 -1 if an exception is to be reported right away
966 0 if we have a valid result
967 1 if we could try another operation
968*/
969
Guido van Rossum2878a691996-08-09 20:53:24 +0000970static object *coerce_obj;
971
Guido van Rossum03093a21994-09-28 15:51:32 +0000972static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000973halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000974 object *v;
975 object *w;
976 char *opname;
977 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000978 object * (*thisfunc) PROTO((object *, object *));
979 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000980{
981 object *func;
982 object *args;
983 object *coerce;
984 object *coerced = NULL;
985 object *v1;
986
987 if (!is_instanceobject(v))
988 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000989 if (coerce_obj == NULL) {
990 coerce_obj = newstringobject("__coerce__");
991 if (coerce_obj == NULL)
992 return -1;
993 }
994 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000995 if (coerce == NULL) {
996 err_clear();
997 }
998 else {
999 args = mkvalue("(O)", w);
1000 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001001 return -1;
1002 }
1003 coerced = call_object(coerce, args);
1004 DECREF(args);
1005 DECREF(coerce);
1006 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001007 return -1;
1008 }
1009 if (coerced == None) {
1010 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001011 return 1;
1012 }
1013 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1014 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001015 err_setstr(TypeError,
1016 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001017 return -1;
1018 }
1019 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001020 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001021 if (v1 != v) {
1022 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001023 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1024 if (swapped)
1025 *r_result = (*thisfunc)(w, v);
1026 else
1027 *r_result = (*thisfunc)(v, w);
1028 DECREF(coerced);
1029 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001030 }
1031 }
1032 w = gettupleitem(coerced, 1);
1033 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001034 func = getattr(v, opname);
1035 if (func == NULL) {
1036 XDECREF(coerced);
1037 if (err_occurred() != AttributeError)
1038 return -1;
1039 err_clear();
1040 return 1;
1041 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001042 args = mkvalue("(O)", w);
1043 if (args == NULL) {
1044 DECREF(func);
1045 XDECREF(coerced);
1046 return -1;
1047 }
1048 *r_result = call_object(func, args);
1049 DECREF(args);
1050 DECREF(func);
1051 XDECREF(coerced);
1052 return *r_result == NULL ? -1 : 0;
1053}
1054
Guido van Rossum879c5811995-01-10 15:24:06 +00001055static int
1056instance_coerce(pv, pw)
1057 object **pv;
1058 object **pw;
1059{
1060 object *v = *pv;
1061 object *w = *pw;
1062 object *coerce;
1063 object *args;
1064 object *coerced;
1065
Guido van Rossum2878a691996-08-09 20:53:24 +00001066 if (coerce_obj == NULL) {
1067 coerce_obj = newstringobject("__coerce__");
1068 if (coerce_obj == NULL)
1069 return -1;
1070 }
1071 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001072 if (coerce == NULL) {
1073 /* No __coerce__ method: always OK */
1074 err_clear();
1075 INCREF(v);
1076 INCREF(w);
1077 return 0;
1078 }
1079 /* Has __coerce__ method: call it */
1080 args = mkvalue("(O)", w);
1081 if (args == NULL) {
1082 return -1;
1083 }
1084 coerced = call_object(coerce, args);
1085 DECREF(args);
1086 DECREF(coerce);
1087 if (coerced == NULL) {
1088 /* __coerce__ call raised an exception */
1089 return -1;
1090 }
1091 if (coerced == None) {
1092 /* __coerce__ says "I can't do it" */
1093 DECREF(coerced);
1094 return 1;
1095 }
1096 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1097 /* __coerce__ return value is malformed */
1098 DECREF(coerced);
1099 err_setstr(TypeError,
1100 "coercion should return None or 2-tuple");
1101 return -1;
1102 }
1103 /* __coerce__ returned two new values */
1104 *pv = gettupleitem(coerced, 0);
1105 *pw = gettupleitem(coerced, 1);
1106 INCREF(*pv);
1107 INCREF(*pw);
1108 DECREF(coerced);
1109 return 0;
1110}
1111
Guido van Rossum03093a21994-09-28 15:51:32 +00001112
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113#define UNARY(funcname, methodname) \
1114static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001115 static object *o; \
1116 if (o == NULL) o = newstringobject(methodname); \
1117 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118}
1119
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120UNARY(instance_neg, "__neg__")
1121UNARY(instance_pos, "__pos__")
1122UNARY(instance_abs, "__abs__")
1123
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125instance_nonzero(self)
1126 instanceobject *self;
1127{
1128 object *func, *res;
1129 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001130 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001131
Guido van Rossum2878a691996-08-09 20:53:24 +00001132 if (nonzerostr == NULL)
1133 nonzerostr = newstringobject("__nonzero__");
1134 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001135 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001136 if (lenstr == NULL)
1137 lenstr = newstringobject("__len__");
1138 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139 err_clear();
1140 /* Fall back to the default behavior:
1141 all instances are nonzero */
1142 return 1;
1143 }
1144 }
1145 res = call_object(func, (object *)NULL);
1146 DECREF(func);
1147 if (res == NULL)
1148 return -1;
1149 if (!is_intobject(res)) {
1150 DECREF(res);
1151 err_setstr(TypeError, "__nonzero__ should return an int");
1152 return -1;
1153 }
1154 outcome = getintvalue(res);
1155 DECREF(res);
1156 if (outcome < 0) {
1157 err_setstr(ValueError, "__nonzero__ should return >= 0");
1158 return -1;
1159 }
1160 return outcome > 0;
1161}
1162
1163UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001164UNARY(instance_int, "__int__")
1165UNARY(instance_long, "__long__")
1166UNARY(instance_float, "__float__")
1167UNARY(instance_oct, "__oct__")
1168UNARY(instance_hex, "__hex__")
1169
Guido van Rossum03093a21994-09-28 15:51:32 +00001170/* This version is for ternary calls only (z != None) */
1171static object *
1172instance_pow(v, w, z)
1173 object *v;
1174 object *w;
1175 object *z;
1176{
1177 /* XXX Doesn't do coercions... */
1178 object *func;
1179 object *args;
1180 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001181 static object *powstr;
1182
1183 if (powstr == NULL)
1184 powstr = newstringobject("__pow__");
1185 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001186 if (func == NULL)
1187 return NULL;
1188 args = mkvalue("(OO)", w, z);
1189 if (args == NULL) {
1190 DECREF(func);
1191 return NULL;
1192 }
1193 result = call_object(func, args);
1194 DECREF(func);
1195 DECREF(args);
1196 return result;
1197}
1198
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001200 0, /*nb_add*/
1201 0, /*nb_subtract*/
1202 0, /*nb_multiply*/
1203 0, /*nb_divide*/
1204 0, /*nb_remainder*/
1205 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001206 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001207 (unaryfunc)instance_neg, /*nb_negative*/
1208 (unaryfunc)instance_pos, /*nb_positive*/
1209 (unaryfunc)instance_abs, /*nb_absolute*/
1210 (inquiry)instance_nonzero, /*nb_nonzero*/
1211 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001212 0, /*nb_lshift*/
1213 0, /*nb_rshift*/
1214 0, /*nb_and*/
1215 0, /*nb_xor*/
1216 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001217 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001218 (unaryfunc)instance_int, /*nb_int*/
1219 (unaryfunc)instance_long, /*nb_long*/
1220 (unaryfunc)instance_float, /*nb_float*/
1221 (unaryfunc)instance_oct, /*nb_oct*/
1222 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001223};
1224
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001225typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001226 OB_HEAD_INIT(&Typetype)
1227 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001228 "instance",
1229 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001230 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001231 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001232 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001233 0, /*tp_getattr*/
1234 0, /*tp_setattr*/
1235 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001236 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001237 &instance_as_number, /*tp_as_number*/
1238 &instance_as_sequence, /*tp_as_sequence*/
1239 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001240 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001241 0, /*tp_call*/
1242 0, /*tp_str*/
1243 (getattrofunc)instance_getattr, /*tp_getattro*/
1244 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001245};
1246
1247
Guido van Rossum81daa321993-05-20 14:24:46 +00001248/* Instance method objects are used for two purposes:
1249 (a) as bound instance methods (returned by instancename.methodname)
1250 (b) as unbound methods (returned by ClassName.methodname)
1251 In case (b), im_self is NULL
1252*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001253
1254typedef struct {
1255 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001256 object *im_func; /* The function implementing the method */
1257 object *im_self; /* The instance it is bound to, or NULL */
1258 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001259} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001260
1261object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001262newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001263 object *func;
1264 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001265 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001266{
Guido van Rossume8122f11991-05-05 20:03:07 +00001267 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001268 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001269 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270 return NULL;
1271 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001272 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1273 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001274 return NULL;
1275 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001276 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001277 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001278 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001279 INCREF(class);
1280 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001281 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282}
1283
1284object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001285instancemethodgetfunc(im)
1286 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001287{
Guido van Rossume8122f11991-05-05 20:03:07 +00001288 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001289 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001290 return NULL;
1291 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001292 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293}
1294
1295object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001296instancemethodgetself(im)
1297 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001298{
Guido van Rossume8122f11991-05-05 20:03:07 +00001299 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001300 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301 return NULL;
1302 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001303 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001304}
1305
Guido van Rossum81daa321993-05-20 14:24:46 +00001306object *
1307instancemethodgetclass(im)
1308 register object *im;
1309{
1310 if (!is_instancemethodobject(im)) {
1311 err_badcall();
1312 return NULL;
1313 }
1314 return ((instancemethodobject *)im)->im_class;
1315}
1316
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001317/* Class method methods */
1318
Guido van Rossume8122f11991-05-05 20:03:07 +00001319#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320
Guido van Rossume8122f11991-05-05 20:03:07 +00001321static struct memberlist instancemethod_memberlist[] = {
1322 {"im_func", T_OBJECT, OFF(im_func)},
1323 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001324 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001325 /* Dummies that are not handled by getattr() except for __members__ */
1326 {"__doc__", T_INT, 0},
1327 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001328 {NULL} /* Sentinel */
1329};
1330
1331static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001332instancemethod_getattr(im, name)
1333 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001334 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335{
Guido van Rossum2878a691996-08-09 20:53:24 +00001336 char *sname = getstringvalue(name);
1337 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001338 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001339 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001340 INCREF(func->func_name);
1341 return func->func_name;
1342 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001343 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001344 INCREF(func->func_doc);
1345 return func->func_doc;
1346 }
1347 }
1348 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001349 err_setstr(RuntimeError,
1350 "instance-method attributes not accessible in restricted mode");
1351 return NULL;
1352 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001353 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001354}
1355
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001356static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001357instancemethod_dealloc(im)
1358 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001359{
Guido van Rossume8122f11991-05-05 20:03:07 +00001360 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001361 XDECREF(im->im_self);
1362 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001363 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001364}
1365
Guido van Rossumebc8c511992-09-03 20:39:51 +00001366static int
1367instancemethod_compare(a, b)
1368 instancemethodobject *a, *b;
1369{
Guido van Rossume9df7271995-04-06 14:46:51 +00001370 if (a->im_self != b->im_self)
1371 return (a->im_self < b->im_self) ? -1 : 1;
1372 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001373}
1374
Guido van Rossum25831651993-05-19 14:50:45 +00001375static object *
1376instancemethod_repr(a)
1377 instancemethodobject *a;
1378{
1379 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001380 instanceobject *self = (instanceobject *)(a->im_self);
1381 funcobject *func = (funcobject *)(a->im_func);
1382 classobject *class = (classobject *)(a->im_class);
1383 object *fclassname, *iclassname, *funcname;
1384 char *fcname, *icname, *fname;
1385 fclassname = class->cl_name;
1386 funcname = func->func_name;
1387 if (fclassname != NULL && is_stringobject(fclassname))
1388 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001389 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001390 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001391 if (funcname != NULL && is_stringobject(funcname))
1392 fname = getstringvalue(funcname);
1393 else
1394 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001395 if (self == NULL)
1396 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1397 else {
1398 iclassname = self->in_class->cl_name;
1399 if (iclassname != NULL && is_stringobject(iclassname))
1400 icname = getstringvalue(iclassname);
1401 else
1402 icname = "?";
1403 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1404 fcname, fname, icname, (long)self);
1405 }
Guido van Rossum25831651993-05-19 14:50:45 +00001406 return newstringobject(buf);
1407}
1408
Guido van Rossum9bfef441993-03-29 10:43:31 +00001409static long
1410instancemethod_hash(a)
1411 instancemethodobject *a;
1412{
1413 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001414 if (a->im_self == NULL)
1415 x = hashobject(None);
1416 else
1417 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001418 if (x == -1)
1419 return -1;
1420 y = hashobject(a->im_func);
1421 if (y == -1)
1422 return -1;
1423 return x ^ y;
1424}
1425
Guido van Rossume8122f11991-05-05 20:03:07 +00001426typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001427 OB_HEAD_INIT(&Typetype)
1428 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001429 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001430 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001431 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001433 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001434 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001435 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001436 (cmpfunc)instancemethod_compare, /*tp_compare*/
1437 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001438 0, /*tp_as_number*/
1439 0, /*tp_as_sequence*/
1440 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001441 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001442 0, /*tp_call*/
1443 0, /*tp_str*/
1444 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1445 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001446};