blob: 8836bb7a264f8f12a028e2a5449c95a8694abe5d [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)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000129 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000130 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 Rossumeb6b33a1993-05-25 09:38:27 +0000160 return setaccessvalue(ac, getowner(), 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;
Guido van Rossum81daa321993-05-20 14:24:46 +0000210 if (class == base)
211 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000212 if (class == NULL || !is_classobject(class))
213 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000214 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 Rossumeb6b33a1993-05-25 09:38:27 +0000366 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000367 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000368 if (v == NULL) {
369 v = class_lookup(inst->in_class, name, &class);
370 if (v == NULL) {
371 err_setstr(AttributeError, name);
372 return NULL;
373 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000375 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000376 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000377 if (v == NULL)
378 return NULL;
379 }
380 else
381 INCREF(v);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000382 if (is_funcobject(v) && class != NULL) {
Guido van Rossumb3f72581993-05-21 19:56:10 +0000383 object *w = newinstancemethodobject(v, (object *)inst,
384 (object *)class);
385 DECREF(v);
386 v = w;
387 }
388 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389}
390
391static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000392instance_setattr(inst, name, v)
393 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 char *name;
395 object *v;
396{
Guido van Rossum25831651993-05-19 14:50:45 +0000397 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000398 if (name[0] == '_' && name[1] == '_') {
399 int n = strlen(name);
400 if (name[n-1] == '_' && name[n-2] == '_') {
401 err_setstr(TypeError, "read-only special attribute");
402 return -1;
403 }
404 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000405 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000406 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000407 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000408 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000409 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000410 if (rv < 0)
411 err_setstr(AttributeError,
412 "delete non-existing instance attribute");
413 return rv;
414 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000416 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417}
418
Guido van Rossum9bfef441993-03-29 10:43:31 +0000419static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000420instance_repr(inst)
421 instanceobject *inst;
422{
423 object *func;
424 object *res;
425
426 func = instance_getattr(inst, "__repr__");
427 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000428 char buf[140];
429 object *classname = inst->in_class->cl_name;
430 char *cname;
431 if (classname != NULL && is_stringobject(classname))
432 cname = getstringvalue(classname);
433 else
434 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000435 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000436 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000437 return newstringobject(buf);
438 }
439 res = call_object(func, (object *)NULL);
440 DECREF(func);
441 return res;
442}
443
Guido van Rossum9bfef441993-03-29 10:43:31 +0000444static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000445instance_compare(inst, other)
446 instanceobject *inst, *other;
447{
448 object *func;
449 object *res;
450 int outcome;
451
452 func = instance_getattr(inst, "__cmp__");
453 if (func == NULL) {
454 err_clear();
455 if (inst < other)
456 return -1;
457 if (inst > other)
458 return 1;
459 return 0;
460 }
461 res = call_object(func, (object *)other);
462 DECREF(func);
463 if (res == NULL) {
464 err_clear(); /* XXX Should report the error, bot how...??? */
465 return 0;
466 }
467 if (is_intobject(res))
468 outcome = getintvalue(res);
469 else
470 outcome = 0; /* XXX Should report the error, bot how...??? */
471 DECREF(res);
472 return outcome;
473}
474
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475static long
476instance_hash(inst)
477 instanceobject *inst;
478{
479 object *func;
480 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000481 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000482
483 func = instance_getattr(inst, "__hash__");
484 if (func == NULL) {
485 /* If there is no __cmp__ method, we hash on the address.
486 If a __cmp__ method exists, there must be a __hash__. */
487 err_clear();
488 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000489 if (func == NULL) {
490 err_clear();
491 outcome = (long)inst;
492 if (outcome == -1)
493 outcome = -2;
494 return outcome;
495 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000496 err_setstr(TypeError, "unhashable instance");
497 return -1;
498 }
499 res = call_object(func, (object *)NULL);
500 DECREF(func);
501 if (res == NULL)
502 return -1;
503 if (is_intobject(res)) {
504 outcome = getintvalue(res);
505 if (outcome == -1)
506 outcome = -2;
507 }
508 else {
509 err_setstr(TypeError, "__hash__() should return an int");
510 outcome = -1;
511 }
512 DECREF(res);
513 return outcome;
514}
515
516static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000517instance_length(inst)
518 instanceobject *inst;
519{
520 object *func;
521 object *res;
522 int outcome;
523
524 func = instance_getattr(inst, "__len__");
525 if (func == NULL)
526 return -1;
527 res = call_object(func, (object *)NULL);
528 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000529 if (res == NULL)
530 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000531 if (is_intobject(res)) {
532 outcome = getintvalue(res);
533 if (outcome < 0)
534 err_setstr(ValueError, "__len__() should return >= 0");
535 }
536 else {
537 err_setstr(TypeError, "__len__() should return an int");
538 outcome = -1;
539 }
540 DECREF(res);
541 return outcome;
542}
543
Guido van Rossum9bfef441993-03-29 10:43:31 +0000544static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000545instance_subscript(inst, key)
546 instanceobject *inst;
547 object *key;
548{
549 object *func;
550 object *arg;
551 object *res;
552
553 func = instance_getattr(inst, "__getitem__");
554 if (func == NULL)
555 return NULL;
556 arg = mkvalue("(O)", key);
557 if (arg == NULL) {
558 DECREF(func);
559 return NULL;
560 }
561 res = call_object(func, arg);
562 DECREF(func);
563 DECREF(arg);
564 return res;
565}
566
Guido van Rossum9bfef441993-03-29 10:43:31 +0000567static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000568instance_ass_subscript(inst, key, value)
569 instanceobject*inst;
570 object *key;
571 object *value;
572{
573 object *func;
574 object *arg;
575 object *res;
576
577 if (value == NULL)
578 func = instance_getattr(inst, "__delitem__");
579 else
580 func = instance_getattr(inst, "__setitem__");
581 if (func == NULL)
582 return -1;
583 if (value == NULL)
584 arg = mkvalue("(O)", key);
585 else
586 arg = mkvalue("(OO)", key, value);
587 if (arg == NULL) {
588 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000589 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000590 }
591 res = call_object(func, arg);
592 DECREF(func);
593 DECREF(arg);
594 if (res == NULL)
595 return -1;
596 DECREF(res);
597 return 0;
598}
599
Guido van Rossum9bfef441993-03-29 10:43:31 +0000600static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000601 instance_length, /*mp_length*/
602 instance_subscript, /*mp_subscript*/
603 instance_ass_subscript, /*mp_ass_subscript*/
604};
605
606static object *
607instance_concat(inst, other)
608 instanceobject *inst, *other;
609{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000610 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000611
612 func = instance_getattr(inst, "__add__");
613 if (func == NULL)
614 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000615 arg = mkvalue("(O)", other);
616 if (arg == NULL) {
617 DECREF(func);
618 return NULL;
619 }
620 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000621 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000622 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000623 return res;
624}
625
626static object *
627instance_repeat(inst, count)
628 instanceobject *inst;
629 int count;
630{
631 object *func, *arg, *res;
632
633 func = instance_getattr(inst, "__mul__");
634 if (func == NULL)
635 return NULL;
636 arg = newintobject((long)count);
637 if (arg == NULL) {
638 DECREF(func);
639 return NULL;
640 }
641 res = call_object(func, arg);
642 DECREF(func);
643 DECREF(arg);
644 return res;
645}
646
647static object *
648instance_item(inst, i)
649 instanceobject *inst;
650 int i;
651{
652 object *func, *arg, *res;
653
654 func = instance_getattr(inst, "__getitem__");
655 if (func == NULL)
656 return NULL;
657 arg = newintobject((long)i);
658 if (arg == NULL) {
659 DECREF(func);
660 return NULL;
661 }
662 res = call_object(func, arg);
663 DECREF(func);
664 DECREF(arg);
665 return res;
666}
667
668static object *
669instance_slice(inst, i, j)
670 instanceobject *inst;
671 int i, j;
672{
673 object *func, *arg, *res;
674
675 func = instance_getattr(inst, "__getslice__");
676 if (func == NULL)
677 return NULL;
678 arg = mkvalue("(ii)", i, j);
679 if (arg == NULL) {
680 DECREF(func);
681 return NULL;
682 }
683 res = call_object(func, arg);
684 DECREF(func);
685 DECREF(arg);
686 return res;
687}
688
689static int
690instance_ass_item(inst, i, item)
691 instanceobject *inst;
692 int i;
693 object *item;
694{
695 object *func, *arg, *res;
696
697 if (item == NULL)
698 func = instance_getattr(inst, "__delitem__");
699 else
700 func = instance_getattr(inst, "__setitem__");
701 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000702 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000703 if (item == NULL)
704 arg = mkvalue("i", i);
705 else
706 arg = mkvalue("(iO)", i, item);
707 if (arg == NULL) {
708 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000709 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000710 }
711 res = call_object(func, arg);
712 DECREF(func);
713 DECREF(arg);
714 if (res == NULL)
715 return -1;
716 DECREF(res);
717 return 0;
718}
719
720static int
721instance_ass_slice(inst, i, j, value)
722 instanceobject *inst;
723 int i, j;
724 object *value;
725{
726 object *func, *arg, *res;
727
728 if (value == NULL)
729 func = instance_getattr(inst, "__delslice__");
730 else
731 func = instance_getattr(inst, "__setslice__");
732 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000733 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000734 if (value == NULL)
735 arg = mkvalue("(ii)", i, j);
736 else
737 arg = mkvalue("(iiO)", i, j, value);
738 if (arg == NULL) {
739 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000740 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000741 }
742 res = call_object(func, arg);
743 DECREF(func);
744 DECREF(arg);
745 if (res == NULL)
746 return -1;
747 DECREF(res);
748 return 0;
749}
750
751static sequence_methods instance_as_sequence = {
752 instance_length, /*sq_length*/
753 instance_concat, /*sq_concat*/
754 instance_repeat, /*sq_repeat*/
755 instance_item, /*sq_item*/
756 instance_slice, /*sq_slice*/
757 instance_ass_item, /*sq_ass_item*/
758 instance_ass_slice, /*sq_ass_slice*/
759};
760
761static object *
762generic_binary_op(self, other, methodname)
763 instanceobject *self;
764 object *other;
765 char *methodname;
766{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000767 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768
769 if ((func = instance_getattr(self, methodname)) == NULL)
770 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000771 arg = mkvalue("O", other);
772 if (arg == NULL) {
773 DECREF(func);
774 return NULL;
775 }
776 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000777 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000778 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000779 return res;
780}
781
782static object *
783generic_unary_op(self, methodname)
784 instanceobject *self;
785 char *methodname;
786{
787 object *func, *res;
788
789 if ((func = instance_getattr(self, methodname)) == NULL)
790 return NULL;
791 res = call_object(func, (object *)NULL);
792 DECREF(func);
793 return res;
794}
795
796#define BINARY(funcname, methodname) \
797static object * funcname(self, other) instanceobject *self; object *other; { \
798 return generic_binary_op(self, other, methodname); \
799}
800
801#define UNARY(funcname, methodname) \
802static object *funcname(self) instanceobject *self; { \
803 return generic_unary_op(self, methodname); \
804}
805
806BINARY(instance_add, "__add__")
807BINARY(instance_sub, "__sub__")
808BINARY(instance_mul, "__mul__")
809BINARY(instance_div, "__div__")
810BINARY(instance_mod, "__mod__")
811BINARY(instance_divmod, "__divmod__")
812BINARY(instance_pow, "__pow__")
813UNARY(instance_neg, "__neg__")
814UNARY(instance_pos, "__pos__")
815UNARY(instance_abs, "__abs__")
816
Guido van Rossum9bfef441993-03-29 10:43:31 +0000817static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000818instance_nonzero(self)
819 instanceobject *self;
820{
821 object *func, *res;
822 long outcome;
823
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000824 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000825 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000826 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000827 err_clear();
828 /* Fall back to the default behavior:
829 all instances are nonzero */
830 return 1;
831 }
832 }
833 res = call_object(func, (object *)NULL);
834 DECREF(func);
835 if (res == NULL)
836 return -1;
837 if (!is_intobject(res)) {
838 DECREF(res);
839 err_setstr(TypeError, "__nonzero__ should return an int");
840 return -1;
841 }
842 outcome = getintvalue(res);
843 DECREF(res);
844 if (outcome < 0) {
845 err_setstr(ValueError, "__nonzero__ should return >= 0");
846 return -1;
847 }
848 return outcome > 0;
849}
850
851UNARY(instance_invert, "__invert__")
852BINARY(instance_lshift, "__lshift__")
853BINARY(instance_rshift, "__rshift__")
854BINARY(instance_and, "__and__")
855BINARY(instance_xor, "__xor__")
856BINARY(instance_or, "__or__")
857
Guido van Rossume6eefc21992-08-14 12:06:52 +0000858static int
859instance_coerce(pv, pw)
860 object **pv, **pw;
861{
862 object *v = *pv;
863 object *w = *pw;
864 object *func;
865 object *res;
866 int outcome;
867
868 if (!is_instanceobject(v))
869 return 1; /* XXX shouldn't be possible */
870 func = instance_getattr((instanceobject *)v, "__coerce__");
871 if (func == NULL) {
872 err_clear();
873 return 1;
874 }
875 res = call_object(func, w);
876 if (res == NULL)
877 return -1;
878 if (res == None) {
879 DECREF(res);
880 return 1;
881 }
882 outcome = getargs(res, "(OO)", &v, &w);
883 if (!outcome || v->ob_type != w->ob_type ||
884 v->ob_type->tp_as_number == NULL) {
885 DECREF(res);
886 err_setstr(TypeError, "bad __coerce__ result");
887 return -1;
888 }
889 INCREF(v);
890 INCREF(w);
891 DECREF(res);
892 *pv = v;
893 *pw = w;
894 return 0;
895}
896
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000897UNARY(instance_int, "__int__")
898UNARY(instance_long, "__long__")
899UNARY(instance_float, "__float__")
900UNARY(instance_oct, "__oct__")
901UNARY(instance_hex, "__hex__")
902
Guido van Rossum04691fc1992-08-12 15:35:34 +0000903static number_methods instance_as_number = {
904 instance_add, /*nb_add*/
905 instance_sub, /*nb_subtract*/
906 instance_mul, /*nb_multiply*/
907 instance_div, /*nb_divide*/
908 instance_mod, /*nb_remainder*/
909 instance_divmod, /*nb_divmod*/
910 instance_pow, /*nb_power*/
911 instance_neg, /*nb_negative*/
912 instance_pos, /*nb_positive*/
913 instance_abs, /*nb_absolute*/
914 instance_nonzero, /*nb_nonzero*/
915 instance_invert, /*nb_invert*/
916 instance_lshift, /*nb_lshift*/
917 instance_rshift, /*nb_rshift*/
918 instance_and, /*nb_and*/
919 instance_xor, /*nb_xor*/
920 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000921 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000922 instance_int, /*nb_int*/
923 instance_long, /*nb_long*/
924 instance_float, /*nb_float*/
925 instance_oct, /*nb_oct*/
926 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927};
928
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000929typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000930 OB_HEAD_INIT(&Typetype)
931 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000932 "instance",
933 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000934 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000935 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000936 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +0000937 (object * (*) FPROTO((object *, char *)))
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000938 instance_getattr, /*tp_getattr*/
939 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000940 instance_compare, /*tp_compare*/
941 instance_repr, /*tp_repr*/
942 &instance_as_number, /*tp_as_number*/
943 &instance_as_sequence, /*tp_as_sequence*/
944 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000945 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000946};
947
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000949instance_convert(inst, methodname)
950 object *inst;
951 char *methodname;
952{
953 return generic_unary_op((instanceobject *)inst, methodname);
954}
955
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000956
Guido van Rossum81daa321993-05-20 14:24:46 +0000957/* Instance method objects are used for two purposes:
958 (a) as bound instance methods (returned by instancename.methodname)
959 (b) as unbound methods (returned by ClassName.methodname)
960 In case (b), im_self is NULL
961*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000962
963typedef struct {
964 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +0000965 object *im_func; /* The function implementing the method */
966 object *im_self; /* The instance it is bound to, or NULL */
967 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +0000968} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000969
970object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000971newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000972 object *func;
973 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000974 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000975{
Guido van Rossume8122f11991-05-05 20:03:07 +0000976 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000977 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000978 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000979 return NULL;
980 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000981 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
982 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000983 return NULL;
984 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000985 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +0000986 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000987 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000988 INCREF(class);
989 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +0000990 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000991}
992
993object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000994instancemethodgetfunc(im)
995 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000996{
Guido van Rossume8122f11991-05-05 20:03:07 +0000997 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000998 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000999 return NULL;
1000 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001001 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001002}
1003
1004object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001005instancemethodgetself(im)
1006 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001007{
Guido van Rossume8122f11991-05-05 20:03:07 +00001008 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001009 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001010 return NULL;
1011 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001012 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001013}
1014
Guido van Rossum81daa321993-05-20 14:24:46 +00001015object *
1016instancemethodgetclass(im)
1017 register object *im;
1018{
1019 if (!is_instancemethodobject(im)) {
1020 err_badcall();
1021 return NULL;
1022 }
1023 return ((instancemethodobject *)im)->im_class;
1024}
1025
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001026/* Class method methods */
1027
Guido van Rossume8122f11991-05-05 20:03:07 +00001028#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001029
Guido van Rossume8122f11991-05-05 20:03:07 +00001030static struct memberlist instancemethod_memberlist[] = {
1031 {"im_func", T_OBJECT, OFF(im_func)},
1032 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001033 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001034 {NULL} /* Sentinel */
1035};
1036
1037static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001038instancemethod_getattr(im, name)
1039 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001040 char *name;
1041{
Guido van Rossume8122f11991-05-05 20:03:07 +00001042 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043}
1044
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001046instancemethod_dealloc(im)
1047 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001048{
Guido van Rossume8122f11991-05-05 20:03:07 +00001049 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001050 XDECREF(im->im_self);
1051 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001052 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001053}
1054
Guido van Rossumebc8c511992-09-03 20:39:51 +00001055static int
1056instancemethod_compare(a, b)
1057 instancemethodobject *a, *b;
1058{
1059 int cmp = cmpobject(a->im_self, b->im_self);
1060 if (cmp == 0)
1061 cmp = cmpobject(a->im_func, b->im_func);
1062 return cmp;
1063}
1064
Guido van Rossum25831651993-05-19 14:50:45 +00001065static object *
1066instancemethod_repr(a)
1067 instancemethodobject *a;
1068{
1069 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001070 instanceobject *self = (instanceobject *)(a->im_self);
1071 funcobject *func = (funcobject *)(a->im_func);
1072 classobject *class = (classobject *)(a->im_class);
1073 object *fclassname, *iclassname, *funcname;
1074 char *fcname, *icname, *fname;
1075 fclassname = class->cl_name;
1076 funcname = func->func_name;
1077 if (fclassname != NULL && is_stringobject(fclassname))
1078 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001079 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001080 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001081 if (funcname != NULL && is_stringobject(funcname))
1082 fname = getstringvalue(funcname);
1083 else
1084 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001085 if (self == NULL)
1086 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1087 else {
1088 iclassname = self->in_class->cl_name;
1089 if (iclassname != NULL && is_stringobject(iclassname))
1090 icname = getstringvalue(iclassname);
1091 else
1092 icname = "?";
1093 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1094 fcname, fname, icname, (long)self);
1095 }
Guido van Rossum25831651993-05-19 14:50:45 +00001096 return newstringobject(buf);
1097}
1098
Guido van Rossum9bfef441993-03-29 10:43:31 +00001099static long
1100instancemethod_hash(a)
1101 instancemethodobject *a;
1102{
1103 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001104 if (a->im_self == NULL)
1105 x = hashobject(None);
1106 else
1107 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001108 if (x == -1)
1109 return -1;
1110 y = hashobject(a->im_func);
1111 if (y == -1)
1112 return -1;
1113 return x ^ y;
1114}
1115
Guido van Rossume8122f11991-05-05 20:03:07 +00001116typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117 OB_HEAD_INIT(&Typetype)
1118 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001119 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001120 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001121 0,
Guido van Rossume8122f11991-05-05 20:03:07 +00001122 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +00001124 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001125 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +00001126 instancemethod_compare, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +00001127 instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001128 0, /*tp_as_number*/
1129 0, /*tp_as_sequence*/
1130 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001132};