blob: 9b12d1876a836b94d9ec8d636e6e5d2c206d7462 [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();
409 if (f != NULL)
410 writestring(
411 "exception in __del__ method ignored\n", f);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000412 }
413 else
414 DECREF(res);
Guido van Rossum25831651993-05-19 14:50:45 +0000415 }
416 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000417 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000418 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000419 if (--inst->ob_refcnt > 0) {
420#ifdef COUNT_ALLOCS
421 inst->ob_type->tp_free--;
422#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000423 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000424 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000425#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000426#ifdef COUNT_ALLOCS
427 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
428#endif
429 UNREF(inst);
430 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000431#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000432 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000433 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000434 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435}
436
Guido van Rossume7737541994-09-05 07:31:41 +0000437static object *
438instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000439 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000440 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Guido van Rossum94308391991-10-20 20:11:48 +0000442 register object *v;
Guido van Rossum2878a691996-08-09 20:53:24 +0000443 register char *sname = getstringvalue(name);
Guido van Rossum81daa321993-05-20 14:24:46 +0000444 classobject *class;
Guido van Rossum2878a691996-08-09 20:53:24 +0000445 if (sname[0] == '_' && sname[1] == '_') {
446 if (strcmp(sname, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000447 if (getrestricted()) {
448 err_setstr(RuntimeError,
449 "instance.__dict__ not accessible in restricted mode");
450 return NULL;
451 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000452 INCREF(inst->in_dict);
453 return inst->in_dict;
454 }
Guido van Rossum2878a691996-08-09 20:53:24 +0000455 if (strcmp(sname, "__class__") == 0) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000456 INCREF(inst->in_class);
457 return (object *)inst->in_class;
458 }
Guido van Rossum94308391991-10-20 20:11:48 +0000459 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000460 class = NULL;
Guido van Rossum2878a691996-08-09 20:53:24 +0000461 v = mappinglookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000462 if (v == NULL) {
463 v = class_lookup(inst->in_class, name, &class);
464 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000465 err_setval(AttributeError, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000466 return NULL;
467 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000469#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000470 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000471 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000472 if (v == NULL)
473 return NULL;
474 }
475 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000476#endif
Guido van Rossumb3f72581993-05-21 19:56:10 +0000477 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000478 if (class != NULL) {
479 if (is_funcobject(v)) {
480 object *w = newinstancemethodobject(v, (object *)inst,
481 (object *)class);
482 DECREF(v);
483 v = w;
484 }
485 else if (is_instancemethodobject(v)) {
486 object *im_class = instancemethodgetclass(v);
487 /* Only if classes are compatible */
488 if (issubclass((object *)class, im_class)) {
489 object *im_func = instancemethodgetfunc(v);
490 object *w = newinstancemethodobject(im_func,
491 (object *)inst, im_class);
492 DECREF(v);
493 v = w;
494 }
495 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000496 }
497 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498}
499
Guido van Rossume7737541994-09-05 07:31:41 +0000500static object *
501instance_getattr(inst, name)
502 register instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000503 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000504{
505 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000506 res = instance_getattr1(inst, name);
507 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
508 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000509 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000510 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000511 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000512 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000513 res = call_object(func, args);
514 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000515 }
516 return res;
517}
518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519static int
Guido van Rossume7737541994-09-05 07:31:41 +0000520instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000521 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000522 object *name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000523 object *v;
524{
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000525#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +0000526 object *ac;
Guido van Rossum2878a691996-08-09 20:53:24 +0000527 ac = mappinglookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000528 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000529 return setaccessvalue(ac, getowner(), v);
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000530#endif
Guido van Rossum94472a01992-09-04 09:45:18 +0000531 if (v == NULL) {
Guido van Rossum2878a691996-08-09 20:53:24 +0000532 int rv = mappingremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000533 if (rv < 0)
534 err_setstr(AttributeError,
535 "delete non-existing instance attribute");
536 return rv;
537 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000539 return mappinginsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540}
541
Guido van Rossume7737541994-09-05 07:31:41 +0000542static int
543instance_setattr(inst, name, v)
544 instanceobject *inst;
Guido van Rossum2878a691996-08-09 20:53:24 +0000545 object *name;
Guido van Rossume7737541994-09-05 07:31:41 +0000546 object *v;
547{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000548 object *func, *args, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000549 char *sname = getstringvalue(name);
550 if (sname[0] == '_' && sname[1] == '_'
551 && (strcmp(sname, "__dict__") == 0 ||
552 strcmp(sname, "__class__") == 0)) {
Guido van Rossume5920bc1996-08-26 14:58:03 +0000553 int n = getstringsize(name);
Guido van Rossum2878a691996-08-09 20:53:24 +0000554 if (sname[n-1] == '_' && sname[n-2] == '_') {
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000555 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000556 return -1;
557 }
Guido van Rossume7737541994-09-05 07:31:41 +0000558 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000559 if (v == NULL)
560 func = inst->in_class->cl_delattr;
561 else
562 func = inst->in_class->cl_setattr;
563 if (func == NULL)
564 return instance_setattr1(inst, name, v);
565 if (v == NULL)
Guido van Rossum2878a691996-08-09 20:53:24 +0000566 args = mkvalue("(OO)", inst, name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000567 else
Guido van Rossum2878a691996-08-09 20:53:24 +0000568 args = mkvalue("(OOO)", inst, name, v);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000569 if (args == NULL)
570 return -1;
571 res = call_object(func, args);
572 DECREF(args);
573 if (res == NULL)
574 return -1;
575 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000576 return 0;
577}
578
Guido van Rossum9bfef441993-03-29 10:43:31 +0000579static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000580instance_repr(inst)
581 instanceobject *inst;
582{
583 object *func;
584 object *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000585 static object *reprstr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000586
Guido van Rossum2878a691996-08-09 20:53:24 +0000587 if (reprstr == NULL)
588 reprstr = newstringobject("__repr__");
589 func = instance_getattr(inst, reprstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000590 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000591 char buf[140];
592 object *classname = inst->in_class->cl_name;
593 char *cname;
594 if (classname != NULL && is_stringobject(classname))
595 cname = getstringvalue(classname);
596 else
597 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000598 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000599 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000600 return newstringobject(buf);
601 }
602 res = call_object(func, (object *)NULL);
603 DECREF(func);
604 return res;
605}
606
Guido van Rossume7d444f1995-01-07 12:35:18 +0000607static object *
608instance_compare1(inst, other)
609 object *inst, *other;
610{
611 return instancebinop(inst, other, "__cmp__", "__rcmp__",
612 instance_compare1);
613}
614
Guido van Rossum9bfef441993-03-29 10:43:31 +0000615static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000616instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000617 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000618{
Guido van Rossum03093a21994-09-28 15:51:32 +0000619 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000620 long outcome;
621 result = instance_compare1(inst, other);
622 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000623 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000624 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000625 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000626 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000627 outcome = getintvalue(result);
628 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000629 if (outcome < 0)
630 return -1;
631 else if (outcome > 0)
632 return 1;
633 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000634}
635
Guido van Rossum9bfef441993-03-29 10:43:31 +0000636static long
637instance_hash(inst)
638 instanceobject *inst;
639{
640 object *func;
641 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000642 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +0000643 static object *hashstr, *cmpstr;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000644
Guido van Rossum2878a691996-08-09 20:53:24 +0000645 if (hashstr == NULL)
646 hashstr = newstringobject("__hash__");
647 func = instance_getattr(inst, hashstr);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000648 if (func == NULL) {
649 /* If there is no __cmp__ method, we hash on the address.
650 If a __cmp__ method exists, there must be a __hash__. */
651 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +0000652 if (cmpstr == NULL)
653 cmpstr = newstringobject("__cmp__");
654 func = instance_getattr(inst, cmpstr);
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000655 if (func == NULL) {
656 err_clear();
657 outcome = (long)inst;
658 if (outcome == -1)
659 outcome = -2;
660 return outcome;
661 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000662 err_setstr(TypeError, "unhashable instance");
663 return -1;
664 }
665 res = call_object(func, (object *)NULL);
666 DECREF(func);
667 if (res == NULL)
668 return -1;
669 if (is_intobject(res)) {
670 outcome = getintvalue(res);
671 if (outcome == -1)
672 outcome = -2;
673 }
674 else {
675 err_setstr(TypeError, "__hash__() should return an int");
676 outcome = -1;
677 }
678 DECREF(res);
679 return outcome;
680}
681
Guido van Rossum2878a691996-08-09 20:53:24 +0000682static object *getitemstr, *setitemstr, *delitemstr, *lenstr;
683
Guido van Rossum9bfef441993-03-29 10:43:31 +0000684static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000685instance_length(inst)
686 instanceobject *inst;
687{
688 object *func;
689 object *res;
690 int outcome;
691
Guido van Rossum2878a691996-08-09 20:53:24 +0000692 if (lenstr == NULL)
693 lenstr = newstringobject("__len__");
694 func = instance_getattr(inst, lenstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000695 if (func == NULL)
696 return -1;
697 res = call_object(func, (object *)NULL);
698 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000699 if (res == NULL)
700 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000701 if (is_intobject(res)) {
702 outcome = getintvalue(res);
703 if (outcome < 0)
704 err_setstr(ValueError, "__len__() should return >= 0");
705 }
706 else {
707 err_setstr(TypeError, "__len__() should return an int");
708 outcome = -1;
709 }
710 DECREF(res);
711 return outcome;
712}
713
Guido van Rossum9bfef441993-03-29 10:43:31 +0000714static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000715instance_subscript(inst, key)
716 instanceobject *inst;
717 object *key;
718{
719 object *func;
720 object *arg;
721 object *res;
722
Guido van Rossum2878a691996-08-09 20:53:24 +0000723 if (getitemstr == NULL)
724 getitemstr = newstringobject("__getitem__");
725 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726 if (func == NULL)
727 return NULL;
728 arg = mkvalue("(O)", key);
729 if (arg == NULL) {
730 DECREF(func);
731 return NULL;
732 }
733 res = call_object(func, arg);
734 DECREF(func);
735 DECREF(arg);
736 return res;
737}
738
Guido van Rossum9bfef441993-03-29 10:43:31 +0000739static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740instance_ass_subscript(inst, key, value)
741 instanceobject*inst;
742 object *key;
743 object *value;
744{
745 object *func;
746 object *arg;
747 object *res;
748
Guido van Rossum2878a691996-08-09 20:53:24 +0000749 if (value == NULL) {
750 if (delitemstr == NULL)
751 delitemstr = newstringobject("__delitem__");
752 func = instance_getattr(inst, delitemstr);
753 }
754 else {
755 if (setitemstr == NULL)
756 setitemstr = newstringobject("__setitem__");
757 func = instance_getattr(inst, setitemstr);
758 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 if (func == NULL)
760 return -1;
761 if (value == NULL)
762 arg = mkvalue("(O)", key);
763 else
764 arg = mkvalue("(OO)", key, value);
765 if (arg == NULL) {
766 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000767 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768 }
769 res = call_object(func, arg);
770 DECREF(func);
771 DECREF(arg);
772 if (res == NULL)
773 return -1;
774 DECREF(res);
775 return 0;
776}
777
Guido van Rossum9bfef441993-03-29 10:43:31 +0000778static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000779 (inquiry)instance_length, /*mp_length*/
780 (binaryfunc)instance_subscript, /*mp_subscript*/
781 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782};
783
784static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785instance_item(inst, i)
786 instanceobject *inst;
787 int i;
788{
789 object *func, *arg, *res;
790
Guido van Rossum2878a691996-08-09 20:53:24 +0000791 if (getitemstr == NULL)
792 getitemstr = newstringobject("__getitem__");
793 func = instance_getattr(inst, getitemstr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794 if (func == NULL)
795 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000796 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797 if (arg == NULL) {
798 DECREF(func);
799 return NULL;
800 }
801 res = call_object(func, arg);
802 DECREF(func);
803 DECREF(arg);
804 return res;
805}
806
807static object *
808instance_slice(inst, i, j)
809 instanceobject *inst;
810 int i, j;
811{
812 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000813 static object *getslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000814
Guido van Rossum2878a691996-08-09 20:53:24 +0000815 if (getslicestr == NULL)
816 getslicestr = newstringobject("__getslice__");
817 func = instance_getattr(inst, getslicestr);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 if (func == NULL)
819 return NULL;
820 arg = mkvalue("(ii)", i, j);
821 if (arg == NULL) {
822 DECREF(func);
823 return NULL;
824 }
825 res = call_object(func, arg);
826 DECREF(func);
827 DECREF(arg);
828 return res;
829}
830
831static int
832instance_ass_item(inst, i, item)
833 instanceobject *inst;
834 int i;
835 object *item;
836{
837 object *func, *arg, *res;
838
Guido van Rossum2878a691996-08-09 20:53:24 +0000839 if (item == NULL) {
840 if (delitemstr == NULL)
841 delitemstr = newstringobject("__delitem__");
842 func = instance_getattr(inst, delitemstr);
843 }
844 else {
845 if (setitemstr == NULL)
846 setitemstr = newstringobject("__setitem__");
847 func = instance_getattr(inst, setitemstr);
848 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000849 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000850 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851 if (item == NULL)
852 arg = mkvalue("i", i);
853 else
854 arg = mkvalue("(iO)", i, item);
855 if (arg == NULL) {
856 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000857 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 }
859 res = call_object(func, arg);
860 DECREF(func);
861 DECREF(arg);
862 if (res == NULL)
863 return -1;
864 DECREF(res);
865 return 0;
866}
867
868static int
869instance_ass_slice(inst, i, j, value)
870 instanceobject *inst;
871 int i, j;
872 object *value;
873{
874 object *func, *arg, *res;
Guido van Rossum2878a691996-08-09 20:53:24 +0000875 static object *setslicestr, *delslicestr;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000876
Guido van Rossum2878a691996-08-09 20:53:24 +0000877 if (value == NULL) {
878 if (delslicestr == NULL)
879 delslicestr = newstringobject("__delslice__");
880 func = instance_getattr(inst, delslicestr);
881 }
882 else {
883 if (setslicestr == NULL)
884 setslicestr = newstringobject("__setslice__");
885 func = instance_getattr(inst, setslicestr);
886 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000888 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000889 if (value == NULL)
890 arg = mkvalue("(ii)", i, j);
891 else
892 arg = mkvalue("(iiO)", i, j, value);
893 if (arg == NULL) {
894 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000895 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000896 }
897 res = call_object(func, arg);
898 DECREF(func);
899 DECREF(arg);
900 if (res == NULL)
901 return -1;
902 DECREF(res);
903 return 0;
904}
905
906static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000908 0, /*sq_concat*/
909 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910 (intargfunc)instance_item, /*sq_item*/
911 (intintargfunc)instance_slice, /*sq_slice*/
912 (intobjargproc)instance_ass_item, /*sq_ass_item*/
913 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914};
915
916static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917generic_unary_op(self, methodname)
918 instanceobject *self;
Guido van Rossum2878a691996-08-09 20:53:24 +0000919 object *methodname;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920{
921 object *func, *res;
922
923 if ((func = instance_getattr(self, methodname)) == NULL)
924 return NULL;
925 res = call_object(func, (object *)NULL);
926 DECREF(func);
927 return res;
928}
929
Guido van Rossum03093a21994-09-28 15:51:32 +0000930
931/* Forward */
Guido van Rossum2878a691996-08-09 20:53:24 +0000932static int halfbinop Py_PROTO((object *, object *, char *, object **,
933 object * (*) Py_PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000934
935
936/* Implement a binary operator involving at least one class instance. */
937
938object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000939instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000940 object *v;
941 object *w;
942 char *opname;
943 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000944 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000945{
946 char buf[256];
947 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000948 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000949 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000950 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000951 return result;
952 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
953 err_setstr(TypeError, buf);
954 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000955}
956
Guido van Rossum03093a21994-09-28 15:51:32 +0000957
958/* Try one half of a binary operator involving a class instance.
959 Return value:
960 -1 if an exception is to be reported right away
961 0 if we have a valid result
962 1 if we could try another operation
963*/
964
Guido van Rossum2878a691996-08-09 20:53:24 +0000965static object *coerce_obj;
966
Guido van Rossum03093a21994-09-28 15:51:32 +0000967static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000968halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000969 object *v;
970 object *w;
971 char *opname;
972 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000973 object * (*thisfunc) PROTO((object *, object *));
974 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000975{
976 object *func;
977 object *args;
978 object *coerce;
979 object *coerced = NULL;
980 object *v1;
981
982 if (!is_instanceobject(v))
983 return 1;
Guido van Rossum2878a691996-08-09 20:53:24 +0000984 if (coerce_obj == NULL) {
985 coerce_obj = newstringobject("__coerce__");
986 if (coerce_obj == NULL)
987 return -1;
988 }
989 coerce = getattro(v, coerce_obj);
Guido van Rossum03093a21994-09-28 15:51:32 +0000990 if (coerce == NULL) {
991 err_clear();
992 }
993 else {
994 args = mkvalue("(O)", w);
995 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000996 return -1;
997 }
998 coerced = call_object(coerce, args);
999 DECREF(args);
1000 DECREF(coerce);
1001 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +00001002 return -1;
1003 }
1004 if (coerced == None) {
1005 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +00001006 return 1;
1007 }
1008 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1009 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001010 err_setstr(TypeError,
1011 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +00001012 return -1;
1013 }
1014 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001015 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +00001016 if (v1 != v) {
1017 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001018 if (!is_instanceobject(v) && !is_instanceobject(w)) {
1019 if (swapped)
1020 *r_result = (*thisfunc)(w, v);
1021 else
1022 *r_result = (*thisfunc)(v, w);
1023 DECREF(coerced);
1024 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +00001025 }
1026 }
1027 w = gettupleitem(coerced, 1);
1028 }
Guido van Rossume7d444f1995-01-07 12:35:18 +00001029 func = getattr(v, opname);
1030 if (func == NULL) {
1031 XDECREF(coerced);
1032 if (err_occurred() != AttributeError)
1033 return -1;
1034 err_clear();
1035 return 1;
1036 }
Guido van Rossum03093a21994-09-28 15:51:32 +00001037 args = mkvalue("(O)", w);
1038 if (args == NULL) {
1039 DECREF(func);
1040 XDECREF(coerced);
1041 return -1;
1042 }
1043 *r_result = call_object(func, args);
1044 DECREF(args);
1045 DECREF(func);
1046 XDECREF(coerced);
1047 return *r_result == NULL ? -1 : 0;
1048}
1049
Guido van Rossum879c5811995-01-10 15:24:06 +00001050static int
1051instance_coerce(pv, pw)
1052 object **pv;
1053 object **pw;
1054{
1055 object *v = *pv;
1056 object *w = *pw;
1057 object *coerce;
1058 object *args;
1059 object *coerced;
1060
Guido van Rossum2878a691996-08-09 20:53:24 +00001061 if (coerce_obj == NULL) {
1062 coerce_obj = newstringobject("__coerce__");
1063 if (coerce_obj == NULL)
1064 return -1;
1065 }
1066 coerce = getattro(v, coerce_obj);
Guido van Rossum879c5811995-01-10 15:24:06 +00001067 if (coerce == NULL) {
1068 /* No __coerce__ method: always OK */
1069 err_clear();
1070 INCREF(v);
1071 INCREF(w);
1072 return 0;
1073 }
1074 /* Has __coerce__ method: call it */
1075 args = mkvalue("(O)", w);
1076 if (args == NULL) {
1077 return -1;
1078 }
1079 coerced = call_object(coerce, args);
1080 DECREF(args);
1081 DECREF(coerce);
1082 if (coerced == NULL) {
1083 /* __coerce__ call raised an exception */
1084 return -1;
1085 }
1086 if (coerced == None) {
1087 /* __coerce__ says "I can't do it" */
1088 DECREF(coerced);
1089 return 1;
1090 }
1091 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
1092 /* __coerce__ return value is malformed */
1093 DECREF(coerced);
1094 err_setstr(TypeError,
1095 "coercion should return None or 2-tuple");
1096 return -1;
1097 }
1098 /* __coerce__ returned two new values */
1099 *pv = gettupleitem(coerced, 0);
1100 *pw = gettupleitem(coerced, 1);
1101 INCREF(*pv);
1102 INCREF(*pw);
1103 DECREF(coerced);
1104 return 0;
1105}
1106
Guido van Rossum03093a21994-09-28 15:51:32 +00001107
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108#define UNARY(funcname, methodname) \
1109static object *funcname(self) instanceobject *self; { \
Guido van Rossum2878a691996-08-09 20:53:24 +00001110 static object *o; \
1111 if (o == NULL) o = newstringobject(methodname); \
1112 return generic_unary_op(self, o); \
Guido van Rossum04691fc1992-08-12 15:35:34 +00001113}
1114
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115UNARY(instance_neg, "__neg__")
1116UNARY(instance_pos, "__pos__")
1117UNARY(instance_abs, "__abs__")
1118
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120instance_nonzero(self)
1121 instanceobject *self;
1122{
1123 object *func, *res;
1124 long outcome;
Guido van Rossum2878a691996-08-09 20:53:24 +00001125 static object *nonzerostr;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001126
Guido van Rossum2878a691996-08-09 20:53:24 +00001127 if (nonzerostr == NULL)
1128 nonzerostr = newstringobject("__nonzero__");
1129 if ((func = instance_getattr(self, nonzerostr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001130 err_clear();
Guido van Rossum2878a691996-08-09 20:53:24 +00001131 if (lenstr == NULL)
1132 lenstr = newstringobject("__len__");
1133 if ((func = instance_getattr(self, lenstr)) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134 err_clear();
1135 /* Fall back to the default behavior:
1136 all instances are nonzero */
1137 return 1;
1138 }
1139 }
1140 res = call_object(func, (object *)NULL);
1141 DECREF(func);
1142 if (res == NULL)
1143 return -1;
1144 if (!is_intobject(res)) {
1145 DECREF(res);
1146 err_setstr(TypeError, "__nonzero__ should return an int");
1147 return -1;
1148 }
1149 outcome = getintvalue(res);
1150 DECREF(res);
1151 if (outcome < 0) {
1152 err_setstr(ValueError, "__nonzero__ should return >= 0");
1153 return -1;
1154 }
1155 return outcome > 0;
1156}
1157
1158UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001159UNARY(instance_int, "__int__")
1160UNARY(instance_long, "__long__")
1161UNARY(instance_float, "__float__")
1162UNARY(instance_oct, "__oct__")
1163UNARY(instance_hex, "__hex__")
1164
Guido van Rossum03093a21994-09-28 15:51:32 +00001165/* This version is for ternary calls only (z != None) */
1166static object *
1167instance_pow(v, w, z)
1168 object *v;
1169 object *w;
1170 object *z;
1171{
1172 /* XXX Doesn't do coercions... */
1173 object *func;
1174 object *args;
1175 object *result;
Guido van Rossum2878a691996-08-09 20:53:24 +00001176 static object *powstr;
1177
1178 if (powstr == NULL)
1179 powstr = newstringobject("__pow__");
1180 func = getattro(v, powstr);
Guido van Rossum03093a21994-09-28 15:51:32 +00001181 if (func == NULL)
1182 return NULL;
1183 args = mkvalue("(OO)", w, z);
1184 if (args == NULL) {
1185 DECREF(func);
1186 return NULL;
1187 }
1188 result = call_object(func, args);
1189 DECREF(func);
1190 DECREF(args);
1191 return result;
1192}
1193
Guido van Rossum04691fc1992-08-12 15:35:34 +00001194static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001195 0, /*nb_add*/
1196 0, /*nb_subtract*/
1197 0, /*nb_multiply*/
1198 0, /*nb_divide*/
1199 0, /*nb_remainder*/
1200 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001201 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001202 (unaryfunc)instance_neg, /*nb_negative*/
1203 (unaryfunc)instance_pos, /*nb_positive*/
1204 (unaryfunc)instance_abs, /*nb_absolute*/
1205 (inquiry)instance_nonzero, /*nb_nonzero*/
1206 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001207 0, /*nb_lshift*/
1208 0, /*nb_rshift*/
1209 0, /*nb_and*/
1210 0, /*nb_xor*/
1211 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001212 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213 (unaryfunc)instance_int, /*nb_int*/
1214 (unaryfunc)instance_long, /*nb_long*/
1215 (unaryfunc)instance_float, /*nb_float*/
1216 (unaryfunc)instance_oct, /*nb_oct*/
1217 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001218};
1219
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001220typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221 OB_HEAD_INIT(&Typetype)
1222 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001223 "instance",
1224 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001227 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001228 0, /*tp_getattr*/
1229 0, /*tp_setattr*/
1230 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001231 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001232 &instance_as_number, /*tp_as_number*/
1233 &instance_as_sequence, /*tp_as_sequence*/
1234 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001235 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001236 0, /*tp_call*/
1237 0, /*tp_str*/
1238 (getattrofunc)instance_getattr, /*tp_getattro*/
1239 (setattrofunc)instance_setattr, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240};
1241
1242
Guido van Rossum81daa321993-05-20 14:24:46 +00001243/* Instance method objects are used for two purposes:
1244 (a) as bound instance methods (returned by instancename.methodname)
1245 (b) as unbound methods (returned by ClassName.methodname)
1246 In case (b), im_self is NULL
1247*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001248
1249typedef struct {
1250 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001251 object *im_func; /* The function implementing the method */
1252 object *im_self; /* The instance it is bound to, or NULL */
1253 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001254} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001255
1256object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001257newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258 object *func;
1259 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001260 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001261{
Guido van Rossume8122f11991-05-05 20:03:07 +00001262 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001263 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001264 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001265 return NULL;
1266 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001267 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1268 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001269 return NULL;
1270 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001271 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001272 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001273 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001274 INCREF(class);
1275 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001276 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277}
1278
1279object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001280instancemethodgetfunc(im)
1281 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282{
Guido van Rossume8122f11991-05-05 20:03:07 +00001283 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001284 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285 return NULL;
1286 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001287 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001288}
1289
1290object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001291instancemethodgetself(im)
1292 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293{
Guido van Rossume8122f11991-05-05 20:03:07 +00001294 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001295 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001296 return NULL;
1297 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001298 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001299}
1300
Guido van Rossum81daa321993-05-20 14:24:46 +00001301object *
1302instancemethodgetclass(im)
1303 register object *im;
1304{
1305 if (!is_instancemethodobject(im)) {
1306 err_badcall();
1307 return NULL;
1308 }
1309 return ((instancemethodobject *)im)->im_class;
1310}
1311
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001312/* Class method methods */
1313
Guido van Rossume8122f11991-05-05 20:03:07 +00001314#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001315
Guido van Rossume8122f11991-05-05 20:03:07 +00001316static struct memberlist instancemethod_memberlist[] = {
1317 {"im_func", T_OBJECT, OFF(im_func)},
1318 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001319 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001320 /* Dummies that are not handled by getattr() except for __members__ */
1321 {"__doc__", T_INT, 0},
1322 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323 {NULL} /* Sentinel */
1324};
1325
1326static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001327instancemethod_getattr(im, name)
1328 register instancemethodobject *im;
Guido van Rossum2878a691996-08-09 20:53:24 +00001329 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001330{
Guido van Rossum2878a691996-08-09 20:53:24 +00001331 char *sname = getstringvalue(name);
1332 if (sname[0] == '_') {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001333 funcobject *func = (funcobject *)(im->im_func);
Guido van Rossum2878a691996-08-09 20:53:24 +00001334 if (strcmp(sname, "__name__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001335 INCREF(func->func_name);
1336 return func->func_name;
1337 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001338 if (strcmp(sname, "__doc__") == 0) {
Guido van Rossum6dabc981996-05-14 21:54:20 +00001339 INCREF(func->func_doc);
1340 return func->func_doc;
1341 }
1342 }
1343 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001344 err_setstr(RuntimeError,
1345 "instance-method attributes not accessible in restricted mode");
1346 return NULL;
1347 }
Guido van Rossum2878a691996-08-09 20:53:24 +00001348 return getmember((char *)im, instancemethod_memberlist, sname);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349}
1350
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001351static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001352instancemethod_dealloc(im)
1353 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001354{
Guido van Rossume8122f11991-05-05 20:03:07 +00001355 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001356 XDECREF(im->im_self);
1357 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001358 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001359}
1360
Guido van Rossumebc8c511992-09-03 20:39:51 +00001361static int
1362instancemethod_compare(a, b)
1363 instancemethodobject *a, *b;
1364{
Guido van Rossume9df7271995-04-06 14:46:51 +00001365 if (a->im_self != b->im_self)
1366 return (a->im_self < b->im_self) ? -1 : 1;
1367 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001368}
1369
Guido van Rossum25831651993-05-19 14:50:45 +00001370static object *
1371instancemethod_repr(a)
1372 instancemethodobject *a;
1373{
1374 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001375 instanceobject *self = (instanceobject *)(a->im_self);
1376 funcobject *func = (funcobject *)(a->im_func);
1377 classobject *class = (classobject *)(a->im_class);
1378 object *fclassname, *iclassname, *funcname;
1379 char *fcname, *icname, *fname;
1380 fclassname = class->cl_name;
1381 funcname = func->func_name;
1382 if (fclassname != NULL && is_stringobject(fclassname))
1383 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001384 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001385 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001386 if (funcname != NULL && is_stringobject(funcname))
1387 fname = getstringvalue(funcname);
1388 else
1389 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001390 if (self == NULL)
1391 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1392 else {
1393 iclassname = self->in_class->cl_name;
1394 if (iclassname != NULL && is_stringobject(iclassname))
1395 icname = getstringvalue(iclassname);
1396 else
1397 icname = "?";
1398 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1399 fcname, fname, icname, (long)self);
1400 }
Guido van Rossum25831651993-05-19 14:50:45 +00001401 return newstringobject(buf);
1402}
1403
Guido van Rossum9bfef441993-03-29 10:43:31 +00001404static long
1405instancemethod_hash(a)
1406 instancemethodobject *a;
1407{
1408 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001409 if (a->im_self == NULL)
1410 x = hashobject(None);
1411 else
1412 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001413 if (x == -1)
1414 return -1;
1415 y = hashobject(a->im_func);
1416 if (y == -1)
1417 return -1;
1418 return x ^ y;
1419}
1420
Guido van Rossume8122f11991-05-05 20:03:07 +00001421typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001422 OB_HEAD_INIT(&Typetype)
1423 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001424 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001425 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001426 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001427 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001428 0, /*tp_print*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001429 0, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001430 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001431 (cmpfunc)instancemethod_compare, /*tp_compare*/
1432 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001433 0, /*tp_as_number*/
1434 0, /*tp_as_sequence*/
1435 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001436 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum2878a691996-08-09 20:53:24 +00001437 0, /*tp_call*/
1438 0, /*tp_str*/
1439 (getattrofunc)instancemethod_getattr, /*tp_getattro*/
1440 0, /*tp_setattro*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001441};