blob: b8b72e9fd94ecdda15a9341e4c2ba6729b15e45a [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) {
462 object *args = mkvalue("(sO)", name, v);
463 if (args != NULL) {
464 object *res = call_object(inst->in_setattr, args);
465 DECREF(args);
466 if (res != NULL) {
467 DECREF(res);
468 return 0;
469 }
470 }
471 return -1;
472 }
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000473 if (name[0] == '_' && name[1] == '_') {
474 int n = strlen(name);
475 if (name[n-1] == '_' && name[n-2] == '_') {
476 err_setstr(TypeError, "read-only special attribute");
477 return -1;
478 }
479 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000480 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000481 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000482 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000483 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000484 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000485 if (rv < 0)
486 err_setstr(AttributeError,
487 "delete non-existing instance attribute");
488 return rv;
489 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000491 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492}
493
Guido van Rossum9bfef441993-03-29 10:43:31 +0000494static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000495instance_repr(inst)
496 instanceobject *inst;
497{
498 object *func;
499 object *res;
500
501 func = instance_getattr(inst, "__repr__");
502 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000503 char buf[140];
504 object *classname = inst->in_class->cl_name;
505 char *cname;
506 if (classname != NULL && is_stringobject(classname))
507 cname = getstringvalue(classname);
508 else
509 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000510 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000511 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000512 return newstringobject(buf);
513 }
514 res = call_object(func, (object *)NULL);
515 DECREF(func);
516 return res;
517}
518
Guido van Rossum9bfef441993-03-29 10:43:31 +0000519static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000520instance_compare(inst, other)
521 instanceobject *inst, *other;
522{
523 object *func;
524 object *res;
525 int outcome;
526
527 func = instance_getattr(inst, "__cmp__");
528 if (func == NULL) {
529 err_clear();
530 if (inst < other)
531 return -1;
532 if (inst > other)
533 return 1;
534 return 0;
535 }
536 res = call_object(func, (object *)other);
537 DECREF(func);
538 if (res == NULL) {
539 err_clear(); /* XXX Should report the error, bot how...??? */
540 return 0;
541 }
542 if (is_intobject(res))
543 outcome = getintvalue(res);
544 else
545 outcome = 0; /* XXX Should report the error, bot how...??? */
546 DECREF(res);
547 return outcome;
548}
549
Guido van Rossum9bfef441993-03-29 10:43:31 +0000550static long
551instance_hash(inst)
552 instanceobject *inst;
553{
554 object *func;
555 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000556 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000557
558 func = instance_getattr(inst, "__hash__");
559 if (func == NULL) {
560 /* If there is no __cmp__ method, we hash on the address.
561 If a __cmp__ method exists, there must be a __hash__. */
562 err_clear();
563 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000564 if (func == NULL) {
565 err_clear();
566 outcome = (long)inst;
567 if (outcome == -1)
568 outcome = -2;
569 return outcome;
570 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000571 err_setstr(TypeError, "unhashable instance");
572 return -1;
573 }
574 res = call_object(func, (object *)NULL);
575 DECREF(func);
576 if (res == NULL)
577 return -1;
578 if (is_intobject(res)) {
579 outcome = getintvalue(res);
580 if (outcome == -1)
581 outcome = -2;
582 }
583 else {
584 err_setstr(TypeError, "__hash__() should return an int");
585 outcome = -1;
586 }
587 DECREF(res);
588 return outcome;
589}
590
591static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000592instance_length(inst)
593 instanceobject *inst;
594{
595 object *func;
596 object *res;
597 int outcome;
598
599 func = instance_getattr(inst, "__len__");
600 if (func == NULL)
601 return -1;
602 res = call_object(func, (object *)NULL);
603 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000604 if (res == NULL)
605 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000606 if (is_intobject(res)) {
607 outcome = getintvalue(res);
608 if (outcome < 0)
609 err_setstr(ValueError, "__len__() should return >= 0");
610 }
611 else {
612 err_setstr(TypeError, "__len__() should return an int");
613 outcome = -1;
614 }
615 DECREF(res);
616 return outcome;
617}
618
Guido van Rossum9bfef441993-03-29 10:43:31 +0000619static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000620instance_subscript(inst, key)
621 instanceobject *inst;
622 object *key;
623{
624 object *func;
625 object *arg;
626 object *res;
627
628 func = instance_getattr(inst, "__getitem__");
629 if (func == NULL)
630 return NULL;
631 arg = mkvalue("(O)", key);
632 if (arg == NULL) {
633 DECREF(func);
634 return NULL;
635 }
636 res = call_object(func, arg);
637 DECREF(func);
638 DECREF(arg);
639 return res;
640}
641
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000643instance_ass_subscript(inst, key, value)
644 instanceobject*inst;
645 object *key;
646 object *value;
647{
648 object *func;
649 object *arg;
650 object *res;
651
652 if (value == NULL)
653 func = instance_getattr(inst, "__delitem__");
654 else
655 func = instance_getattr(inst, "__setitem__");
656 if (func == NULL)
657 return -1;
658 if (value == NULL)
659 arg = mkvalue("(O)", key);
660 else
661 arg = mkvalue("(OO)", key, value);
662 if (arg == NULL) {
663 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000664 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000665 }
666 res = call_object(func, arg);
667 DECREF(func);
668 DECREF(arg);
669 if (res == NULL)
670 return -1;
671 DECREF(res);
672 return 0;
673}
674
Guido van Rossum9bfef441993-03-29 10:43:31 +0000675static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000676 (inquiry)instance_length, /*mp_length*/
677 (binaryfunc)instance_subscript, /*mp_subscript*/
678 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000679};
680
681static object *
682instance_concat(inst, other)
683 instanceobject *inst, *other;
684{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000685 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000686
687 func = instance_getattr(inst, "__add__");
688 if (func == NULL)
689 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000690 arg = mkvalue("(O)", other);
691 if (arg == NULL) {
692 DECREF(func);
693 return NULL;
694 }
695 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000696 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000697 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000698 return res;
699}
700
701static object *
702instance_repeat(inst, count)
703 instanceobject *inst;
704 int count;
705{
706 object *func, *arg, *res;
707
708 func = instance_getattr(inst, "__mul__");
709 if (func == NULL)
710 return NULL;
711 arg = newintobject((long)count);
712 if (arg == NULL) {
713 DECREF(func);
714 return NULL;
715 }
716 res = call_object(func, arg);
717 DECREF(func);
718 DECREF(arg);
719 return res;
720}
721
722static object *
723instance_item(inst, i)
724 instanceobject *inst;
725 int i;
726{
727 object *func, *arg, *res;
728
729 func = instance_getattr(inst, "__getitem__");
730 if (func == NULL)
731 return NULL;
732 arg = newintobject((long)i);
733 if (arg == NULL) {
734 DECREF(func);
735 return NULL;
736 }
737 res = call_object(func, arg);
738 DECREF(func);
739 DECREF(arg);
740 return res;
741}
742
743static object *
744instance_slice(inst, i, j)
745 instanceobject *inst;
746 int i, j;
747{
748 object *func, *arg, *res;
749
750 func = instance_getattr(inst, "__getslice__");
751 if (func == NULL)
752 return NULL;
753 arg = mkvalue("(ii)", i, j);
754 if (arg == NULL) {
755 DECREF(func);
756 return NULL;
757 }
758 res = call_object(func, arg);
759 DECREF(func);
760 DECREF(arg);
761 return res;
762}
763
764static int
765instance_ass_item(inst, i, item)
766 instanceobject *inst;
767 int i;
768 object *item;
769{
770 object *func, *arg, *res;
771
772 if (item == NULL)
773 func = instance_getattr(inst, "__delitem__");
774 else
775 func = instance_getattr(inst, "__setitem__");
776 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000777 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000778 if (item == NULL)
779 arg = mkvalue("i", i);
780 else
781 arg = mkvalue("(iO)", i, item);
782 if (arg == NULL) {
783 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000784 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785 }
786 res = call_object(func, arg);
787 DECREF(func);
788 DECREF(arg);
789 if (res == NULL)
790 return -1;
791 DECREF(res);
792 return 0;
793}
794
795static int
796instance_ass_slice(inst, i, j, value)
797 instanceobject *inst;
798 int i, j;
799 object *value;
800{
801 object *func, *arg, *res;
802
803 if (value == NULL)
804 func = instance_getattr(inst, "__delslice__");
805 else
806 func = instance_getattr(inst, "__setslice__");
807 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000808 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000809 if (value == NULL)
810 arg = mkvalue("(ii)", i, j);
811 else
812 arg = mkvalue("(iiO)", i, j, value);
813 if (arg == NULL) {
814 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000815 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000816 }
817 res = call_object(func, arg);
818 DECREF(func);
819 DECREF(arg);
820 if (res == NULL)
821 return -1;
822 DECREF(res);
823 return 0;
824}
825
826static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000827 (inquiry)instance_length, /*sq_length*/
828 (binaryfunc)instance_concat, /*sq_concat*/
829 (intargfunc)instance_repeat, /*sq_repeat*/
830 (intargfunc)instance_item, /*sq_item*/
831 (intintargfunc)instance_slice, /*sq_slice*/
832 (intobjargproc)instance_ass_item, /*sq_ass_item*/
833 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000834};
835
836static object *
837generic_binary_op(self, other, methodname)
838 instanceobject *self;
839 object *other;
840 char *methodname;
841{
Guido van Rossume6eefc21992-08-14 12:06:52 +0000842 object *func, *arg, *res;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000843
844 if ((func = instance_getattr(self, methodname)) == NULL)
845 return NULL;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000846 arg = mkvalue("O", other);
847 if (arg == NULL) {
848 DECREF(func);
849 return NULL;
850 }
851 res = call_object(func, arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000852 DECREF(func);
Guido van Rossume6eefc21992-08-14 12:06:52 +0000853 DECREF(arg);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000854 return res;
855}
856
857static object *
858generic_unary_op(self, methodname)
859 instanceobject *self;
860 char *methodname;
861{
862 object *func, *res;
863
864 if ((func = instance_getattr(self, methodname)) == NULL)
865 return NULL;
866 res = call_object(func, (object *)NULL);
867 DECREF(func);
868 return res;
869}
870
871#define BINARY(funcname, methodname) \
872static object * funcname(self, other) instanceobject *self; object *other; { \
873 return generic_binary_op(self, other, methodname); \
874}
875
876#define UNARY(funcname, methodname) \
877static object *funcname(self) instanceobject *self; { \
878 return generic_unary_op(self, methodname); \
879}
880
881BINARY(instance_add, "__add__")
882BINARY(instance_sub, "__sub__")
883BINARY(instance_mul, "__mul__")
884BINARY(instance_div, "__div__")
885BINARY(instance_mod, "__mod__")
886BINARY(instance_divmod, "__divmod__")
Guido van Rossum04691fc1992-08-12 15:35:34 +0000887UNARY(instance_neg, "__neg__")
888UNARY(instance_pos, "__pos__")
889UNARY(instance_abs, "__abs__")
890
Guido van Rossume149fa21994-08-12 12:49:46 +0000891static object *
892instance_pow(self, other, modulus)
893 instanceobject *self;
894 object *other, *modulus;
895{
896 object *func, *arg, *res;
897
898 if ((func = instance_getattr(self, "__pow__")) == NULL)
899 return NULL;
900 if (modulus == None)
901 arg = mkvalue("O", other);
902 else
903 arg = mkvalue("(OO)", other, modulus);
904 if (arg == NULL) {
905 DECREF(func);
906 return NULL;
907 }
908 res = call_object(func, arg);
909 DECREF(func);
910 DECREF(arg);
911 return res;
912}
913
Guido van Rossum9bfef441993-03-29 10:43:31 +0000914static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915instance_nonzero(self)
916 instanceobject *self;
917{
918 object *func, *res;
919 long outcome;
920
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000921 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000923 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 err_clear();
925 /* Fall back to the default behavior:
926 all instances are nonzero */
927 return 1;
928 }
929 }
930 res = call_object(func, (object *)NULL);
931 DECREF(func);
932 if (res == NULL)
933 return -1;
934 if (!is_intobject(res)) {
935 DECREF(res);
936 err_setstr(TypeError, "__nonzero__ should return an int");
937 return -1;
938 }
939 outcome = getintvalue(res);
940 DECREF(res);
941 if (outcome < 0) {
942 err_setstr(ValueError, "__nonzero__ should return >= 0");
943 return -1;
944 }
945 return outcome > 0;
946}
947
948UNARY(instance_invert, "__invert__")
949BINARY(instance_lshift, "__lshift__")
950BINARY(instance_rshift, "__rshift__")
951BINARY(instance_and, "__and__")
952BINARY(instance_xor, "__xor__")
953BINARY(instance_or, "__or__")
954
Guido van Rossume6eefc21992-08-14 12:06:52 +0000955static int
956instance_coerce(pv, pw)
957 object **pv, **pw;
958{
959 object *v = *pv;
960 object *w = *pw;
961 object *func;
962 object *res;
963 int outcome;
964
965 if (!is_instanceobject(v))
966 return 1; /* XXX shouldn't be possible */
967 func = instance_getattr((instanceobject *)v, "__coerce__");
968 if (func == NULL) {
969 err_clear();
970 return 1;
971 }
972 res = call_object(func, w);
973 if (res == NULL)
974 return -1;
975 if (res == None) {
976 DECREF(res);
977 return 1;
978 }
979 outcome = getargs(res, "(OO)", &v, &w);
980 if (!outcome || v->ob_type != w->ob_type ||
981 v->ob_type->tp_as_number == NULL) {
982 DECREF(res);
983 err_setstr(TypeError, "bad __coerce__ result");
984 return -1;
985 }
986 INCREF(v);
987 INCREF(w);
988 DECREF(res);
989 *pv = v;
990 *pw = w;
991 return 0;
992}
993
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000994UNARY(instance_int, "__int__")
995UNARY(instance_long, "__long__")
996UNARY(instance_float, "__float__")
997UNARY(instance_oct, "__oct__")
998UNARY(instance_hex, "__hex__")
999
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000static number_methods instance_as_number = {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001 (binaryfunc)instance_add, /*nb_add*/
1002 (binaryfunc)instance_sub, /*nb_subtract*/
1003 (binaryfunc)instance_mul, /*nb_multiply*/
1004 (binaryfunc)instance_div, /*nb_divide*/
1005 (binaryfunc)instance_mod, /*nb_remainder*/
1006 (binaryfunc)instance_divmod, /*nb_divmod*/
Guido van Rossume149fa21994-08-12 12:49:46 +00001007 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008 (unaryfunc)instance_neg, /*nb_negative*/
1009 (unaryfunc)instance_pos, /*nb_positive*/
1010 (unaryfunc)instance_abs, /*nb_absolute*/
1011 (inquiry)instance_nonzero, /*nb_nonzero*/
1012 (unaryfunc)instance_invert, /*nb_invert*/
1013 (binaryfunc)instance_lshift, /*nb_lshift*/
1014 (binaryfunc)instance_rshift, /*nb_rshift*/
1015 (binaryfunc)instance_and, /*nb_and*/
1016 (binaryfunc)instance_xor, /*nb_xor*/
1017 (binaryfunc)instance_or, /*nb_or*/
1018 (coercion)instance_coerce, /*nb_coerce*/
1019 (unaryfunc)instance_int, /*nb_int*/
1020 (unaryfunc)instance_long, /*nb_long*/
1021 (unaryfunc)instance_float, /*nb_float*/
1022 (unaryfunc)instance_oct, /*nb_oct*/
1023 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024};
1025
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001026typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001027 OB_HEAD_INIT(&Typetype)
1028 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001029 "instance",
1030 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001031 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001032 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001033 0, /*tp_print*/
Guido van Rossum25831651993-05-19 14:50:45 +00001034 (object * (*) FPROTO((object *, char *)))
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035 (getattrfunc)instance_getattr, /*tp_getattr*/
1036 (setattrfunc)instance_setattr, /*tp_setattr*/
1037 (cmpfunc)instance_compare, /*tp_compare*/
1038 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001039 &instance_as_number, /*tp_as_number*/
1040 &instance_as_sequence, /*tp_as_sequence*/
1041 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001042 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001043};
1044
1045
Guido van Rossum81daa321993-05-20 14:24:46 +00001046/* Instance method objects are used for two purposes:
1047 (a) as bound instance methods (returned by instancename.methodname)
1048 (b) as unbound methods (returned by ClassName.methodname)
1049 In case (b), im_self is NULL
1050*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001051
1052typedef struct {
1053 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001054 object *im_func; /* The function implementing the method */
1055 object *im_self; /* The instance it is bound to, or NULL */
1056 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001057} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001058
1059object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001060newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061 object *func;
1062 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001063 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001064{
Guido van Rossume8122f11991-05-05 20:03:07 +00001065 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001066 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001067 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068 return NULL;
1069 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001070 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1071 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001072 return NULL;
1073 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001074 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001075 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001076 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001077 INCREF(class);
1078 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001079 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080}
1081
1082object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001083instancemethodgetfunc(im)
1084 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085{
Guido van Rossume8122f11991-05-05 20:03:07 +00001086 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001087 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001088 return NULL;
1089 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001090 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001091}
1092
1093object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001094instancemethodgetself(im)
1095 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001096{
Guido van Rossume8122f11991-05-05 20:03:07 +00001097 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001098 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001099 return NULL;
1100 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001101 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001102}
1103
Guido van Rossum81daa321993-05-20 14:24:46 +00001104object *
1105instancemethodgetclass(im)
1106 register object *im;
1107{
1108 if (!is_instancemethodobject(im)) {
1109 err_badcall();
1110 return NULL;
1111 }
1112 return ((instancemethodobject *)im)->im_class;
1113}
1114
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001115/* Class method methods */
1116
Guido van Rossume8122f11991-05-05 20:03:07 +00001117#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001118
Guido van Rossume8122f11991-05-05 20:03:07 +00001119static struct memberlist instancemethod_memberlist[] = {
1120 {"im_func", T_OBJECT, OFF(im_func)},
1121 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001122 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001123 {NULL} /* Sentinel */
1124};
1125
1126static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001127instancemethod_getattr(im, name)
1128 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 char *name;
1130{
Guido van Rossume8122f11991-05-05 20:03:07 +00001131 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001132}
1133
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001134static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001135instancemethod_dealloc(im)
1136 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137{
Guido van Rossume8122f11991-05-05 20:03:07 +00001138 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001139 XDECREF(im->im_self);
1140 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001141 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001142}
1143
Guido van Rossumebc8c511992-09-03 20:39:51 +00001144static int
1145instancemethod_compare(a, b)
1146 instancemethodobject *a, *b;
1147{
1148 int cmp = cmpobject(a->im_self, b->im_self);
1149 if (cmp == 0)
1150 cmp = cmpobject(a->im_func, b->im_func);
1151 return cmp;
1152}
1153
Guido van Rossum25831651993-05-19 14:50:45 +00001154static object *
1155instancemethod_repr(a)
1156 instancemethodobject *a;
1157{
1158 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001159 instanceobject *self = (instanceobject *)(a->im_self);
1160 funcobject *func = (funcobject *)(a->im_func);
1161 classobject *class = (classobject *)(a->im_class);
1162 object *fclassname, *iclassname, *funcname;
1163 char *fcname, *icname, *fname;
1164 fclassname = class->cl_name;
1165 funcname = func->func_name;
1166 if (fclassname != NULL && is_stringobject(fclassname))
1167 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001168 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001169 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001170 if (funcname != NULL && is_stringobject(funcname))
1171 fname = getstringvalue(funcname);
1172 else
1173 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001174 if (self == NULL)
1175 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1176 else {
1177 iclassname = self->in_class->cl_name;
1178 if (iclassname != NULL && is_stringobject(iclassname))
1179 icname = getstringvalue(iclassname);
1180 else
1181 icname = "?";
1182 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1183 fcname, fname, icname, (long)self);
1184 }
Guido van Rossum25831651993-05-19 14:50:45 +00001185 return newstringobject(buf);
1186}
1187
Guido van Rossum9bfef441993-03-29 10:43:31 +00001188static long
1189instancemethod_hash(a)
1190 instancemethodobject *a;
1191{
1192 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001193 if (a->im_self == NULL)
1194 x = hashobject(None);
1195 else
1196 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001197 if (x == -1)
1198 return -1;
1199 y = hashobject(a->im_func);
1200 if (y == -1)
1201 return -1;
1202 return x ^ y;
1203}
1204
Guido van Rossume8122f11991-05-05 20:03:07 +00001205typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001206 OB_HEAD_INIT(&Typetype)
1207 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001208 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001209 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001210 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001211 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001212 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215 (cmpfunc)instancemethod_compare, /*tp_compare*/
1216 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217 0, /*tp_as_number*/
1218 0, /*tp_as_sequence*/
1219 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001220 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221};