blob: e2a5e638173c1f4bd19d11f85f3b1def304a3577 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The 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 Rossum04691fc1992-08-12 15:35:34 +000028#include "modsupport.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000029#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000030#include "ceval.h"
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032object *
Guido van Rossum81daa321993-05-20 14:24:46 +000033newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000035 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000036 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037{
Guido van Rossum81daa321993-05-20 14:24:46 +000038 int pos;
39 object *key, *value;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040 classobject *op;
Guido van Rossume2966a61991-12-10 13:53:23 +000041 if (bases == NULL) {
42 bases = newtupleobject(0);
43 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000044 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000045 }
46 else
47 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000049 if (op == NULL) {
50 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000052 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000054 INCREF(dict);
55 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000056 XINCREF(name);
57 op->cl_name = name;
Guido van Rossum81daa321993-05-20 14:24:46 +000058 pos = 0;
59 while (mappinggetnext(dict, &pos, &key, &value)) {
60 if (is_accessobject(value))
61 setaccessowner(value, (object *)op);
62 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 return (object *) op;
64}
65
66/* Class methods */
67
68static void
69class_dealloc(op)
70 classobject *op;
71{
Guido van Rossume2966a61991-12-10 13:53:23 +000072 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000073 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000074 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 free((ANY *)op);
76}
77
78static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000079class_lookup(cp, name, pclass)
80 classobject *cp;
81 char *name;
82 classobject **pclass;
83{
84 int i, n;
85 object *value = dictlookup(cp->cl_dict, name);
86 if (value != NULL) {
87 *pclass = cp;
88 return value;
89 }
90 n = gettuplesize(cp->cl_bases);
91 for (i = 0; i < n; i++) {
92 object *v = class_lookup((classobject *)
93 gettupleitem(cp->cl_bases, i), name, pclass);
94 if (v != NULL)
95 return v;
96 }
97 return NULL;
98}
99
100static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101class_getattr(op, name)
102 register classobject *op;
103 register char *name;
104{
105 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000106 object *class;
Guido van Rossum94308391991-10-20 20:11:48 +0000107 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000108 INCREF(op->cl_dict);
109 return op->cl_dict;
Guido van Rossum94308391991-10-20 20:11:48 +0000110 }
111 if (strcmp(name, "__bases__") == 0) {
Guido van Rossum94308391991-10-20 20:11:48 +0000112 INCREF(op->cl_bases);
113 return op->cl_bases;
114 }
115 if (strcmp(name, "__name__") == 0) {
116 if (op->cl_name == NULL)
117 v = None;
118 else
119 v = op->cl_name;
120 INCREF(v);
121 return v;
122 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000123 v = class_lookup(op, name, &class);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 if (v != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000125 if (is_accessobject(v))
Guido van Rossum81daa321993-05-20 14:24:46 +0000126 v = getaccessvalue(v, getclass());
127 else if (is_funcobject(v))
128 v = newinstancemethodobject(v, (object *)NULL,
129 (object *)class);
Guido van Rossum25831651993-05-19 14:50:45 +0000130 else
131 INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 return v;
133 }
Guido van Rossume2966a61991-12-10 13:53:23 +0000134 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 return NULL;
136}
137
Guido van Rossum94308391991-10-20 20:11:48 +0000138static int
139class_setattr(op, name, v)
140 classobject *op;
141 char *name;
142 object *v;
143{
Guido van Rossum25831651993-05-19 14:50:45 +0000144 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000145 if (name[0] == '_' && name[1] == '_') {
146 int n = strlen(name);
147 if (name[n-1] == '_' && name[n-2] == '_') {
148 err_setstr(TypeError, "read-only special attribute");
149 return -1;
150 }
151 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000152 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000153 if (ac != NULL && is_accessobject(ac))
Guido van Rossum81daa321993-05-20 14:24:46 +0000154 return setaccessvalue(ac, getclass(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000155 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000156 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000157 if (rv < 0)
158 err_setstr(AttributeError,
159 "delete non-existing class attribute");
160 return rv;
161 }
Guido van Rossum94308391991-10-20 20:11:48 +0000162 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000163 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000164}
165
Guido van Rossum25831651993-05-19 14:50:45 +0000166static object *
167class_repr(op)
168 classobject *op;
169{
170 char buf[140];
171 char *name;
172 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
173 name = "?";
174 else
175 name = getstringvalue(op->cl_name);
176 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
177 return newstringobject(buf);
178}
179
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180typeobject Classtype = {
181 OB_HEAD_INIT(&Typetype)
182 0,
183 "class",
184 sizeof(classobject),
185 0,
186 class_dealloc, /*tp_dealloc*/
187 0, /*tp_print*/
188 class_getattr, /*tp_getattr*/
Guido van Rossum94308391991-10-20 20:11:48 +0000189 class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190 0, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +0000191 class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192 0, /*tp_as_number*/
193 0, /*tp_as_sequence*/
194 0, /*tp_as_mapping*/
195};
196
Guido van Rossum81daa321993-05-20 14:24:46 +0000197int
198issubclass(class, base)
199 object *class;
200 object *base;
201{
202 int i, n;
203 classobject *cp;
204 if (class == NULL || !is_classobject(class))
205 return 0;
206 if (class == base)
207 return 1;
208 cp = (classobject *)class;
209 n = gettuplesize(cp->cl_bases);
210 for (i = 0; i < n; i++) {
211 if (issubclass(gettupleitem(cp->cl_bases, i), base))
212 return 1;
213 }
214 return 0;
215}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216
Guido van Rossum81daa321993-05-20 14:24:46 +0000217
218/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219
220typedef struct {
221 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000222 classobject *in_class; /* The class object */
Guido van Rossum81daa321993-05-20 14:24:46 +0000223 object *in_dict; /* A dictionary */
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000224} instanceobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225
Guido van Rossum25831651993-05-19 14:50:45 +0000226static object *instance_getattr PROTO((instanceobject *, char *));
227
Guido van Rossum81daa321993-05-20 14:24:46 +0000228static int
229addaccess(class, inst)
230 classobject *class;
231 instanceobject *inst;
232{
233 int i, n, pos, ret;
234 object *key, *value, *ac;
235
236 n = gettuplesize(class->cl_bases);
237 for (i = 0; i < n; i++) {
238 if (addaccess(gettupleitem(class->cl_bases, i), inst) < 0)
239 return -1;
240 }
241
242 pos = 0;
243 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
244 if (!is_accessobject(value))
245 continue;
246 ac = dict2lookup(inst->in_dict, key);
247 if (ac != NULL && is_accessobject(ac)) {
248 err_setval(ConflictError, key);
249 return -1;
250 }
251 ac = cloneaccessobject(value);
252 if (ac == NULL)
253 return -1;
254 ret = dict2insert(inst->in_dict, key, ac);
255 DECREF(ac);
256 if (ret != 0)
257 return -1;
258 }
259 return 0;
260}
261
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262object *
Guido van Rossum25831651993-05-19 14:50:45 +0000263newinstanceobject(class, arg)
264 object *class;
265 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266{
Guido van Rossume8122f11991-05-05 20:03:07 +0000267 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000268 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000269 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000271 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 return NULL;
273 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000274 inst = NEWOBJ(instanceobject, &Instancetype);
275 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 return NULL;
277 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000278 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000279 inst->in_dict = newdictobject();
280 if (inst->in_dict == NULL ||
281 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000282 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 }
Guido van Rossum25831651993-05-19 14:50:45 +0000285 init = instance_getattr(inst, "__init__");
286 if (init == NULL) {
287 err_clear();
288 if (arg != NULL && !(is_tupleobject(arg) &&
289 gettuplesize(arg) == 0)) {
290 err_setstr(TypeError,
291 "this classobject() takes no arguments");
292 DECREF(inst);
293 inst = NULL;
294 }
295 }
296 else {
297 object *res = call_object(init, arg);
298 DECREF(init);
299 if (res == NULL) {
300 DECREF(inst);
301 inst = NULL;
302 }
303 else {
304 if (res != None) {
305 err_setstr(TypeError,
306 "__init__() should return None");
307 DECREF(inst);
308 inst = NULL;
309 }
310 DECREF(res);
311 }
312 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000313 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314}
315
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000316/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317
318static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000319instance_dealloc(inst)
320 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321{
Guido van Rossum25831651993-05-19 14:50:45 +0000322 object *error_type, *error_value;
323 object *del;
324 /* Call the __del__ method if it exists. First temporarily
325 revive the object and save the current exception, if any. */
326 INCREF(inst);
327 err_get(&error_type, &error_value);
328 if ((del = instance_getattr(inst, "__del__")) != NULL) {
329 object *args = newtupleobject(0);
330 object *res = args;
331 if (res != NULL)
332 res = call_object(del, args);
333 XDECREF(args);
334 DECREF(del);
335 XDECREF(res);
336 /* XXX If __del__ raised an exception, it is ignored! */
337 }
338 /* Restore the saved exception and undo the temporary revival */
339 err_setval(error_type, error_value);
340 /* Can't use DECREF here, it would cause a recursive call */
341 if (--inst->ob_refcnt > 0)
342 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000343 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000344 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000345 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346}
347
348static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000349instance_getattr(inst, name)
350 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351 register char *name;
352{
Guido van Rossum94308391991-10-20 20:11:48 +0000353 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000354 classobject *class;
Guido van Rossum94308391991-10-20 20:11:48 +0000355 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000356 INCREF(inst->in_dict);
357 return inst->in_dict;
Guido van Rossum94308391991-10-20 20:11:48 +0000358 }
359 if (strcmp(name, "__class__") == 0) {
360 INCREF(inst->in_class);
361 return (object *)inst->in_class;
362 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000363 v = dictlookup(inst->in_dict, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 if (v != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000365 if (is_accessobject(v))
Guido van Rossum81daa321993-05-20 14:24:46 +0000366 v = getaccessvalue(v, getclass());
Guido van Rossum25831651993-05-19 14:50:45 +0000367 else
368 INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 return v;
370 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000371 v = class_lookup(inst->in_class, name, &class);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 if (v == NULL)
Guido van Rossum81daa321993-05-20 14:24:46 +0000373 goto error;
374 if (is_funcobject(v))
375 return newinstancemethodobject(v, (object *)inst,
376 (object *)class);
377 error:
Guido van Rossume2966a61991-12-10 13:53:23 +0000378 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 return NULL;
380}
381
382static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000383instance_setattr(inst, name, v)
384 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 char *name;
386 object *v;
387{
Guido van Rossum25831651993-05-19 14:50:45 +0000388 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000389 if (name[0] == '_' && name[1] == '_') {
390 int n = strlen(name);
391 if (name[n-1] == '_' && name[n-2] == '_') {
392 err_setstr(TypeError, "read-only special attribute");
393 return -1;
394 }
395 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000396 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000397 if (ac != NULL && is_accessobject(ac))
Guido van Rossum81daa321993-05-20 14:24:46 +0000398 return setaccessvalue(ac, getclass(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000399 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000400 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000401 if (rv < 0)
402 err_setstr(AttributeError,
403 "delete non-existing instance attribute");
404 return rv;
405 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000407 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408}
409
Guido van Rossum9bfef441993-03-29 10:43:31 +0000410static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000411instance_repr(inst)
412 instanceobject *inst;
413{
414 object *func;
415 object *res;
416
417 func = instance_getattr(inst, "__repr__");
418 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000419 char buf[140];
420 object *classname = inst->in_class->cl_name;
421 char *cname;
422 if (classname != NULL && is_stringobject(classname))
423 cname = getstringvalue(classname);
424 else
425 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000426 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000427 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000428 return newstringobject(buf);
429 }
430 res = call_object(func, (object *)NULL);
431 DECREF(func);
432 return res;
433}
434
Guido van Rossum9bfef441993-03-29 10:43:31 +0000435static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000436instance_compare(inst, other)
437 instanceobject *inst, *other;
438{
439 object *func;
440 object *res;
441 int outcome;
442
443 func = instance_getattr(inst, "__cmp__");
444 if (func == NULL) {
445 err_clear();
446 if (inst < other)
447 return -1;
448 if (inst > other)
449 return 1;
450 return 0;
451 }
452 res = call_object(func, (object *)other);
453 DECREF(func);
454 if (res == NULL) {
455 err_clear(); /* XXX Should report the error, bot how...??? */
456 return 0;
457 }
458 if (is_intobject(res))
459 outcome = getintvalue(res);
460 else
461 outcome = 0; /* XXX Should report the error, bot how...??? */
462 DECREF(res);
463 return outcome;
464}
465
Guido van Rossum9bfef441993-03-29 10:43:31 +0000466static long
467instance_hash(inst)
468 instanceobject *inst;
469{
470 object *func;
471 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000472 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000473
474 func = instance_getattr(inst, "__hash__");
475 if (func == NULL) {
476 /* If there is no __cmp__ method, we hash on the address.
477 If a __cmp__ method exists, there must be a __hash__. */
478 err_clear();
479 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000480 if (func == NULL) {
481 err_clear();
482 outcome = (long)inst;
483 if (outcome == -1)
484 outcome = -2;
485 return outcome;
486 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000487 err_setstr(TypeError, "unhashable instance");
488 return -1;
489 }
490 res = call_object(func, (object *)NULL);
491 DECREF(func);
492 if (res == NULL)
493 return -1;
494 if (is_intobject(res)) {
495 outcome = getintvalue(res);
496 if (outcome == -1)
497 outcome = -2;
498 }
499 else {
500 err_setstr(TypeError, "__hash__() should return an int");
501 outcome = -1;
502 }
503 DECREF(res);
504 return outcome;
505}
506
507static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000508instance_length(inst)
509 instanceobject *inst;
510{
511 object *func;
512 object *res;
513 int outcome;
514
515 func = instance_getattr(inst, "__len__");
516 if (func == NULL)
517 return -1;
518 res = call_object(func, (object *)NULL);
519 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000520 if (res == NULL)
521 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000522 if (is_intobject(res)) {
523 outcome = getintvalue(res);
524 if (outcome < 0)
525 err_setstr(ValueError, "__len__() should return >= 0");
526 }
527 else {
528 err_setstr(TypeError, "__len__() should return an int");
529 outcome = -1;
530 }
531 DECREF(res);
532 return outcome;
533}
534
Guido van Rossum9bfef441993-03-29 10:43:31 +0000535static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000536instance_subscript(inst, key)
537 instanceobject *inst;
538 object *key;
539{
540 object *func;
541 object *arg;
542 object *res;
543
544 func = instance_getattr(inst, "__getitem__");
545 if (func == NULL)
546 return NULL;
547 arg = mkvalue("(O)", key);
548 if (arg == NULL) {
549 DECREF(func);
550 return NULL;
551 }
552 res = call_object(func, arg);
553 DECREF(func);
554 DECREF(arg);
555 return res;
556}
557
Guido van Rossum9bfef441993-03-29 10:43:31 +0000558static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000559instance_ass_subscript(inst, key, value)
560 instanceobject*inst;
561 object *key;
562 object *value;
563{
564 object *func;
565 object *arg;
566 object *res;
567
568 if (value == NULL)
569 func = instance_getattr(inst, "__delitem__");
570 else
571 func = instance_getattr(inst, "__setitem__");
572 if (func == NULL)
573 return -1;
574 if (value == NULL)
575 arg = mkvalue("(O)", key);
576 else
577 arg = mkvalue("(OO)", key, value);
578 if (arg == NULL) {
579 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000580 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000581 }
582 res = call_object(func, arg);
583 DECREF(func);
584 DECREF(arg);
585 if (res == NULL)
586 return -1;
587 DECREF(res);
588 return 0;
589}
590
Guido van Rossum9bfef441993-03-29 10:43:31 +0000591static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000592 instance_length, /*mp_length*/
593 instance_subscript, /*mp_subscript*/
594 instance_ass_subscript, /*mp_ass_subscript*/
595};
596
597static object *
598instance_concat(inst, other)
599 instanceobject *inst, *other;
600{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000601 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000602
603 func = instance_getattr(inst, "__add__");
604 if (func == NULL)
605 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000606 arg = mkvalue("(O)", other);
607 if (arg == NULL) {
608 DECREF(func);
609 return NULL;
610 }
611 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000612 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000613 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000614 return res;
615}
616
617static object *
618instance_repeat(inst, count)
619 instanceobject *inst;
620 int count;
621{
622 object *func, *arg, *res;
623
624 func = instance_getattr(inst, "__mul__");
625 if (func == NULL)
626 return NULL;
627 arg = newintobject((long)count);
628 if (arg == NULL) {
629 DECREF(func);
630 return NULL;
631 }
632 res = call_object(func, arg);
633 DECREF(func);
634 DECREF(arg);
635 return res;
636}
637
638static object *
639instance_item(inst, i)
640 instanceobject *inst;
641 int i;
642{
643 object *func, *arg, *res;
644
645 func = instance_getattr(inst, "__getitem__");
646 if (func == NULL)
647 return NULL;
648 arg = newintobject((long)i);
649 if (arg == NULL) {
650 DECREF(func);
651 return NULL;
652 }
653 res = call_object(func, arg);
654 DECREF(func);
655 DECREF(arg);
656 return res;
657}
658
659static object *
660instance_slice(inst, i, j)
661 instanceobject *inst;
662 int i, j;
663{
664 object *func, *arg, *res;
665
666 func = instance_getattr(inst, "__getslice__");
667 if (func == NULL)
668 return NULL;
669 arg = mkvalue("(ii)", i, j);
670 if (arg == NULL) {
671 DECREF(func);
672 return NULL;
673 }
674 res = call_object(func, arg);
675 DECREF(func);
676 DECREF(arg);
677 return res;
678}
679
680static int
681instance_ass_item(inst, i, item)
682 instanceobject *inst;
683 int i;
684 object *item;
685{
686 object *func, *arg, *res;
687
688 if (item == NULL)
689 func = instance_getattr(inst, "__delitem__");
690 else
691 func = instance_getattr(inst, "__setitem__");
692 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000693 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000694 if (item == NULL)
695 arg = mkvalue("i", i);
696 else
697 arg = mkvalue("(iO)", i, item);
698 if (arg == NULL) {
699 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000700 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000701 }
702 res = call_object(func, arg);
703 DECREF(func);
704 DECREF(arg);
705 if (res == NULL)
706 return -1;
707 DECREF(res);
708 return 0;
709}
710
711static int
712instance_ass_slice(inst, i, j, value)
713 instanceobject *inst;
714 int i, j;
715 object *value;
716{
717 object *func, *arg, *res;
718
719 if (value == NULL)
720 func = instance_getattr(inst, "__delslice__");
721 else
722 func = instance_getattr(inst, "__setslice__");
723 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000724 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725 if (value == NULL)
726 arg = mkvalue("(ii)", i, j);
727 else
728 arg = mkvalue("(iiO)", i, j, value);
729 if (arg == NULL) {
730 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000731 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000732 }
733 res = call_object(func, arg);
734 DECREF(func);
735 DECREF(arg);
736 if (res == NULL)
737 return -1;
738 DECREF(res);
739 return 0;
740}
741
742static sequence_methods instance_as_sequence = {
743 instance_length, /*sq_length*/
744 instance_concat, /*sq_concat*/
745 instance_repeat, /*sq_repeat*/
746 instance_item, /*sq_item*/
747 instance_slice, /*sq_slice*/
748 instance_ass_item, /*sq_ass_item*/
749 instance_ass_slice, /*sq_ass_slice*/
750};
751
752static object *
753generic_binary_op(self, other, methodname)
754 instanceobject *self;
755 object *other;
756 char *methodname;
757{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000758 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759
760 if ((func = instance_getattr(self, methodname)) == NULL)
761 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000762 arg = mkvalue("O", other);
763 if (arg == NULL) {
764 DECREF(func);
765 return NULL;
766 }
767 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000769 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000770 return res;
771}
772
773static object *
774generic_unary_op(self, methodname)
775 instanceobject *self;
776 char *methodname;
777{
778 object *func, *res;
779
780 if ((func = instance_getattr(self, methodname)) == NULL)
781 return NULL;
782 res = call_object(func, (object *)NULL);
783 DECREF(func);
784 return res;
785}
786
787#define BINARY(funcname, methodname) \
788static object * funcname(self, other) instanceobject *self; object *other; { \
789 return generic_binary_op(self, other, methodname); \
790}
791
792#define UNARY(funcname, methodname) \
793static object *funcname(self) instanceobject *self; { \
794 return generic_unary_op(self, methodname); \
795}
796
797BINARY(instance_add, "__add__")
798BINARY(instance_sub, "__sub__")
799BINARY(instance_mul, "__mul__")
800BINARY(instance_div, "__div__")
801BINARY(instance_mod, "__mod__")
802BINARY(instance_divmod, "__divmod__")
803BINARY(instance_pow, "__pow__")
804UNARY(instance_neg, "__neg__")
805UNARY(instance_pos, "__pos__")
806UNARY(instance_abs, "__abs__")
807
Guido van Rossum9bfef441993-03-29 10:43:31 +0000808static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809instance_nonzero(self)
810 instanceobject *self;
811{
812 object *func, *res;
813 long outcome;
814
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000815 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000816 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000817 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818 err_clear();
819 /* Fall back to the default behavior:
820 all instances are nonzero */
821 return 1;
822 }
823 }
824 res = call_object(func, (object *)NULL);
825 DECREF(func);
826 if (res == NULL)
827 return -1;
828 if (!is_intobject(res)) {
829 DECREF(res);
830 err_setstr(TypeError, "__nonzero__ should return an int");
831 return -1;
832 }
833 outcome = getintvalue(res);
834 DECREF(res);
835 if (outcome < 0) {
836 err_setstr(ValueError, "__nonzero__ should return >= 0");
837 return -1;
838 }
839 return outcome > 0;
840}
841
842UNARY(instance_invert, "__invert__")
843BINARY(instance_lshift, "__lshift__")
844BINARY(instance_rshift, "__rshift__")
845BINARY(instance_and, "__and__")
846BINARY(instance_xor, "__xor__")
847BINARY(instance_or, "__or__")
848
Guido van Rossume6eefc21992-08-14 12:06:52 +0000849static int
850instance_coerce(pv, pw)
851 object **pv, **pw;
852{
853 object *v = *pv;
854 object *w = *pw;
855 object *func;
856 object *res;
857 int outcome;
858
859 if (!is_instanceobject(v))
860 return 1; /* XXX shouldn't be possible */
861 func = instance_getattr((instanceobject *)v, "__coerce__");
862 if (func == NULL) {
863 err_clear();
864 return 1;
865 }
866 res = call_object(func, w);
867 if (res == NULL)
868 return -1;
869 if (res == None) {
870 DECREF(res);
871 return 1;
872 }
873 outcome = getargs(res, "(OO)", &v, &w);
874 if (!outcome || v->ob_type != w->ob_type ||
875 v->ob_type->tp_as_number == NULL) {
876 DECREF(res);
877 err_setstr(TypeError, "bad __coerce__ result");
878 return -1;
879 }
880 INCREF(v);
881 INCREF(w);
882 DECREF(res);
883 *pv = v;
884 *pw = w;
885 return 0;
886}
887
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000888UNARY(instance_int, "__int__")
889UNARY(instance_long, "__long__")
890UNARY(instance_float, "__float__")
891UNARY(instance_oct, "__oct__")
892UNARY(instance_hex, "__hex__")
893
Guido van Rossum04691fc1992-08-12 15:35:34 +0000894static number_methods instance_as_number = {
895 instance_add, /*nb_add*/
896 instance_sub, /*nb_subtract*/
897 instance_mul, /*nb_multiply*/
898 instance_div, /*nb_divide*/
899 instance_mod, /*nb_remainder*/
900 instance_divmod, /*nb_divmod*/
901 instance_pow, /*nb_power*/
902 instance_neg, /*nb_negative*/
903 instance_pos, /*nb_positive*/
904 instance_abs, /*nb_absolute*/
905 instance_nonzero, /*nb_nonzero*/
906 instance_invert, /*nb_invert*/
907 instance_lshift, /*nb_lshift*/
908 instance_rshift, /*nb_rshift*/
909 instance_and, /*nb_and*/
910 instance_xor, /*nb_xor*/
911 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000912 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000913 instance_int, /*nb_int*/
914 instance_long, /*nb_long*/
915 instance_float, /*nb_float*/
916 instance_oct, /*nb_oct*/
917 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000918};
919
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000920typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000921 OB_HEAD_INIT(&Typetype)
922 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000923 "instance",
924 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000925 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000926 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000927 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +0000928 (object * (*) FPROTO((object *, char *)))
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000929 instance_getattr, /*tp_getattr*/
930 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000931 instance_compare, /*tp_compare*/
932 instance_repr, /*tp_repr*/
933 &instance_as_number, /*tp_as_number*/
934 &instance_as_sequence, /*tp_as_sequence*/
935 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000936 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000937};
938
Guido van Rossum9bfef441993-03-29 10:43:31 +0000939static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000940instance_convert(inst, methodname)
941 object *inst;
942 char *methodname;
943{
944 return generic_unary_op((instanceobject *)inst, methodname);
945}
946
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000947
Guido van Rossum81daa321993-05-20 14:24:46 +0000948/* Instance method objects are used for two purposes:
949 (a) as bound instance methods (returned by instancename.methodname)
950 (b) as unbound methods (returned by ClassName.methodname)
951 In case (b), im_self is NULL
952*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000953
954typedef struct {
955 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +0000956 object *im_func; /* The function implementing the method */
957 object *im_self; /* The instance it is bound to, or NULL */
958 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +0000959} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000960
961object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000962newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000963 object *func;
964 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000965 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000966{
Guido van Rossume8122f11991-05-05 20:03:07 +0000967 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000968 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000969 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000970 return NULL;
971 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000972 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
973 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000974 return NULL;
975 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000976 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +0000977 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000978 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000979 INCREF(class);
980 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +0000981 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000982}
983
984object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000985instancemethodgetfunc(im)
986 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000987{
Guido van Rossume8122f11991-05-05 20:03:07 +0000988 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000989 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000990 return NULL;
991 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000992 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000993}
994
995object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000996instancemethodgetself(im)
997 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000998{
Guido van Rossume8122f11991-05-05 20:03:07 +0000999 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001000 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001001 return NULL;
1002 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001003 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001004}
1005
Guido van Rossum81daa321993-05-20 14:24:46 +00001006object *
1007instancemethodgetclass(im)
1008 register object *im;
1009{
1010 if (!is_instancemethodobject(im)) {
1011 err_badcall();
1012 return NULL;
1013 }
1014 return ((instancemethodobject *)im)->im_class;
1015}
1016
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001017/* Class method methods */
1018
Guido van Rossume8122f11991-05-05 20:03:07 +00001019#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020
Guido van Rossume8122f11991-05-05 20:03:07 +00001021static struct memberlist instancemethod_memberlist[] = {
1022 {"im_func", T_OBJECT, OFF(im_func)},
1023 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001024 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001025 {NULL} /* Sentinel */
1026};
1027
1028static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001029instancemethod_getattr(im, name)
1030 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001031 char *name;
1032{
Guido van Rossume8122f11991-05-05 20:03:07 +00001033 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001034}
1035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001036static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001037instancemethod_dealloc(im)
1038 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001039{
Guido van Rossume8122f11991-05-05 20:03:07 +00001040 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001041 XDECREF(im->im_self);
1042 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001043 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044}
1045
Guido van Rossumebc8c511992-09-03 20:39:51 +00001046static int
1047instancemethod_compare(a, b)
1048 instancemethodobject *a, *b;
1049{
1050 int cmp = cmpobject(a->im_self, b->im_self);
1051 if (cmp == 0)
1052 cmp = cmpobject(a->im_func, b->im_func);
1053 return cmp;
1054}
1055
Guido van Rossum25831651993-05-19 14:50:45 +00001056static object *
1057instancemethod_repr(a)
1058 instancemethodobject *a;
1059{
1060 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001061 instanceobject *self = (instanceobject *)(a->im_self);
1062 funcobject *func = (funcobject *)(a->im_func);
1063 classobject *class = (classobject *)(a->im_class);
1064 object *fclassname, *iclassname, *funcname;
1065 char *fcname, *icname, *fname;
1066 fclassname = class->cl_name;
1067 funcname = func->func_name;
1068 if (fclassname != NULL && is_stringobject(fclassname))
1069 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001070 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001071 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001072 if (funcname != NULL && is_stringobject(funcname))
1073 fname = getstringvalue(funcname);
1074 else
1075 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001076 if (self == NULL)
1077 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1078 else {
1079 iclassname = self->in_class->cl_name;
1080 if (iclassname != NULL && is_stringobject(iclassname))
1081 icname = getstringvalue(iclassname);
1082 else
1083 icname = "?";
1084 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1085 fcname, fname, icname, (long)self);
1086 }
Guido van Rossum25831651993-05-19 14:50:45 +00001087 return newstringobject(buf);
1088}
1089
Guido van Rossum9bfef441993-03-29 10:43:31 +00001090static long
1091instancemethod_hash(a)
1092 instancemethodobject *a;
1093{
1094 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001095 if (a->im_self == NULL)
1096 x = hashobject(None);
1097 else
1098 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001099 if (x == -1)
1100 return -1;
1101 y = hashobject(a->im_func);
1102 if (y == -1)
1103 return -1;
1104 return x ^ y;
1105}
1106
Guido van Rossume8122f11991-05-05 20:03:07 +00001107typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001108 OB_HEAD_INIT(&Typetype)
1109 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001110 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001111 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001112 0,
Guido van Rossume8122f11991-05-05 20:03:07 +00001113 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +00001115 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +00001117 instancemethod_compare, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +00001118 instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001119 0, /*tp_as_number*/
1120 0, /*tp_as_sequence*/
1121 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123};