blob: 0a6fc7e77d80451ab5734e3ab8f3a4188996408c [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 Rossumb3f72581993-05-21 19:56:10 +0000124 if (v == NULL) {
125 err_setstr(AttributeError, name);
126 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000128 if (is_accessobject(v)) {
129 v = getaccessvalue(v, getclass());
130 if (v == NULL)
131 return NULL;
132 }
133 else
134 INCREF(v);
135 if (is_funcobject(v)) {
136 object *w = newinstancemethodobject(v, (object *)NULL,
137 (object *)class);
138 DECREF(v);
139 v = w;
140 }
141 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142}
143
Guido van Rossum94308391991-10-20 20:11:48 +0000144static int
145class_setattr(op, name, v)
146 classobject *op;
147 char *name;
148 object *v;
149{
Guido van Rossum25831651993-05-19 14:50:45 +0000150 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000151 if (name[0] == '_' && name[1] == '_') {
152 int n = strlen(name);
153 if (name[n-1] == '_' && name[n-2] == '_') {
154 err_setstr(TypeError, "read-only special attribute");
155 return -1;
156 }
157 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000158 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000159 if (ac != NULL && is_accessobject(ac))
Guido van Rossum81daa321993-05-20 14:24:46 +0000160 return setaccessvalue(ac, getclass(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000161 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000162 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000163 if (rv < 0)
164 err_setstr(AttributeError,
165 "delete non-existing class attribute");
166 return rv;
167 }
Guido van Rossum94308391991-10-20 20:11:48 +0000168 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000169 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000170}
171
Guido van Rossum25831651993-05-19 14:50:45 +0000172static object *
173class_repr(op)
174 classobject *op;
175{
176 char buf[140];
177 char *name;
178 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
179 name = "?";
180 else
181 name = getstringvalue(op->cl_name);
182 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
183 return newstringobject(buf);
184}
185
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186typeobject Classtype = {
187 OB_HEAD_INIT(&Typetype)
188 0,
189 "class",
190 sizeof(classobject),
191 0,
192 class_dealloc, /*tp_dealloc*/
193 0, /*tp_print*/
194 class_getattr, /*tp_getattr*/
Guido van Rossum94308391991-10-20 20:11:48 +0000195 class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 0, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +0000197 class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
201};
202
Guido van Rossum81daa321993-05-20 14:24:46 +0000203int
204issubclass(class, base)
205 object *class;
206 object *base;
207{
208 int i, n;
209 classobject *cp;
210 if (class == NULL || !is_classobject(class))
211 return 0;
212 if (class == base)
213 return 1;
214 cp = (classobject *)class;
215 n = gettuplesize(cp->cl_bases);
216 for (i = 0; i < n; i++) {
217 if (issubclass(gettupleitem(cp->cl_bases, i), base))
218 return 1;
219 }
220 return 0;
221}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222
Guido van Rossum81daa321993-05-20 14:24:46 +0000223
224/* Instance objects */
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)) {
Guido van Rossumb3f72581993-05-21 19:56:10 +0000244 object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000245 if (!is_accessobject(value))
246 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000247 if (hasaccessvalue(value))
248 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000249 ac = dict2lookup(inst->in_dict, key);
250 if (ac != NULL && is_accessobject(ac)) {
251 err_setval(ConflictError, key);
252 return -1;
253 }
254 ac = cloneaccessobject(value);
255 if (ac == NULL)
256 return -1;
257 ret = dict2insert(inst->in_dict, key, ac);
258 DECREF(ac);
259 if (ret != 0)
260 return -1;
261 }
262 return 0;
263}
264
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265object *
Guido van Rossum25831651993-05-19 14:50:45 +0000266newinstanceobject(class, arg)
267 object *class;
268 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269{
Guido van Rossume8122f11991-05-05 20:03:07 +0000270 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000271 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000272 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000274 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 return NULL;
276 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000277 inst = NEWOBJ(instanceobject, &Instancetype);
278 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return NULL;
280 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000281 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000282 inst->in_dict = newdictobject();
283 if (inst->in_dict == NULL ||
284 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000285 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return NULL;
287 }
Guido van Rossum25831651993-05-19 14:50:45 +0000288 init = instance_getattr(inst, "__init__");
289 if (init == NULL) {
290 err_clear();
291 if (arg != NULL && !(is_tupleobject(arg) &&
292 gettuplesize(arg) == 0)) {
293 err_setstr(TypeError,
294 "this classobject() takes no arguments");
295 DECREF(inst);
296 inst = NULL;
297 }
298 }
299 else {
300 object *res = call_object(init, arg);
301 DECREF(init);
302 if (res == NULL) {
303 DECREF(inst);
304 inst = NULL;
305 }
306 else {
307 if (res != None) {
308 err_setstr(TypeError,
309 "__init__() should return None");
310 DECREF(inst);
311 inst = NULL;
312 }
313 DECREF(res);
314 }
315 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000316 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317}
318
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000319/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320
321static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000322instance_dealloc(inst)
323 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324{
Guido van Rossum25831651993-05-19 14:50:45 +0000325 object *error_type, *error_value;
326 object *del;
327 /* Call the __del__ method if it exists. First temporarily
328 revive the object and save the current exception, if any. */
329 INCREF(inst);
330 err_get(&error_type, &error_value);
331 if ((del = instance_getattr(inst, "__del__")) != NULL) {
332 object *args = newtupleobject(0);
333 object *res = args;
334 if (res != NULL)
335 res = call_object(del, args);
336 XDECREF(args);
337 DECREF(del);
338 XDECREF(res);
339 /* XXX If __del__ raised an exception, it is ignored! */
340 }
341 /* Restore the saved exception and undo the temporary revival */
342 err_setval(error_type, error_value);
343 /* Can't use DECREF here, it would cause a recursive call */
344 if (--inst->ob_refcnt > 0)
345 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000346 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000347 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000348 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
351static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000352instance_getattr(inst, name)
353 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354 register char *name;
355{
Guido van Rossum94308391991-10-20 20:11:48 +0000356 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000357 classobject *class;
Guido van Rossum94308391991-10-20 20:11:48 +0000358 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000359 INCREF(inst->in_dict);
360 return inst->in_dict;
Guido van Rossum94308391991-10-20 20:11:48 +0000361 }
362 if (strcmp(name, "__class__") == 0) {
363 INCREF(inst->in_class);
364 return (object *)inst->in_class;
365 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000366 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000367 if (v == NULL) {
368 v = class_lookup(inst->in_class, name, &class);
369 if (v == NULL) {
370 err_setstr(AttributeError, name);
371 return NULL;
372 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000374 if (is_accessobject(v)) {
375 v = getaccessvalue(v, getclass());
376 if (v == NULL)
377 return NULL;
378 }
379 else
380 INCREF(v);
381 if (is_funcobject(v)) {
382 object *w = newinstancemethodobject(v, (object *)inst,
383 (object *)class);
384 DECREF(v);
385 v = w;
386 }
387 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388}
389
390static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000391instance_setattr(inst, name, v)
392 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 char *name;
394 object *v;
395{
Guido van Rossum25831651993-05-19 14:50:45 +0000396 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000397 if (name[0] == '_' && name[1] == '_') {
398 int n = strlen(name);
399 if (name[n-1] == '_' && name[n-2] == '_') {
400 err_setstr(TypeError, "read-only special attribute");
401 return -1;
402 }
403 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000404 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000405 if (ac != NULL && is_accessobject(ac))
Guido van Rossum81daa321993-05-20 14:24:46 +0000406 return setaccessvalue(ac, getclass(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000407 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000408 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000409 if (rv < 0)
410 err_setstr(AttributeError,
411 "delete non-existing instance attribute");
412 return rv;
413 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000415 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416}
417
Guido van Rossum9bfef441993-03-29 10:43:31 +0000418static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000419instance_repr(inst)
420 instanceobject *inst;
421{
422 object *func;
423 object *res;
424
425 func = instance_getattr(inst, "__repr__");
426 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000427 char buf[140];
428 object *classname = inst->in_class->cl_name;
429 char *cname;
430 if (classname != NULL && is_stringobject(classname))
431 cname = getstringvalue(classname);
432 else
433 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000434 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000435 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000436 return newstringobject(buf);
437 }
438 res = call_object(func, (object *)NULL);
439 DECREF(func);
440 return res;
441}
442
Guido van Rossum9bfef441993-03-29 10:43:31 +0000443static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000444instance_compare(inst, other)
445 instanceobject *inst, *other;
446{
447 object *func;
448 object *res;
449 int outcome;
450
451 func = instance_getattr(inst, "__cmp__");
452 if (func == NULL) {
453 err_clear();
454 if (inst < other)
455 return -1;
456 if (inst > other)
457 return 1;
458 return 0;
459 }
460 res = call_object(func, (object *)other);
461 DECREF(func);
462 if (res == NULL) {
463 err_clear(); /* XXX Should report the error, bot how...??? */
464 return 0;
465 }
466 if (is_intobject(res))
467 outcome = getintvalue(res);
468 else
469 outcome = 0; /* XXX Should report the error, bot how...??? */
470 DECREF(res);
471 return outcome;
472}
473
Guido van Rossum9bfef441993-03-29 10:43:31 +0000474static long
475instance_hash(inst)
476 instanceobject *inst;
477{
478 object *func;
479 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000480 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000481
482 func = instance_getattr(inst, "__hash__");
483 if (func == NULL) {
484 /* If there is no __cmp__ method, we hash on the address.
485 If a __cmp__ method exists, there must be a __hash__. */
486 err_clear();
487 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000488 if (func == NULL) {
489 err_clear();
490 outcome = (long)inst;
491 if (outcome == -1)
492 outcome = -2;
493 return outcome;
494 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000495 err_setstr(TypeError, "unhashable instance");
496 return -1;
497 }
498 res = call_object(func, (object *)NULL);
499 DECREF(func);
500 if (res == NULL)
501 return -1;
502 if (is_intobject(res)) {
503 outcome = getintvalue(res);
504 if (outcome == -1)
505 outcome = -2;
506 }
507 else {
508 err_setstr(TypeError, "__hash__() should return an int");
509 outcome = -1;
510 }
511 DECREF(res);
512 return outcome;
513}
514
515static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000516instance_length(inst)
517 instanceobject *inst;
518{
519 object *func;
520 object *res;
521 int outcome;
522
523 func = instance_getattr(inst, "__len__");
524 if (func == NULL)
525 return -1;
526 res = call_object(func, (object *)NULL);
527 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000528 if (res == NULL)
529 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000530 if (is_intobject(res)) {
531 outcome = getintvalue(res);
532 if (outcome < 0)
533 err_setstr(ValueError, "__len__() should return >= 0");
534 }
535 else {
536 err_setstr(TypeError, "__len__() should return an int");
537 outcome = -1;
538 }
539 DECREF(res);
540 return outcome;
541}
542
Guido van Rossum9bfef441993-03-29 10:43:31 +0000543static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000544instance_subscript(inst, key)
545 instanceobject *inst;
546 object *key;
547{
548 object *func;
549 object *arg;
550 object *res;
551
552 func = instance_getattr(inst, "__getitem__");
553 if (func == NULL)
554 return NULL;
555 arg = mkvalue("(O)", key);
556 if (arg == NULL) {
557 DECREF(func);
558 return NULL;
559 }
560 res = call_object(func, arg);
561 DECREF(func);
562 DECREF(arg);
563 return res;
564}
565
Guido van Rossum9bfef441993-03-29 10:43:31 +0000566static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000567instance_ass_subscript(inst, key, value)
568 instanceobject*inst;
569 object *key;
570 object *value;
571{
572 object *func;
573 object *arg;
574 object *res;
575
576 if (value == NULL)
577 func = instance_getattr(inst, "__delitem__");
578 else
579 func = instance_getattr(inst, "__setitem__");
580 if (func == NULL)
581 return -1;
582 if (value == NULL)
583 arg = mkvalue("(O)", key);
584 else
585 arg = mkvalue("(OO)", key, value);
586 if (arg == NULL) {
587 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000588 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000589 }
590 res = call_object(func, arg);
591 DECREF(func);
592 DECREF(arg);
593 if (res == NULL)
594 return -1;
595 DECREF(res);
596 return 0;
597}
598
Guido van Rossum9bfef441993-03-29 10:43:31 +0000599static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000600 instance_length, /*mp_length*/
601 instance_subscript, /*mp_subscript*/
602 instance_ass_subscript, /*mp_ass_subscript*/
603};
604
605static object *
606instance_concat(inst, other)
607 instanceobject *inst, *other;
608{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000609 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610
611 func = instance_getattr(inst, "__add__");
612 if (func == NULL)
613 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000614 arg = mkvalue("(O)", other);
615 if (arg == NULL) {
616 DECREF(func);
617 return NULL;
618 }
619 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000620 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000621 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000622 return res;
623}
624
625static object *
626instance_repeat(inst, count)
627 instanceobject *inst;
628 int count;
629{
630 object *func, *arg, *res;
631
632 func = instance_getattr(inst, "__mul__");
633 if (func == NULL)
634 return NULL;
635 arg = newintobject((long)count);
636 if (arg == NULL) {
637 DECREF(func);
638 return NULL;
639 }
640 res = call_object(func, arg);
641 DECREF(func);
642 DECREF(arg);
643 return res;
644}
645
646static object *
647instance_item(inst, i)
648 instanceobject *inst;
649 int i;
650{
651 object *func, *arg, *res;
652
653 func = instance_getattr(inst, "__getitem__");
654 if (func == NULL)
655 return NULL;
656 arg = newintobject((long)i);
657 if (arg == NULL) {
658 DECREF(func);
659 return NULL;
660 }
661 res = call_object(func, arg);
662 DECREF(func);
663 DECREF(arg);
664 return res;
665}
666
667static object *
668instance_slice(inst, i, j)
669 instanceobject *inst;
670 int i, j;
671{
672 object *func, *arg, *res;
673
674 func = instance_getattr(inst, "__getslice__");
675 if (func == NULL)
676 return NULL;
677 arg = mkvalue("(ii)", i, j);
678 if (arg == NULL) {
679 DECREF(func);
680 return NULL;
681 }
682 res = call_object(func, arg);
683 DECREF(func);
684 DECREF(arg);
685 return res;
686}
687
688static int
689instance_ass_item(inst, i, item)
690 instanceobject *inst;
691 int i;
692 object *item;
693{
694 object *func, *arg, *res;
695
696 if (item == NULL)
697 func = instance_getattr(inst, "__delitem__");
698 else
699 func = instance_getattr(inst, "__setitem__");
700 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000701 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000702 if (item == NULL)
703 arg = mkvalue("i", i);
704 else
705 arg = mkvalue("(iO)", i, item);
706 if (arg == NULL) {
707 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000708 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000709 }
710 res = call_object(func, arg);
711 DECREF(func);
712 DECREF(arg);
713 if (res == NULL)
714 return -1;
715 DECREF(res);
716 return 0;
717}
718
719static int
720instance_ass_slice(inst, i, j, value)
721 instanceobject *inst;
722 int i, j;
723 object *value;
724{
725 object *func, *arg, *res;
726
727 if (value == NULL)
728 func = instance_getattr(inst, "__delslice__");
729 else
730 func = instance_getattr(inst, "__setslice__");
731 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000732 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733 if (value == NULL)
734 arg = mkvalue("(ii)", i, j);
735 else
736 arg = mkvalue("(iiO)", i, j, value);
737 if (arg == NULL) {
738 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000739 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000740 }
741 res = call_object(func, arg);
742 DECREF(func);
743 DECREF(arg);
744 if (res == NULL)
745 return -1;
746 DECREF(res);
747 return 0;
748}
749
750static sequence_methods instance_as_sequence = {
751 instance_length, /*sq_length*/
752 instance_concat, /*sq_concat*/
753 instance_repeat, /*sq_repeat*/
754 instance_item, /*sq_item*/
755 instance_slice, /*sq_slice*/
756 instance_ass_item, /*sq_ass_item*/
757 instance_ass_slice, /*sq_ass_slice*/
758};
759
760static object *
761generic_binary_op(self, other, methodname)
762 instanceobject *self;
763 object *other;
764 char *methodname;
765{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000766 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767
768 if ((func = instance_getattr(self, methodname)) == NULL)
769 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000770 arg = mkvalue("O", other);
771 if (arg == NULL) {
772 DECREF(func);
773 return NULL;
774 }
775 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000777 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 return res;
779}
780
781static object *
782generic_unary_op(self, methodname)
783 instanceobject *self;
784 char *methodname;
785{
786 object *func, *res;
787
788 if ((func = instance_getattr(self, methodname)) == NULL)
789 return NULL;
790 res = call_object(func, (object *)NULL);
791 DECREF(func);
792 return res;
793}
794
795#define BINARY(funcname, methodname) \
796static object * funcname(self, other) instanceobject *self; object *other; { \
797 return generic_binary_op(self, other, methodname); \
798}
799
800#define UNARY(funcname, methodname) \
801static object *funcname(self) instanceobject *self; { \
802 return generic_unary_op(self, methodname); \
803}
804
805BINARY(instance_add, "__add__")
806BINARY(instance_sub, "__sub__")
807BINARY(instance_mul, "__mul__")
808BINARY(instance_div, "__div__")
809BINARY(instance_mod, "__mod__")
810BINARY(instance_divmod, "__divmod__")
811BINARY(instance_pow, "__pow__")
812UNARY(instance_neg, "__neg__")
813UNARY(instance_pos, "__pos__")
814UNARY(instance_abs, "__abs__")
815
Guido van Rossum9bfef441993-03-29 10:43:31 +0000816static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000817instance_nonzero(self)
818 instanceobject *self;
819{
820 object *func, *res;
821 long outcome;
822
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000823 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000824 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000825 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826 err_clear();
827 /* Fall back to the default behavior:
828 all instances are nonzero */
829 return 1;
830 }
831 }
832 res = call_object(func, (object *)NULL);
833 DECREF(func);
834 if (res == NULL)
835 return -1;
836 if (!is_intobject(res)) {
837 DECREF(res);
838 err_setstr(TypeError, "__nonzero__ should return an int");
839 return -1;
840 }
841 outcome = getintvalue(res);
842 DECREF(res);
843 if (outcome < 0) {
844 err_setstr(ValueError, "__nonzero__ should return >= 0");
845 return -1;
846 }
847 return outcome > 0;
848}
849
850UNARY(instance_invert, "__invert__")
851BINARY(instance_lshift, "__lshift__")
852BINARY(instance_rshift, "__rshift__")
853BINARY(instance_and, "__and__")
854BINARY(instance_xor, "__xor__")
855BINARY(instance_or, "__or__")
856
Guido van Rossume6eefc21992-08-14 12:06:52 +0000857static int
858instance_coerce(pv, pw)
859 object **pv, **pw;
860{
861 object *v = *pv;
862 object *w = *pw;
863 object *func;
864 object *res;
865 int outcome;
866
867 if (!is_instanceobject(v))
868 return 1; /* XXX shouldn't be possible */
869 func = instance_getattr((instanceobject *)v, "__coerce__");
870 if (func == NULL) {
871 err_clear();
872 return 1;
873 }
874 res = call_object(func, w);
875 if (res == NULL)
876 return -1;
877 if (res == None) {
878 DECREF(res);
879 return 1;
880 }
881 outcome = getargs(res, "(OO)", &v, &w);
882 if (!outcome || v->ob_type != w->ob_type ||
883 v->ob_type->tp_as_number == NULL) {
884 DECREF(res);
885 err_setstr(TypeError, "bad __coerce__ result");
886 return -1;
887 }
888 INCREF(v);
889 INCREF(w);
890 DECREF(res);
891 *pv = v;
892 *pw = w;
893 return 0;
894}
895
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000896UNARY(instance_int, "__int__")
897UNARY(instance_long, "__long__")
898UNARY(instance_float, "__float__")
899UNARY(instance_oct, "__oct__")
900UNARY(instance_hex, "__hex__")
901
Guido van Rossum04691fc1992-08-12 15:35:34 +0000902static number_methods instance_as_number = {
903 instance_add, /*nb_add*/
904 instance_sub, /*nb_subtract*/
905 instance_mul, /*nb_multiply*/
906 instance_div, /*nb_divide*/
907 instance_mod, /*nb_remainder*/
908 instance_divmod, /*nb_divmod*/
909 instance_pow, /*nb_power*/
910 instance_neg, /*nb_negative*/
911 instance_pos, /*nb_positive*/
912 instance_abs, /*nb_absolute*/
913 instance_nonzero, /*nb_nonzero*/
914 instance_invert, /*nb_invert*/
915 instance_lshift, /*nb_lshift*/
916 instance_rshift, /*nb_rshift*/
917 instance_and, /*nb_and*/
918 instance_xor, /*nb_xor*/
919 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000920 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000921 instance_int, /*nb_int*/
922 instance_long, /*nb_long*/
923 instance_float, /*nb_float*/
924 instance_oct, /*nb_oct*/
925 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926};
927
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000928typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000929 OB_HEAD_INIT(&Typetype)
930 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000931 "instance",
932 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000933 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000934 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000935 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +0000936 (object * (*) FPROTO((object *, char *)))
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000937 instance_getattr, /*tp_getattr*/
938 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000939 instance_compare, /*tp_compare*/
940 instance_repr, /*tp_repr*/
941 &instance_as_number, /*tp_as_number*/
942 &instance_as_sequence, /*tp_as_sequence*/
943 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000944 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000945};
946
Guido van Rossum9bfef441993-03-29 10:43:31 +0000947static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000948instance_convert(inst, methodname)
949 object *inst;
950 char *methodname;
951{
952 return generic_unary_op((instanceobject *)inst, methodname);
953}
954
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000955
Guido van Rossum81daa321993-05-20 14:24:46 +0000956/* Instance method objects are used for two purposes:
957 (a) as bound instance methods (returned by instancename.methodname)
958 (b) as unbound methods (returned by ClassName.methodname)
959 In case (b), im_self is NULL
960*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000961
962typedef struct {
963 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +0000964 object *im_func; /* The function implementing the method */
965 object *im_self; /* The instance it is bound to, or NULL */
966 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +0000967} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000968
969object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000970newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000971 object *func;
972 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000973 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000974{
Guido van Rossume8122f11991-05-05 20:03:07 +0000975 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000976 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000977 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000978 return NULL;
979 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000980 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
981 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000982 return NULL;
983 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000984 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +0000985 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000986 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000987 INCREF(class);
988 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +0000989 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000990}
991
992object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000993instancemethodgetfunc(im)
994 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000995{
Guido van Rossume8122f11991-05-05 20:03:07 +0000996 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000997 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000998 return NULL;
999 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001000 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001001}
1002
1003object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001004instancemethodgetself(im)
1005 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001006{
Guido van Rossume8122f11991-05-05 20:03:07 +00001007 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001008 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001009 return NULL;
1010 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001011 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001012}
1013
Guido van Rossum81daa321993-05-20 14:24:46 +00001014object *
1015instancemethodgetclass(im)
1016 register object *im;
1017{
1018 if (!is_instancemethodobject(im)) {
1019 err_badcall();
1020 return NULL;
1021 }
1022 return ((instancemethodobject *)im)->im_class;
1023}
1024
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001025/* Class method methods */
1026
Guido van Rossume8122f11991-05-05 20:03:07 +00001027#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001028
Guido van Rossume8122f11991-05-05 20:03:07 +00001029static struct memberlist instancemethod_memberlist[] = {
1030 {"im_func", T_OBJECT, OFF(im_func)},
1031 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001032 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 {NULL} /* Sentinel */
1034};
1035
1036static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001037instancemethod_getattr(im, name)
1038 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039 char *name;
1040{
Guido van Rossume8122f11991-05-05 20:03:07 +00001041 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001042}
1043
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001045instancemethod_dealloc(im)
1046 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047{
Guido van Rossume8122f11991-05-05 20:03:07 +00001048 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001049 XDECREF(im->im_self);
1050 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001051 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001052}
1053
Guido van Rossumebc8c511992-09-03 20:39:51 +00001054static int
1055instancemethod_compare(a, b)
1056 instancemethodobject *a, *b;
1057{
1058 int cmp = cmpobject(a->im_self, b->im_self);
1059 if (cmp == 0)
1060 cmp = cmpobject(a->im_func, b->im_func);
1061 return cmp;
1062}
1063
Guido van Rossum25831651993-05-19 14:50:45 +00001064static object *
1065instancemethod_repr(a)
1066 instancemethodobject *a;
1067{
1068 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001069 instanceobject *self = (instanceobject *)(a->im_self);
1070 funcobject *func = (funcobject *)(a->im_func);
1071 classobject *class = (classobject *)(a->im_class);
1072 object *fclassname, *iclassname, *funcname;
1073 char *fcname, *icname, *fname;
1074 fclassname = class->cl_name;
1075 funcname = func->func_name;
1076 if (fclassname != NULL && is_stringobject(fclassname))
1077 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001078 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001079 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001080 if (funcname != NULL && is_stringobject(funcname))
1081 fname = getstringvalue(funcname);
1082 else
1083 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001084 if (self == NULL)
1085 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1086 else {
1087 iclassname = self->in_class->cl_name;
1088 if (iclassname != NULL && is_stringobject(iclassname))
1089 icname = getstringvalue(iclassname);
1090 else
1091 icname = "?";
1092 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1093 fcname, fname, icname, (long)self);
1094 }
Guido van Rossum25831651993-05-19 14:50:45 +00001095 return newstringobject(buf);
1096}
1097
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098static long
1099instancemethod_hash(a)
1100 instancemethodobject *a;
1101{
1102 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001103 if (a->im_self == NULL)
1104 x = hashobject(None);
1105 else
1106 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001107 if (x == -1)
1108 return -1;
1109 y = hashobject(a->im_func);
1110 if (y == -1)
1111 return -1;
1112 return x ^ y;
1113}
1114
Guido van Rossume8122f11991-05-05 20:03:07 +00001115typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116 OB_HEAD_INIT(&Typetype)
1117 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001118 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001119 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120 0,
Guido van Rossume8122f11991-05-05 20:03:07 +00001121 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +00001123 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001124 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +00001125 instancemethod_compare, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +00001126 instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001127 0, /*tp_as_number*/
1128 0, /*tp_as_sequence*/
1129 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001130 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001131};