blob: a05c0bf368d7cf4340577c41178950f53af237dd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumb6775db1994-08-01 11:34:53 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, 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 Rossumb6775db1994-08-01 11:34:53 +0000106 classobject *class;
Guido van Rossume149fa21994-08-12 12:49:46 +0000107 if (name[0] == '_' && name[1] == '_') {
108 if (strcmp(name, "__dict__") == 0) {
109 INCREF(op->cl_dict);
110 return op->cl_dict;
111 }
112 if (strcmp(name, "__bases__") == 0) {
113 INCREF(op->cl_bases);
114 return op->cl_bases;
115 }
116 if (strcmp(name, "__name__") == 0) {
117 if (op->cl_name == NULL)
118 v = None;
119 else
120 v = op->cl_name;
121 INCREF(v);
122 return v;
123 }
Guido van Rossum94308391991-10-20 20:11:48 +0000124 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000125 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000126 if (v == NULL) {
127 err_setstr(AttributeError, name);
128 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000130 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000131 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000132 if (v == NULL)
133 return NULL;
134 }
135 else
136 INCREF(v);
137 if (is_funcobject(v)) {
138 object *w = newinstancemethodobject(v, (object *)NULL,
139 (object *)class);
140 DECREF(v);
141 v = w;
142 }
143 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144}
145
Guido van Rossum94308391991-10-20 20:11:48 +0000146static int
147class_setattr(op, name, v)
148 classobject *op;
149 char *name;
150 object *v;
151{
Guido van Rossum25831651993-05-19 14:50:45 +0000152 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000153 if (name[0] == '_' && name[1] == '_') {
154 int n = strlen(name);
155 if (name[n-1] == '_' && name[n-2] == '_') {
156 err_setstr(TypeError, "read-only special attribute");
157 return -1;
158 }
159 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000160 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000161 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000162 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000163 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000164 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000165 if (rv < 0)
166 err_setstr(AttributeError,
167 "delete non-existing class attribute");
168 return rv;
169 }
Guido van Rossum94308391991-10-20 20:11:48 +0000170 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000171 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000172}
173
Guido van Rossum25831651993-05-19 14:50:45 +0000174static object *
175class_repr(op)
176 classobject *op;
177{
178 char buf[140];
179 char *name;
180 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
181 name = "?";
182 else
183 name = getstringvalue(op->cl_name);
184 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
185 return newstringobject(buf);
186}
187
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188typeobject Classtype = {
189 OB_HEAD_INIT(&Typetype)
190 0,
191 "class",
192 sizeof(classobject),
193 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196 (getattrfunc)class_getattr, /*tp_getattr*/
197 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000199 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200 0, /*tp_as_number*/
201 0, /*tp_as_sequence*/
202 0, /*tp_as_mapping*/
203};
204
Guido van Rossum81daa321993-05-20 14:24:46 +0000205int
206issubclass(class, base)
207 object *class;
208 object *base;
209{
210 int i, n;
211 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000212 if (class == base)
213 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000214 if (class == NULL || !is_classobject(class))
215 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000216 cp = (classobject *)class;
217 n = gettuplesize(cp->cl_bases);
218 for (i = 0; i < n; i++) {
219 if (issubclass(gettupleitem(cp->cl_bases, i), base))
220 return 1;
221 }
222 return 0;
223}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224
Guido van Rossum81daa321993-05-20 14:24:46 +0000225
226/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227
Guido van Rossum25831651993-05-19 14:50:45 +0000228static object *instance_getattr PROTO((instanceobject *, char *));
229
Guido van Rossum81daa321993-05-20 14:24:46 +0000230static int
231addaccess(class, inst)
232 classobject *class;
233 instanceobject *inst;
234{
235 int i, n, pos, ret;
236 object *key, *value, *ac;
237
238 n = gettuplesize(class->cl_bases);
239 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000240 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000241 return -1;
242 }
243
244 pos = 0;
245 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
Guido van Rossumb3f72581993-05-21 19:56:10 +0000246 object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000247 if (!is_accessobject(value))
248 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000249 if (hasaccessvalue(value))
250 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000251 ac = dict2lookup(inst->in_dict, key);
252 if (ac != NULL && is_accessobject(ac)) {
253 err_setval(ConflictError, key);
254 return -1;
255 }
256 ac = cloneaccessobject(value);
257 if (ac == NULL)
258 return -1;
259 ret = dict2insert(inst->in_dict, key, ac);
260 DECREF(ac);
261 if (ret != 0)
262 return -1;
263 }
264 return 0;
265}
266
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267object *
Guido van Rossum25831651993-05-19 14:50:45 +0000268newinstanceobject(class, arg)
269 object *class;
270 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271{
Guido van Rossume8122f11991-05-05 20:03:07 +0000272 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000273 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000274 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000276 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 return NULL;
278 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000279 inst = NEWOBJ(instanceobject, &Instancetype);
280 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 return NULL;
282 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000283 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000284 inst->in_dict = newdictobject();
Guido van Rossume149fa21994-08-12 12:49:46 +0000285 inst->in_getattr = NULL;
286 inst->in_setattr = NULL;
287#ifdef WITH_THREAD
288 inst->in_lock = NULL;
289 inst->in_ident = 0;
290#endif
Guido van Rossum81daa321993-05-20 14:24:46 +0000291 if (inst->in_dict == NULL ||
292 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000293 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 }
Guido van Rossume149fa21994-08-12 12:49:46 +0000296 inst->in_setattr = instance_getattr(inst, "__setattr__");
297 err_clear();
298 inst->in_getattr = instance_getattr(inst, "__getattr__");
299 err_clear();
300#ifdef WITH_THREAD
301 if (inst->in_getattr != NULL)
302 inst->in_lock = allocate_lock();
303#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000304 init = instance_getattr(inst, "__init__");
305 if (init == NULL) {
306 err_clear();
307 if (arg != NULL && !(is_tupleobject(arg) &&
308 gettuplesize(arg) == 0)) {
309 err_setstr(TypeError,
310 "this classobject() takes no arguments");
311 DECREF(inst);
312 inst = NULL;
313 }
314 }
315 else {
316 object *res = call_object(init, arg);
317 DECREF(init);
318 if (res == NULL) {
319 DECREF(inst);
320 inst = NULL;
321 }
322 else {
323 if (res != None) {
324 err_setstr(TypeError,
325 "__init__() should return None");
326 DECREF(inst);
327 inst = NULL;
328 }
329 DECREF(res);
330 }
331 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000332 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000335/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336
337static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000338instance_dealloc(inst)
339 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
Guido van Rossum25831651993-05-19 14:50:45 +0000341 object *error_type, *error_value;
342 object *del;
343 /* Call the __del__ method if it exists. First temporarily
344 revive the object and save the current exception, if any. */
345 INCREF(inst);
346 err_get(&error_type, &error_value);
347 if ((del = instance_getattr(inst, "__del__")) != NULL) {
348 object *args = newtupleobject(0);
349 object *res = args;
350 if (res != NULL)
351 res = call_object(del, args);
352 XDECREF(args);
353 DECREF(del);
354 XDECREF(res);
355 /* XXX If __del__ raised an exception, it is ignored! */
356 }
357 /* Restore the saved exception and undo the temporary revival */
358 err_setval(error_type, error_value);
359 /* Can't use DECREF here, it would cause a recursive call */
360 if (--inst->ob_refcnt > 0)
361 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000362 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000363 XDECREF(inst->in_dict);
Guido van Rossume149fa21994-08-12 12:49:46 +0000364 XDECREF(inst->in_getattr);
365 XDECREF(inst->in_setattr);
366#ifdef WITH_THREAD
367 if (inst->in_lock != NULL)
368 free_lock(inst->in_lock);
369#endif
Guido van Rossume8122f11991-05-05 20:03:07 +0000370 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371}
372
373static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000374instance_getattr(inst, name)
375 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 register char *name;
377{
Guido van Rossum94308391991-10-20 20:11:48 +0000378 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000379 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000380 if (name[0] == '_' && name[1] == '_') {
381 if (strcmp(name, "__dict__") == 0) {
382 INCREF(inst->in_dict);
383 return inst->in_dict;
384 }
385 if (strcmp(name, "__class__") == 0) {
386 INCREF(inst->in_class);
387 return (object *)inst->in_class;
388 }
Guido van Rossum94308391991-10-20 20:11:48 +0000389 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000390 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000391 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000392 if (v == NULL) {
393 v = class_lookup(inst->in_class, name, &class);
394 if (v == NULL) {
Guido van Rossume149fa21994-08-12 12:49:46 +0000395 object *func;
396 long ident;
397 if ((func = inst->in_getattr) != NULL &&
398 inst->in_ident != (ident = get_thread_ident())) {
399 object *args;
400#ifdef WITH_THREAD
401 type_lock lock = inst->in_lock;
402 if (lock != NULL) {
403 BGN_SAVE
404 acquire_lock(lock, 0);
405 END_SAVE
406 }
407#endif
408 inst->in_ident = ident;
409 args = mkvalue("(s)", name);
410 if (args != NULL) {
411 v = call_object(func, args);
412 DECREF(args);
413 }
414 inst->in_ident = 0;
415#ifdef WITH_THREAD
416 if (lock != NULL)
417 release_lock(lock);
418#endif
419 return v;
420 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000421 err_setstr(AttributeError, name);
422 return NULL;
423 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000425 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000426 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000427 if (v == NULL)
428 return NULL;
429 }
430 else
431 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000432 if (class != NULL) {
433 if (is_funcobject(v)) {
434 object *w = newinstancemethodobject(v, (object *)inst,
435 (object *)class);
436 DECREF(v);
437 v = w;
438 }
439 else if (is_instancemethodobject(v)) {
440 object *im_class = instancemethodgetclass(v);
441 /* Only if classes are compatible */
442 if (issubclass((object *)class, im_class)) {
443 object *im_func = instancemethodgetfunc(v);
444 object *w = newinstancemethodobject(im_func,
445 (object *)inst, im_class);
446 DECREF(v);
447 v = w;
448 }
449 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000450 }
451 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452}
453
454static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000455instance_setattr(inst, name, v)
456 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457 char *name;
458 object *v;
459{
Guido van Rossum25831651993-05-19 14:50:45 +0000460 object *ac;
Guido van Rossume149fa21994-08-12 12:49:46 +0000461 if (inst->in_setattr != NULL) {
Guido van Rossum91ab4a81994-08-16 22:13:47 +0000462 object *args;
463 if (v == NULL)
464 args = mkvalue("(s)", name);
465 else
466 args = mkvalue("(sO)", name, v);
Guido van Rossume149fa21994-08-12 12:49:46 +0000467 if (args != NULL) {
468 object *res = call_object(inst->in_setattr, args);
469 DECREF(args);
470 if (res != NULL) {
471 DECREF(res);
472 return 0;
473 }
474 }
475 return -1;
476 }
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000477 if (name[0] == '_' && name[1] == '_') {
478 int n = strlen(name);
479 if (name[n-1] == '_' && name[n-2] == '_') {
480 err_setstr(TypeError, "read-only special attribute");
481 return -1;
482 }
483 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000484 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000485 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000486 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000487 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000488 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000489 if (rv < 0)
490 err_setstr(AttributeError,
491 "delete non-existing instance attribute");
492 return rv;
493 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000495 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496}
497
Guido van Rossum9bfef441993-03-29 10:43:31 +0000498static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000499instance_repr(inst)
500 instanceobject *inst;
501{
502 object *func;
503 object *res;
504
505 func = instance_getattr(inst, "__repr__");
506 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000507 char buf[140];
508 object *classname = inst->in_class->cl_name;
509 char *cname;
510 if (classname != NULL && is_stringobject(classname))
511 cname = getstringvalue(classname);
512 else
513 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000514 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000515 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000516 return newstringobject(buf);
517 }
518 res = call_object(func, (object *)NULL);
519 DECREF(func);
520 return res;
521}
522
Guido van Rossum9bfef441993-03-29 10:43:31 +0000523static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000524instance_compare(inst, other)
525 instanceobject *inst, *other;
526{
527 object *func;
528 object *res;
529 int outcome;
530
531 func = instance_getattr(inst, "__cmp__");
532 if (func == NULL) {
533 err_clear();
534 if (inst < other)
535 return -1;
536 if (inst > other)
537 return 1;
538 return 0;
539 }
540 res = call_object(func, (object *)other);
541 DECREF(func);
542 if (res == NULL) {
543 err_clear(); /* XXX Should report the error, bot how...??? */
544 return 0;
545 }
546 if (is_intobject(res))
547 outcome = getintvalue(res);
548 else
549 outcome = 0; /* XXX Should report the error, bot how...??? */
550 DECREF(res);
551 return outcome;
552}
553
Guido van Rossum9bfef441993-03-29 10:43:31 +0000554static long
555instance_hash(inst)
556 instanceobject *inst;
557{
558 object *func;
559 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000560 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000561
562 func = instance_getattr(inst, "__hash__");
563 if (func == NULL) {
564 /* If there is no __cmp__ method, we hash on the address.
565 If a __cmp__ method exists, there must be a __hash__. */
566 err_clear();
567 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000568 if (func == NULL) {
569 err_clear();
570 outcome = (long)inst;
571 if (outcome == -1)
572 outcome = -2;
573 return outcome;
574 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000575 err_setstr(TypeError, "unhashable instance");
576 return -1;
577 }
578 res = call_object(func, (object *)NULL);
579 DECREF(func);
580 if (res == NULL)
581 return -1;
582 if (is_intobject(res)) {
583 outcome = getintvalue(res);
584 if (outcome == -1)
585 outcome = -2;
586 }
587 else {
588 err_setstr(TypeError, "__hash__() should return an int");
589 outcome = -1;
590 }
591 DECREF(res);
592 return outcome;
593}
594
595static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000596instance_length(inst)
597 instanceobject *inst;
598{
599 object *func;
600 object *res;
601 int outcome;
602
603 func = instance_getattr(inst, "__len__");
604 if (func == NULL)
605 return -1;
606 res = call_object(func, (object *)NULL);
607 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000608 if (res == NULL)
609 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610 if (is_intobject(res)) {
611 outcome = getintvalue(res);
612 if (outcome < 0)
613 err_setstr(ValueError, "__len__() should return >= 0");
614 }
615 else {
616 err_setstr(TypeError, "__len__() should return an int");
617 outcome = -1;
618 }
619 DECREF(res);
620 return outcome;
621}
622
Guido van Rossum9bfef441993-03-29 10:43:31 +0000623static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000624instance_subscript(inst, key)
625 instanceobject *inst;
626 object *key;
627{
628 object *func;
629 object *arg;
630 object *res;
631
632 func = instance_getattr(inst, "__getitem__");
633 if (func == NULL)
634 return NULL;
635 arg = mkvalue("(O)", key);
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
Guido van Rossum9bfef441993-03-29 10:43:31 +0000646static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000647instance_ass_subscript(inst, key, value)
648 instanceobject*inst;
649 object *key;
650 object *value;
651{
652 object *func;
653 object *arg;
654 object *res;
655
656 if (value == NULL)
657 func = instance_getattr(inst, "__delitem__");
658 else
659 func = instance_getattr(inst, "__setitem__");
660 if (func == NULL)
661 return -1;
662 if (value == NULL)
663 arg = mkvalue("(O)", key);
664 else
665 arg = mkvalue("(OO)", key, value);
666 if (arg == NULL) {
667 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000668 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000669 }
670 res = call_object(func, arg);
671 DECREF(func);
672 DECREF(arg);
673 if (res == NULL)
674 return -1;
675 DECREF(res);
676 return 0;
677}
678
Guido van Rossum9bfef441993-03-29 10:43:31 +0000679static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000680 (inquiry)instance_length, /*mp_length*/
681 (binaryfunc)instance_subscript, /*mp_subscript*/
682 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000683};
684
685static object *
686instance_concat(inst, other)
687 instanceobject *inst, *other;
688{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000689 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000690
691 func = instance_getattr(inst, "__add__");
692 if (func == NULL)
693 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000694 arg = mkvalue("(O)", other);
695 if (arg == NULL) {
696 DECREF(func);
697 return NULL;
698 }
699 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000700 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000701 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000702 return res;
703}
704
705static object *
706instance_repeat(inst, count)
707 instanceobject *inst;
708 int count;
709{
710 object *func, *arg, *res;
711
712 func = instance_getattr(inst, "__mul__");
713 if (func == NULL)
714 return NULL;
715 arg = newintobject((long)count);
716 if (arg == NULL) {
717 DECREF(func);
718 return NULL;
719 }
720 res = call_object(func, arg);
721 DECREF(func);
722 DECREF(arg);
723 return res;
724}
725
726static object *
727instance_item(inst, i)
728 instanceobject *inst;
729 int i;
730{
731 object *func, *arg, *res;
732
733 func = instance_getattr(inst, "__getitem__");
734 if (func == NULL)
735 return NULL;
736 arg = newintobject((long)i);
737 if (arg == NULL) {
738 DECREF(func);
739 return NULL;
740 }
741 res = call_object(func, arg);
742 DECREF(func);
743 DECREF(arg);
744 return res;
745}
746
747static object *
748instance_slice(inst, i, j)
749 instanceobject *inst;
750 int i, j;
751{
752 object *func, *arg, *res;
753
754 func = instance_getattr(inst, "__getslice__");
755 if (func == NULL)
756 return NULL;
757 arg = mkvalue("(ii)", i, j);
758 if (arg == NULL) {
759 DECREF(func);
760 return NULL;
761 }
762 res = call_object(func, arg);
763 DECREF(func);
764 DECREF(arg);
765 return res;
766}
767
768static int
769instance_ass_item(inst, i, item)
770 instanceobject *inst;
771 int i;
772 object *item;
773{
774 object *func, *arg, *res;
775
776 if (item == NULL)
777 func = instance_getattr(inst, "__delitem__");
778 else
779 func = instance_getattr(inst, "__setitem__");
780 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000781 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782 if (item == NULL)
783 arg = mkvalue("i", i);
784 else
785 arg = mkvalue("(iO)", i, item);
786 if (arg == NULL) {
787 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000788 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000789 }
790 res = call_object(func, arg);
791 DECREF(func);
792 DECREF(arg);
793 if (res == NULL)
794 return -1;
795 DECREF(res);
796 return 0;
797}
798
799static int
800instance_ass_slice(inst, i, j, value)
801 instanceobject *inst;
802 int i, j;
803 object *value;
804{
805 object *func, *arg, *res;
806
807 if (value == NULL)
808 func = instance_getattr(inst, "__delslice__");
809 else
810 func = instance_getattr(inst, "__setslice__");
811 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000812 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000813 if (value == NULL)
814 arg = mkvalue("(ii)", i, j);
815 else
816 arg = mkvalue("(iiO)", i, j, value);
817 if (arg == NULL) {
818 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000819 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000820 }
821 res = call_object(func, arg);
822 DECREF(func);
823 DECREF(arg);
824 if (res == NULL)
825 return -1;
826 DECREF(res);
827 return 0;
828}
829
830static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000831 (inquiry)instance_length, /*sq_length*/
832 (binaryfunc)instance_concat, /*sq_concat*/
833 (intargfunc)instance_repeat, /*sq_repeat*/
834 (intargfunc)instance_item, /*sq_item*/
835 (intintargfunc)instance_slice, /*sq_slice*/
836 (intobjargproc)instance_ass_item, /*sq_ass_item*/
837 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000838};
839
840static object *
841generic_binary_op(self, other, methodname)
842 instanceobject *self;
843 object *other;
844 char *methodname;
845{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000846 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000847
848 if ((func = instance_getattr(self, methodname)) == NULL)
849 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000850 arg = mkvalue("O", other);
851 if (arg == NULL) {
852 DECREF(func);
853 return NULL;
854 }
855 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000856 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000857 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 return res;
859}
860
861static object *
862generic_unary_op(self, methodname)
863 instanceobject *self;
864 char *methodname;
865{
866 object *func, *res;
867
868 if ((func = instance_getattr(self, methodname)) == NULL)
869 return NULL;
870 res = call_object(func, (object *)NULL);
871 DECREF(func);
872 return res;
873}
874
875#define BINARY(funcname, methodname) \
876static object * funcname(self, other) instanceobject *self; object *other; { \
877 return generic_binary_op(self, other, methodname); \
878}
879
880#define UNARY(funcname, methodname) \
881static object *funcname(self) instanceobject *self; { \
882 return generic_unary_op(self, methodname); \
883}
884
885BINARY(instance_add, "__add__")
886BINARY(instance_sub, "__sub__")
887BINARY(instance_mul, "__mul__")
888BINARY(instance_div, "__div__")
889BINARY(instance_mod, "__mod__")
890BINARY(instance_divmod, "__divmod__")
Guido van Rossum04691fc1992-08-12 15:35:34 +0000891UNARY(instance_neg, "__neg__")
892UNARY(instance_pos, "__pos__")
893UNARY(instance_abs, "__abs__")
894
Guido van Rossume149fa21994-08-12 12:49:46 +0000895static object *
896instance_pow(self, other, modulus)
897 instanceobject *self;
898 object *other, *modulus;
899{
900 object *func, *arg, *res;
901
902 if ((func = instance_getattr(self, "__pow__")) == NULL)
903 return NULL;
904 if (modulus == None)
905 arg = mkvalue("O", other);
906 else
907 arg = mkvalue("(OO)", other, modulus);
908 if (arg == NULL) {
909 DECREF(func);
910 return NULL;
911 }
912 res = call_object(func, arg);
913 DECREF(func);
914 DECREF(arg);
915 return res;
916}
917
Guido van Rossum9bfef441993-03-29 10:43:31 +0000918static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919instance_nonzero(self)
920 instanceobject *self;
921{
922 object *func, *res;
923 long outcome;
924
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000925 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000927 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 err_clear();
929 /* Fall back to the default behavior:
930 all instances are nonzero */
931 return 1;
932 }
933 }
934 res = call_object(func, (object *)NULL);
935 DECREF(func);
936 if (res == NULL)
937 return -1;
938 if (!is_intobject(res)) {
939 DECREF(res);
940 err_setstr(TypeError, "__nonzero__ should return an int");
941 return -1;
942 }
943 outcome = getintvalue(res);
944 DECREF(res);
945 if (outcome < 0) {
946 err_setstr(ValueError, "__nonzero__ should return >= 0");
947 return -1;
948 }
949 return outcome > 0;
950}
951
952UNARY(instance_invert, "__invert__")
953BINARY(instance_lshift, "__lshift__")
954BINARY(instance_rshift, "__rshift__")
955BINARY(instance_and, "__and__")
956BINARY(instance_xor, "__xor__")
957BINARY(instance_or, "__or__")
958
Guido van Rossume6eefc21992-08-14 12:06:52 +0000959static int
960instance_coerce(pv, pw)
961 object **pv, **pw;
962{
963 object *v = *pv;
964 object *w = *pw;
965 object *func;
966 object *res;
967 int outcome;
968
969 if (!is_instanceobject(v))
970 return 1; /* XXX shouldn't be possible */
971 func = instance_getattr((instanceobject *)v, "__coerce__");
972 if (func == NULL) {
973 err_clear();
974 return 1;
975 }
976 res = call_object(func, w);
977 if (res == NULL)
978 return -1;
979 if (res == None) {
980 DECREF(res);
981 return 1;
982 }
983 outcome = getargs(res, "(OO)", &v, &w);
984 if (!outcome || v->ob_type != w->ob_type ||
985 v->ob_type->tp_as_number == NULL) {
986 DECREF(res);
987 err_setstr(TypeError, "bad __coerce__ result");
988 return -1;
989 }
990 INCREF(v);
991 INCREF(w);
992 DECREF(res);
993 *pv = v;
994 *pw = w;
995 return 0;
996}
997
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000998UNARY(instance_int, "__int__")
999UNARY(instance_long, "__long__")
1000UNARY(instance_float, "__float__")
1001UNARY(instance_oct, "__oct__")
1002UNARY(instance_hex, "__hex__")
1003
Guido van Rossum04691fc1992-08-12 15:35:34 +00001004static number_methods instance_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005 (binaryfunc)instance_add, /*nb_add*/
1006 (binaryfunc)instance_sub, /*nb_subtract*/
1007 (binaryfunc)instance_mul, /*nb_multiply*/
1008 (binaryfunc)instance_div, /*nb_divide*/
1009 (binaryfunc)instance_mod, /*nb_remainder*/
1010 (binaryfunc)instance_divmod, /*nb_divmod*/
Guido van Rossume149fa21994-08-12 12:49:46 +00001011 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012 (unaryfunc)instance_neg, /*nb_negative*/
1013 (unaryfunc)instance_pos, /*nb_positive*/
1014 (unaryfunc)instance_abs, /*nb_absolute*/
1015 (inquiry)instance_nonzero, /*nb_nonzero*/
1016 (unaryfunc)instance_invert, /*nb_invert*/
1017 (binaryfunc)instance_lshift, /*nb_lshift*/
1018 (binaryfunc)instance_rshift, /*nb_rshift*/
1019 (binaryfunc)instance_and, /*nb_and*/
1020 (binaryfunc)instance_xor, /*nb_xor*/
1021 (binaryfunc)instance_or, /*nb_or*/
1022 (coercion)instance_coerce, /*nb_coerce*/
1023 (unaryfunc)instance_int, /*nb_int*/
1024 (unaryfunc)instance_long, /*nb_long*/
1025 (unaryfunc)instance_float, /*nb_float*/
1026 (unaryfunc)instance_oct, /*nb_oct*/
1027 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001028};
1029
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001030typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001031 OB_HEAD_INIT(&Typetype)
1032 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001033 "instance",
1034 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001036 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001037 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +00001038 (object * (*) FPROTO((object *, char *)))
Guido van Rossumb6775db1994-08-01 11:34:53 +00001039 (getattrfunc)instance_getattr, /*tp_getattr*/
1040 (setattrfunc)instance_setattr, /*tp_setattr*/
1041 (cmpfunc)instance_compare, /*tp_compare*/
1042 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001043 &instance_as_number, /*tp_as_number*/
1044 &instance_as_sequence, /*tp_as_sequence*/
1045 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001046 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047};
1048
1049
Guido van Rossum81daa321993-05-20 14:24:46 +00001050/* Instance method objects are used for two purposes:
1051 (a) as bound instance methods (returned by instancename.methodname)
1052 (b) as unbound methods (returned by ClassName.methodname)
1053 In case (b), im_self is NULL
1054*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001055
1056typedef struct {
1057 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001058 object *im_func; /* The function implementing the method */
1059 object *im_self; /* The instance it is bound to, or NULL */
1060 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001061} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001062
1063object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001064newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065 object *func;
1066 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001067 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068{
Guido van Rossume8122f11991-05-05 20:03:07 +00001069 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001070 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001071 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001072 return NULL;
1073 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001074 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1075 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001076 return NULL;
1077 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001078 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001079 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001080 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001081 INCREF(class);
1082 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001083 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001084}
1085
1086object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001087instancemethodgetfunc(im)
1088 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001089{
Guido van Rossume8122f11991-05-05 20:03:07 +00001090 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001091 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001092 return NULL;
1093 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001094 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001095}
1096
1097object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001098instancemethodgetself(im)
1099 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001100{
Guido van Rossume8122f11991-05-05 20:03:07 +00001101 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001102 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001103 return NULL;
1104 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001105 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001106}
1107
Guido van Rossum81daa321993-05-20 14:24:46 +00001108object *
1109instancemethodgetclass(im)
1110 register object *im;
1111{
1112 if (!is_instancemethodobject(im)) {
1113 err_badcall();
1114 return NULL;
1115 }
1116 return ((instancemethodobject *)im)->im_class;
1117}
1118
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001119/* Class method methods */
1120
Guido van Rossume8122f11991-05-05 20:03:07 +00001121#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001122
Guido van Rossume8122f11991-05-05 20:03:07 +00001123static struct memberlist instancemethod_memberlist[] = {
1124 {"im_func", T_OBJECT, OFF(im_func)},
1125 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001126 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001127 {NULL} /* Sentinel */
1128};
1129
1130static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001131instancemethod_getattr(im, name)
1132 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001133 char *name;
1134{
Guido van Rossume8122f11991-05-05 20:03:07 +00001135 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001136}
1137
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001139instancemethod_dealloc(im)
1140 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141{
Guido van Rossume8122f11991-05-05 20:03:07 +00001142 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001143 XDECREF(im->im_self);
1144 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001145 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001146}
1147
Guido van Rossumebc8c511992-09-03 20:39:51 +00001148static int
1149instancemethod_compare(a, b)
1150 instancemethodobject *a, *b;
1151{
1152 int cmp = cmpobject(a->im_self, b->im_self);
1153 if (cmp == 0)
1154 cmp = cmpobject(a->im_func, b->im_func);
1155 return cmp;
1156}
1157
Guido van Rossum25831651993-05-19 14:50:45 +00001158static object *
1159instancemethod_repr(a)
1160 instancemethodobject *a;
1161{
1162 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001163 instanceobject *self = (instanceobject *)(a->im_self);
1164 funcobject *func = (funcobject *)(a->im_func);
1165 classobject *class = (classobject *)(a->im_class);
1166 object *fclassname, *iclassname, *funcname;
1167 char *fcname, *icname, *fname;
1168 fclassname = class->cl_name;
1169 funcname = func->func_name;
1170 if (fclassname != NULL && is_stringobject(fclassname))
1171 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001172 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001173 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001174 if (funcname != NULL && is_stringobject(funcname))
1175 fname = getstringvalue(funcname);
1176 else
1177 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001178 if (self == NULL)
1179 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1180 else {
1181 iclassname = self->in_class->cl_name;
1182 if (iclassname != NULL && is_stringobject(iclassname))
1183 icname = getstringvalue(iclassname);
1184 else
1185 icname = "?";
1186 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1187 fcname, fname, icname, (long)self);
1188 }
Guido van Rossum25831651993-05-19 14:50:45 +00001189 return newstringobject(buf);
1190}
1191
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192static long
1193instancemethod_hash(a)
1194 instancemethodobject *a;
1195{
1196 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001197 if (a->im_self == NULL)
1198 x = hashobject(None);
1199 else
1200 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001201 if (x == -1)
1202 return -1;
1203 y = hashobject(a->im_func);
1204 if (y == -1)
1205 return -1;
1206 return x ^ y;
1207}
1208
Guido van Rossume8122f11991-05-05 20:03:07 +00001209typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001210 OB_HEAD_INIT(&Typetype)
1211 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001212 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001213 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001216 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219 (cmpfunc)instancemethod_compare, /*tp_compare*/
1220 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221 0, /*tp_as_number*/
1222 0, /*tp_as_sequence*/
1223 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225};