blob: 60089995df60610c289ef4882d651d82ad5bc45f [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;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000358 if (name[0] == '_' && name[1] == '_') {
359 if (strcmp(name, "__dict__") == 0) {
360 INCREF(inst->in_dict);
361 return inst->in_dict;
362 }
363 if (strcmp(name, "__class__") == 0) {
364 INCREF(inst->in_class);
365 return (object *)inst->in_class;
366 }
Guido van Rossum94308391991-10-20 20:11:48 +0000367 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000368 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000369 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000370 if (v == NULL) {
371 v = class_lookup(inst->in_class, name, &class);
372 if (v == NULL) {
373 err_setstr(AttributeError, name);
374 return NULL;
375 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000377 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000378 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000379 if (v == NULL)
380 return NULL;
381 }
382 else
383 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000384 if (class != NULL) {
385 if (is_funcobject(v)) {
386 object *w = newinstancemethodobject(v, (object *)inst,
387 (object *)class);
388 DECREF(v);
389 v = w;
390 }
391 else if (is_instancemethodobject(v)) {
392 object *im_class = instancemethodgetclass(v);
393 /* Only if classes are compatible */
394 if (issubclass((object *)class, im_class)) {
395 object *im_func = instancemethodgetfunc(v);
396 object *w = newinstancemethodobject(im_func,
397 (object *)inst, im_class);
398 DECREF(v);
399 v = w;
400 }
401 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000402 }
403 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404}
405
406static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000407instance_setattr(inst, name, v)
408 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 char *name;
410 object *v;
411{
Guido van Rossum25831651993-05-19 14:50:45 +0000412 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000413 if (name[0] == '_' && name[1] == '_') {
414 int n = strlen(name);
415 if (name[n-1] == '_' && name[n-2] == '_') {
416 err_setstr(TypeError, "read-only special attribute");
417 return -1;
418 }
419 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000420 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000421 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000422 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000423 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000424 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000425 if (rv < 0)
426 err_setstr(AttributeError,
427 "delete non-existing instance attribute");
428 return rv;
429 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000431 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432}
433
Guido van Rossum9bfef441993-03-29 10:43:31 +0000434static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000435instance_repr(inst)
436 instanceobject *inst;
437{
438 object *func;
439 object *res;
440
441 func = instance_getattr(inst, "__repr__");
442 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000443 char buf[140];
444 object *classname = inst->in_class->cl_name;
445 char *cname;
446 if (classname != NULL && is_stringobject(classname))
447 cname = getstringvalue(classname);
448 else
449 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000450 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000451 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000452 return newstringobject(buf);
453 }
454 res = call_object(func, (object *)NULL);
455 DECREF(func);
456 return res;
457}
458
Guido van Rossum9bfef441993-03-29 10:43:31 +0000459static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000460instance_compare(inst, other)
461 instanceobject *inst, *other;
462{
463 object *func;
464 object *res;
465 int outcome;
466
467 func = instance_getattr(inst, "__cmp__");
468 if (func == NULL) {
469 err_clear();
470 if (inst < other)
471 return -1;
472 if (inst > other)
473 return 1;
474 return 0;
475 }
476 res = call_object(func, (object *)other);
477 DECREF(func);
478 if (res == NULL) {
479 err_clear(); /* XXX Should report the error, bot how...??? */
480 return 0;
481 }
482 if (is_intobject(res))
483 outcome = getintvalue(res);
484 else
485 outcome = 0; /* XXX Should report the error, bot how...??? */
486 DECREF(res);
487 return outcome;
488}
489
Guido van Rossum9bfef441993-03-29 10:43:31 +0000490static long
491instance_hash(inst)
492 instanceobject *inst;
493{
494 object *func;
495 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000496 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000497
498 func = instance_getattr(inst, "__hash__");
499 if (func == NULL) {
500 /* If there is no __cmp__ method, we hash on the address.
501 If a __cmp__ method exists, there must be a __hash__. */
502 err_clear();
503 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000504 if (func == NULL) {
505 err_clear();
506 outcome = (long)inst;
507 if (outcome == -1)
508 outcome = -2;
509 return outcome;
510 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000511 err_setstr(TypeError, "unhashable instance");
512 return -1;
513 }
514 res = call_object(func, (object *)NULL);
515 DECREF(func);
516 if (res == NULL)
517 return -1;
518 if (is_intobject(res)) {
519 outcome = getintvalue(res);
520 if (outcome == -1)
521 outcome = -2;
522 }
523 else {
524 err_setstr(TypeError, "__hash__() should return an int");
525 outcome = -1;
526 }
527 DECREF(res);
528 return outcome;
529}
530
531static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000532instance_length(inst)
533 instanceobject *inst;
534{
535 object *func;
536 object *res;
537 int outcome;
538
539 func = instance_getattr(inst, "__len__");
540 if (func == NULL)
541 return -1;
542 res = call_object(func, (object *)NULL);
543 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000544 if (res == NULL)
545 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000546 if (is_intobject(res)) {
547 outcome = getintvalue(res);
548 if (outcome < 0)
549 err_setstr(ValueError, "__len__() should return >= 0");
550 }
551 else {
552 err_setstr(TypeError, "__len__() should return an int");
553 outcome = -1;
554 }
555 DECREF(res);
556 return outcome;
557}
558
Guido van Rossum9bfef441993-03-29 10:43:31 +0000559static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000560instance_subscript(inst, key)
561 instanceobject *inst;
562 object *key;
563{
564 object *func;
565 object *arg;
566 object *res;
567
568 func = instance_getattr(inst, "__getitem__");
569 if (func == NULL)
570 return NULL;
571 arg = mkvalue("(O)", key);
572 if (arg == NULL) {
573 DECREF(func);
574 return NULL;
575 }
576 res = call_object(func, arg);
577 DECREF(func);
578 DECREF(arg);
579 return res;
580}
581
Guido van Rossum9bfef441993-03-29 10:43:31 +0000582static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000583instance_ass_subscript(inst, key, value)
584 instanceobject*inst;
585 object *key;
586 object *value;
587{
588 object *func;
589 object *arg;
590 object *res;
591
592 if (value == NULL)
593 func = instance_getattr(inst, "__delitem__");
594 else
595 func = instance_getattr(inst, "__setitem__");
596 if (func == NULL)
597 return -1;
598 if (value == NULL)
599 arg = mkvalue("(O)", key);
600 else
601 arg = mkvalue("(OO)", key, value);
602 if (arg == NULL) {
603 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000604 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000605 }
606 res = call_object(func, arg);
607 DECREF(func);
608 DECREF(arg);
609 if (res == NULL)
610 return -1;
611 DECREF(res);
612 return 0;
613}
614
Guido van Rossum9bfef441993-03-29 10:43:31 +0000615static mapping_methods instance_as_mapping = {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000616 instance_length, /*mp_length*/
617 instance_subscript, /*mp_subscript*/
618 instance_ass_subscript, /*mp_ass_subscript*/
619};
620
621static object *
622instance_concat(inst, other)
623 instanceobject *inst, *other;
624{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000625 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000626
627 func = instance_getattr(inst, "__add__");
628 if (func == NULL)
629 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000630 arg = mkvalue("(O)", other);
631 if (arg == NULL) {
632 DECREF(func);
633 return NULL;
634 }
635 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000636 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000637 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000638 return res;
639}
640
641static object *
642instance_repeat(inst, count)
643 instanceobject *inst;
644 int count;
645{
646 object *func, *arg, *res;
647
648 func = instance_getattr(inst, "__mul__");
649 if (func == NULL)
650 return NULL;
651 arg = newintobject((long)count);
652 if (arg == NULL) {
653 DECREF(func);
654 return NULL;
655 }
656 res = call_object(func, arg);
657 DECREF(func);
658 DECREF(arg);
659 return res;
660}
661
662static object *
663instance_item(inst, i)
664 instanceobject *inst;
665 int i;
666{
667 object *func, *arg, *res;
668
669 func = instance_getattr(inst, "__getitem__");
670 if (func == NULL)
671 return NULL;
672 arg = newintobject((long)i);
673 if (arg == NULL) {
674 DECREF(func);
675 return NULL;
676 }
677 res = call_object(func, arg);
678 DECREF(func);
679 DECREF(arg);
680 return res;
681}
682
683static object *
684instance_slice(inst, i, j)
685 instanceobject *inst;
686 int i, j;
687{
688 object *func, *arg, *res;
689
690 func = instance_getattr(inst, "__getslice__");
691 if (func == NULL)
692 return NULL;
693 arg = mkvalue("(ii)", i, j);
694 if (arg == NULL) {
695 DECREF(func);
696 return NULL;
697 }
698 res = call_object(func, arg);
699 DECREF(func);
700 DECREF(arg);
701 return res;
702}
703
704static int
705instance_ass_item(inst, i, item)
706 instanceobject *inst;
707 int i;
708 object *item;
709{
710 object *func, *arg, *res;
711
712 if (item == NULL)
713 func = instance_getattr(inst, "__delitem__");
714 else
715 func = instance_getattr(inst, "__setitem__");
716 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000717 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000718 if (item == NULL)
719 arg = mkvalue("i", i);
720 else
721 arg = mkvalue("(iO)", i, item);
722 if (arg == NULL) {
723 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000724 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000725 }
726 res = call_object(func, arg);
727 DECREF(func);
728 DECREF(arg);
729 if (res == NULL)
730 return -1;
731 DECREF(res);
732 return 0;
733}
734
735static int
736instance_ass_slice(inst, i, j, value)
737 instanceobject *inst;
738 int i, j;
739 object *value;
740{
741 object *func, *arg, *res;
742
743 if (value == NULL)
744 func = instance_getattr(inst, "__delslice__");
745 else
746 func = instance_getattr(inst, "__setslice__");
747 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000748 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000749 if (value == NULL)
750 arg = mkvalue("(ii)", i, j);
751 else
752 arg = mkvalue("(iiO)", i, j, value);
753 if (arg == NULL) {
754 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000755 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000756 }
757 res = call_object(func, arg);
758 DECREF(func);
759 DECREF(arg);
760 if (res == NULL)
761 return -1;
762 DECREF(res);
763 return 0;
764}
765
766static sequence_methods instance_as_sequence = {
767 instance_length, /*sq_length*/
768 instance_concat, /*sq_concat*/
769 instance_repeat, /*sq_repeat*/
770 instance_item, /*sq_item*/
771 instance_slice, /*sq_slice*/
772 instance_ass_item, /*sq_ass_item*/
773 instance_ass_slice, /*sq_ass_slice*/
774};
775
776static object *
777generic_binary_op(self, other, methodname)
778 instanceobject *self;
779 object *other;
780 char *methodname;
781{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000782 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000783
784 if ((func = instance_getattr(self, methodname)) == NULL)
785 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000786 arg = mkvalue("O", other);
787 if (arg == NULL) {
788 DECREF(func);
789 return NULL;
790 }
791 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000792 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000793 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794 return res;
795}
796
797static object *
798generic_unary_op(self, methodname)
799 instanceobject *self;
800 char *methodname;
801{
802 object *func, *res;
803
804 if ((func = instance_getattr(self, methodname)) == NULL)
805 return NULL;
806 res = call_object(func, (object *)NULL);
807 DECREF(func);
808 return res;
809}
810
811#define BINARY(funcname, methodname) \
812static object * funcname(self, other) instanceobject *self; object *other; { \
813 return generic_binary_op(self, other, methodname); \
814}
815
816#define UNARY(funcname, methodname) \
817static object *funcname(self) instanceobject *self; { \
818 return generic_unary_op(self, methodname); \
819}
820
821BINARY(instance_add, "__add__")
822BINARY(instance_sub, "__sub__")
823BINARY(instance_mul, "__mul__")
824BINARY(instance_div, "__div__")
825BINARY(instance_mod, "__mod__")
826BINARY(instance_divmod, "__divmod__")
827BINARY(instance_pow, "__pow__")
828UNARY(instance_neg, "__neg__")
829UNARY(instance_pos, "__pos__")
830UNARY(instance_abs, "__abs__")
831
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000833instance_nonzero(self)
834 instanceobject *self;
835{
836 object *func, *res;
837 long outcome;
838
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000839 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000841 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000842 err_clear();
843 /* Fall back to the default behavior:
844 all instances are nonzero */
845 return 1;
846 }
847 }
848 res = call_object(func, (object *)NULL);
849 DECREF(func);
850 if (res == NULL)
851 return -1;
852 if (!is_intobject(res)) {
853 DECREF(res);
854 err_setstr(TypeError, "__nonzero__ should return an int");
855 return -1;
856 }
857 outcome = getintvalue(res);
858 DECREF(res);
859 if (outcome < 0) {
860 err_setstr(ValueError, "__nonzero__ should return >= 0");
861 return -1;
862 }
863 return outcome > 0;
864}
865
866UNARY(instance_invert, "__invert__")
867BINARY(instance_lshift, "__lshift__")
868BINARY(instance_rshift, "__rshift__")
869BINARY(instance_and, "__and__")
870BINARY(instance_xor, "__xor__")
871BINARY(instance_or, "__or__")
872
Guido van Rossume6eefc21992-08-14 12:06:52 +0000873static int
874instance_coerce(pv, pw)
875 object **pv, **pw;
876{
877 object *v = *pv;
878 object *w = *pw;
879 object *func;
880 object *res;
881 int outcome;
882
883 if (!is_instanceobject(v))
884 return 1; /* XXX shouldn't be possible */
885 func = instance_getattr((instanceobject *)v, "__coerce__");
886 if (func == NULL) {
887 err_clear();
888 return 1;
889 }
890 res = call_object(func, w);
891 if (res == NULL)
892 return -1;
893 if (res == None) {
894 DECREF(res);
895 return 1;
896 }
897 outcome = getargs(res, "(OO)", &v, &w);
898 if (!outcome || v->ob_type != w->ob_type ||
899 v->ob_type->tp_as_number == NULL) {
900 DECREF(res);
901 err_setstr(TypeError, "bad __coerce__ result");
902 return -1;
903 }
904 INCREF(v);
905 INCREF(w);
906 DECREF(res);
907 *pv = v;
908 *pw = w;
909 return 0;
910}
911
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000912UNARY(instance_int, "__int__")
913UNARY(instance_long, "__long__")
914UNARY(instance_float, "__float__")
915UNARY(instance_oct, "__oct__")
916UNARY(instance_hex, "__hex__")
917
Guido van Rossum04691fc1992-08-12 15:35:34 +0000918static number_methods instance_as_number = {
919 instance_add, /*nb_add*/
920 instance_sub, /*nb_subtract*/
921 instance_mul, /*nb_multiply*/
922 instance_div, /*nb_divide*/
923 instance_mod, /*nb_remainder*/
924 instance_divmod, /*nb_divmod*/
925 instance_pow, /*nb_power*/
926 instance_neg, /*nb_negative*/
927 instance_pos, /*nb_positive*/
928 instance_abs, /*nb_absolute*/
929 instance_nonzero, /*nb_nonzero*/
930 instance_invert, /*nb_invert*/
931 instance_lshift, /*nb_lshift*/
932 instance_rshift, /*nb_rshift*/
933 instance_and, /*nb_and*/
934 instance_xor, /*nb_xor*/
935 instance_or, /*nb_or*/
Guido van Rossume6eefc21992-08-14 12:06:52 +0000936 instance_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000937 instance_int, /*nb_int*/
938 instance_long, /*nb_long*/
939 instance_float, /*nb_float*/
940 instance_oct, /*nb_oct*/
941 instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942};
943
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000944typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000945 OB_HEAD_INIT(&Typetype)
946 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000947 "instance",
948 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000949 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000950 instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000951 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +0000952 (object * (*) FPROTO((object *, char *)))
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000953 instance_getattr, /*tp_getattr*/
954 instance_setattr, /*tp_setattr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000955 instance_compare, /*tp_compare*/
956 instance_repr, /*tp_repr*/
957 &instance_as_number, /*tp_as_number*/
958 &instance_as_sequence, /*tp_as_sequence*/
959 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000960 instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000961};
962
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000964instance_convert(inst, methodname)
965 object *inst;
966 char *methodname;
967{
968 return generic_unary_op((instanceobject *)inst, methodname);
969}
970
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000971
Guido van Rossum81daa321993-05-20 14:24:46 +0000972/* Instance method objects are used for two purposes:
973 (a) as bound instance methods (returned by instancename.methodname)
974 (b) as unbound methods (returned by ClassName.methodname)
975 In case (b), im_self is NULL
976*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000977
978typedef struct {
979 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +0000980 object *im_func; /* The function implementing the method */
981 object *im_self; /* The instance it is bound to, or NULL */
982 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +0000983} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000984
985object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000986newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000987 object *func;
988 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +0000989 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000990{
Guido van Rossume8122f11991-05-05 20:03:07 +0000991 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000992 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000993 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000994 return NULL;
995 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000996 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
997 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000998 return NULL;
999 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001000 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001001 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001002 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001003 INCREF(class);
1004 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001005 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001006}
1007
1008object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001009instancemethodgetfunc(im)
1010 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001011{
Guido van Rossume8122f11991-05-05 20:03:07 +00001012 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001013 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001014 return NULL;
1015 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001016 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001017}
1018
1019object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001020instancemethodgetself(im)
1021 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001022{
Guido van Rossume8122f11991-05-05 20:03:07 +00001023 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001024 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001025 return NULL;
1026 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001027 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001028}
1029
Guido van Rossum81daa321993-05-20 14:24:46 +00001030object *
1031instancemethodgetclass(im)
1032 register object *im;
1033{
1034 if (!is_instancemethodobject(im)) {
1035 err_badcall();
1036 return NULL;
1037 }
1038 return ((instancemethodobject *)im)->im_class;
1039}
1040
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001041/* Class method methods */
1042
Guido van Rossume8122f11991-05-05 20:03:07 +00001043#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001044
Guido van Rossume8122f11991-05-05 20:03:07 +00001045static struct memberlist instancemethod_memberlist[] = {
1046 {"im_func", T_OBJECT, OFF(im_func)},
1047 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001048 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001049 {NULL} /* Sentinel */
1050};
1051
1052static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001053instancemethod_getattr(im, name)
1054 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001055 char *name;
1056{
Guido van Rossume8122f11991-05-05 20:03:07 +00001057 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058}
1059
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001060static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001061instancemethod_dealloc(im)
1062 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001063{
Guido van Rossume8122f11991-05-05 20:03:07 +00001064 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001065 XDECREF(im->im_self);
1066 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001067 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068}
1069
Guido van Rossumebc8c511992-09-03 20:39:51 +00001070static int
1071instancemethod_compare(a, b)
1072 instancemethodobject *a, *b;
1073{
1074 int cmp = cmpobject(a->im_self, b->im_self);
1075 if (cmp == 0)
1076 cmp = cmpobject(a->im_func, b->im_func);
1077 return cmp;
1078}
1079
Guido van Rossum25831651993-05-19 14:50:45 +00001080static object *
1081instancemethod_repr(a)
1082 instancemethodobject *a;
1083{
1084 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001085 instanceobject *self = (instanceobject *)(a->im_self);
1086 funcobject *func = (funcobject *)(a->im_func);
1087 classobject *class = (classobject *)(a->im_class);
1088 object *fclassname, *iclassname, *funcname;
1089 char *fcname, *icname, *fname;
1090 fclassname = class->cl_name;
1091 funcname = func->func_name;
1092 if (fclassname != NULL && is_stringobject(fclassname))
1093 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001094 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001095 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001096 if (funcname != NULL && is_stringobject(funcname))
1097 fname = getstringvalue(funcname);
1098 else
1099 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001100 if (self == NULL)
1101 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1102 else {
1103 iclassname = self->in_class->cl_name;
1104 if (iclassname != NULL && is_stringobject(iclassname))
1105 icname = getstringvalue(iclassname);
1106 else
1107 icname = "?";
1108 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1109 fcname, fname, icname, (long)self);
1110 }
Guido van Rossum25831651993-05-19 14:50:45 +00001111 return newstringobject(buf);
1112}
1113
Guido van Rossum9bfef441993-03-29 10:43:31 +00001114static long
1115instancemethod_hash(a)
1116 instancemethodobject *a;
1117{
1118 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001119 if (a->im_self == NULL)
1120 x = hashobject(None);
1121 else
1122 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 if (x == -1)
1124 return -1;
1125 y = hashobject(a->im_func);
1126 if (y == -1)
1127 return -1;
1128 return x ^ y;
1129}
1130
Guido van Rossume8122f11991-05-05 20:03:07 +00001131typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001132 OB_HEAD_INIT(&Typetype)
1133 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001134 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001135 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001136 0,
Guido van Rossume8122f11991-05-05 20:03:07 +00001137 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +00001139 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001140 0, /*tp_setattr*/
Guido van Rossumebc8c511992-09-03 20:39:51 +00001141 instancemethod_compare, /*tp_compare*/
Guido van Rossum25831651993-05-19 14:50:45 +00001142 instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143 0, /*tp_as_number*/
1144 0, /*tp_as_sequence*/
1145 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001146 instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147};