blob: 923ad45ab312a70c80e3028986dab97640f1636f [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 Rossum3f5da241990-12-20 15:06:42 +000028#include "structmember.h"
Guido van Rossum04691fc1992-08-12 15:35:34 +000029
Guido van Rossum52ca98a1994-09-05 07:32:29 +000030/* Forward */
31static object *class_lookup PROTO((classobject *, char *, classobject **));
32static object *instance_getattr1 PROTO((instanceobject *, char *));
33
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034object *
Guido van Rossum81daa321993-05-20 14:24:46 +000035newclassobject(bases, dict, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 object *bases; /* NULL or tuple of classobjects! */
Guido van Rossum81daa321993-05-20 14:24:46 +000037 object *dict;
Guido van Rossum94308391991-10-20 20:11:48 +000038 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
Guido van Rossum81daa321993-05-20 14:24:46 +000040 int pos;
41 object *key, *value;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000042 classobject *op, *dummy;
Guido van Rossume2966a61991-12-10 13:53:23 +000043 if (bases == NULL) {
44 bases = newtupleobject(0);
45 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000046 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000047 }
48 else
49 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000051 if (op == NULL) {
52 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000054 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000056 INCREF(dict);
57 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000058 XINCREF(name);
59 op->cl_name = name;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000060 op->cl_getattr = class_lookup(op, "__getattr__", &dummy);
61 op->cl_setattr = class_lookup(op, "__setattr__", &dummy);
62 op->cl_delattr = class_lookup(op, "__delattr__", &dummy);
63 XINCREF(op->cl_getattr);
64 XINCREF(op->cl_setattr);
65 XINCREF(op->cl_delattr);
Guido van Rossum81daa321993-05-20 14:24:46 +000066 pos = 0;
67 while (mappinggetnext(dict, &pos, &key, &value)) {
68 if (is_accessobject(value))
69 setaccessowner(value, (object *)op);
70 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 return (object *) op;
72}
73
74/* Class methods */
75
76static void
77class_dealloc(op)
78 classobject *op;
79{
Guido van Rossume2966a61991-12-10 13:53:23 +000080 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000081 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000082 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 free((ANY *)op);
84}
85
86static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000087class_lookup(cp, name, pclass)
88 classobject *cp;
89 char *name;
90 classobject **pclass;
91{
92 int i, n;
93 object *value = dictlookup(cp->cl_dict, name);
94 if (value != NULL) {
95 *pclass = cp;
96 return value;
97 }
98 n = gettuplesize(cp->cl_bases);
99 for (i = 0; i < n; i++) {
100 object *v = class_lookup((classobject *)
101 gettupleitem(cp->cl_bases, i), name, pclass);
102 if (v != NULL)
103 return v;
104 }
105 return NULL;
106}
107
108static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109class_getattr(op, name)
110 register classobject *op;
111 register char *name;
112{
113 register object *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114 classobject *class;
Guido van Rossume7737541994-09-05 07:31:41 +0000115 if (strcmp(name, "__dict__") == 0) {
116 INCREF(op->cl_dict);
117 return op->cl_dict;
118 }
119 if (strcmp(name, "__bases__") == 0) {
120 INCREF(op->cl_bases);
121 return op->cl_bases;
122 }
123 if (strcmp(name, "__name__") == 0) {
124 if (op->cl_name == NULL)
125 v = None;
126 else
127 v = op->cl_name;
128 INCREF(v);
129 return v;
Guido van Rossum94308391991-10-20 20:11:48 +0000130 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000131 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000132 if (v == NULL) {
133 err_setstr(AttributeError, name);
134 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000136 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000137 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000138 if (v == NULL)
139 return NULL;
140 }
141 else
142 INCREF(v);
143 if (is_funcobject(v)) {
144 object *w = newinstancemethodobject(v, (object *)NULL,
145 (object *)class);
146 DECREF(v);
147 v = w;
148 }
149 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150}
151
Guido van Rossum94308391991-10-20 20:11:48 +0000152static int
153class_setattr(op, name, v)
154 classobject *op;
155 char *name;
156 object *v;
157{
Guido van Rossum25831651993-05-19 14:50:45 +0000158 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000159 if (name[0] == '_' && name[1] == '_') {
160 int n = strlen(name);
161 if (name[n-1] == '_' && name[n-2] == '_') {
162 err_setstr(TypeError, "read-only special attribute");
163 return -1;
164 }
165 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000166 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000167 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000168 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000169 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000170 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000171 if (rv < 0)
172 err_setstr(AttributeError,
173 "delete non-existing class attribute");
174 return rv;
175 }
Guido van Rossum94308391991-10-20 20:11:48 +0000176 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000177 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000178}
179
Guido van Rossum25831651993-05-19 14:50:45 +0000180static object *
181class_repr(op)
182 classobject *op;
183{
184 char buf[140];
185 char *name;
186 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
187 name = "?";
188 else
189 name = getstringvalue(op->cl_name);
190 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
191 return newstringobject(buf);
192}
193
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194typeobject Classtype = {
195 OB_HEAD_INIT(&Typetype)
196 0,
197 "class",
198 sizeof(classobject),
199 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000200 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202 (getattrfunc)class_getattr, /*tp_getattr*/
203 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 0, /*tp_as_number*/
207 0, /*tp_as_sequence*/
208 0, /*tp_as_mapping*/
209};
210
Guido van Rossum81daa321993-05-20 14:24:46 +0000211int
212issubclass(class, base)
213 object *class;
214 object *base;
215{
216 int i, n;
217 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000218 if (class == base)
219 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000220 if (class == NULL || !is_classobject(class))
221 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000222 cp = (classobject *)class;
223 n = gettuplesize(cp->cl_bases);
224 for (i = 0; i < n; i++) {
225 if (issubclass(gettupleitem(cp->cl_bases, i), base))
226 return 1;
227 }
228 return 0;
229}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230
Guido van Rossum81daa321993-05-20 14:24:46 +0000231
232/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233
Guido van Rossum81daa321993-05-20 14:24:46 +0000234static int
235addaccess(class, inst)
236 classobject *class;
237 instanceobject *inst;
238{
239 int i, n, pos, ret;
240 object *key, *value, *ac;
241
242 n = gettuplesize(class->cl_bases);
243 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000244 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000245 return -1;
246 }
247
248 pos = 0;
249 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
Guido van Rossumb3f72581993-05-21 19:56:10 +0000250 object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000251 if (!is_accessobject(value))
252 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000253 if (hasaccessvalue(value))
254 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000255 ac = dict2lookup(inst->in_dict, key);
256 if (ac != NULL && is_accessobject(ac)) {
257 err_setval(ConflictError, key);
258 return -1;
259 }
260 ac = cloneaccessobject(value);
261 if (ac == NULL)
262 return -1;
263 ret = dict2insert(inst->in_dict, key, ac);
264 DECREF(ac);
265 if (ret != 0)
266 return -1;
267 }
268 return 0;
269}
270
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271object *
Guido van Rossum25831651993-05-19 14:50:45 +0000272newinstanceobject(class, arg)
273 object *class;
274 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275{
Guido van Rossume8122f11991-05-05 20:03:07 +0000276 register instanceobject *inst;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000277 object *v;
Guido van Rossum25831651993-05-19 14:50:45 +0000278 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000280 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 return NULL;
282 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000283 inst = NEWOBJ(instanceobject, &Instancetype);
284 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 return NULL;
286 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000287 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000288 inst->in_dict = newdictobject();
289 if (inst->in_dict == NULL ||
290 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000291 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 return NULL;
293 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000294 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000295 if (init == NULL) {
296 err_clear();
297 if (arg != NULL && !(is_tupleobject(arg) &&
298 gettuplesize(arg) == 0)) {
299 err_setstr(TypeError,
300 "this classobject() takes no arguments");
301 DECREF(inst);
302 inst = NULL;
303 }
304 }
305 else {
306 object *res = call_object(init, arg);
307 DECREF(init);
308 if (res == NULL) {
309 DECREF(inst);
310 inst = NULL;
311 }
312 else {
313 if (res != None) {
314 err_setstr(TypeError,
315 "__init__() should return None");
316 DECREF(inst);
317 inst = NULL;
318 }
319 DECREF(res);
320 }
321 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000322 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323}
324
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000325/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326
327static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000328instance_dealloc(inst)
329 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330{
Guido van Rossum25831651993-05-19 14:50:45 +0000331 object *error_type, *error_value;
332 object *del;
333 /* Call the __del__ method if it exists. First temporarily
334 revive the object and save the current exception, if any. */
335 INCREF(inst);
336 err_get(&error_type, &error_value);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000337 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000338 object *args = newtupleobject(0);
339 object *res = args;
340 if (res != NULL)
341 res = call_object(del, args);
342 XDECREF(args);
343 DECREF(del);
344 XDECREF(res);
345 /* XXX If __del__ raised an exception, it is ignored! */
346 }
347 /* Restore the saved exception and undo the temporary revival */
348 err_setval(error_type, error_value);
349 /* Can't use DECREF here, it would cause a recursive call */
350 if (--inst->ob_refcnt > 0)
351 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000352 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000353 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000354 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355}
356
Guido van Rossume7737541994-09-05 07:31:41 +0000357static object *
358instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000359 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 register char *name;
361{
Guido van Rossum94308391991-10-20 20:11:48 +0000362 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000363 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000364 if (name[0] == '_' && name[1] == '_') {
365 if (strcmp(name, "__dict__") == 0) {
366 INCREF(inst->in_dict);
367 return inst->in_dict;
368 }
369 if (strcmp(name, "__class__") == 0) {
370 INCREF(inst->in_class);
371 return (object *)inst->in_class;
372 }
Guido van Rossum94308391991-10-20 20:11:48 +0000373 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000374 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000375 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000376 if (v == NULL) {
377 v = class_lookup(inst->in_class, name, &class);
378 if (v == NULL) {
379 err_setstr(AttributeError, name);
380 return NULL;
381 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000383 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000384 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000385 if (v == NULL)
386 return NULL;
387 }
388 else
389 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000390 if (class != NULL) {
391 if (is_funcobject(v)) {
392 object *w = newinstancemethodobject(v, (object *)inst,
393 (object *)class);
394 DECREF(v);
395 v = w;
396 }
397 else if (is_instancemethodobject(v)) {
398 object *im_class = instancemethodgetclass(v);
399 /* Only if classes are compatible */
400 if (issubclass((object *)class, im_class)) {
401 object *im_func = instancemethodgetfunc(v);
402 object *w = newinstancemethodobject(im_func,
403 (object *)inst, im_class);
404 DECREF(v);
405 v = w;
406 }
407 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000408 }
409 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410}
411
Guido van Rossume7737541994-09-05 07:31:41 +0000412static object *
413instance_getattr(inst, name)
414 register instanceobject *inst;
415 register char *name;
416{
417 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000418 res = instance_getattr1(inst, name);
419 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
420 object *args;
421#if 0
422 if (name[0] == '_' && name[1] == '_') {
423 int n = strlen(name);
424 if (name[n-1] == '_' && name[n-2] == '_') {
425 /* Don't mess with system attributes */
426 return NULL;
427 }
Guido van Rossume7737541994-09-05 07:31:41 +0000428 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000429#endif
430 args = mkvalue("(Os)", inst, name);
431 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000432 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000433 res = call_object(func, args);
434 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000435 }
436 return res;
437}
438
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439static int
Guido van Rossume7737541994-09-05 07:31:41 +0000440instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000441 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 char *name;
443 object *v;
444{
Guido van Rossum25831651993-05-19 14:50:45 +0000445 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000446 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000447 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000448 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000449 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000450 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000451 if (rv < 0)
452 err_setstr(AttributeError,
453 "delete non-existing instance attribute");
454 return rv;
455 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000457 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458}
459
Guido van Rossume7737541994-09-05 07:31:41 +0000460static int
461instance_setattr(inst, name, v)
462 instanceobject *inst;
463 char *name;
464 object *v;
465{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000466 object *func, *args, *res;
467 if (name[0] == '_' && name[1] == '_') {
468 int n = strlen(name);
469 if (name[n-1] == '_' && name[n-2] == '_') {
470 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000471 return -1;
472 }
Guido van Rossume7737541994-09-05 07:31:41 +0000473 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000474 if (v == NULL)
475 func = inst->in_class->cl_delattr;
476 else
477 func = inst->in_class->cl_setattr;
478 if (func == NULL)
479 return instance_setattr1(inst, name, v);
480 if (v == NULL)
481 args = mkvalue("(Os)", inst, name);
482 else
483 args = mkvalue("(OsO)", inst, name, v);
484 if (args == NULL)
485 return -1;
486 res = call_object(func, args);
487 DECREF(args);
488 if (res == NULL)
489 return -1;
490 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000491 return 0;
492}
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)
Guido van Rossum03093a21994-09-28 15:51:32 +0000521 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000522{
Guido van Rossum03093a21994-09-28 15:51:32 +0000523 object *result;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000524 int outcome;
Guido van Rossum03093a21994-09-28 15:51:32 +0000525 result = instancebinop(inst, other, "__cmp__", "__rcmp__");
526 if (result == NULL)
527 return -2;
528 outcome = getintvalue(result);
529 DECREF(result);
530 if (outcome == -1 && err_occurred())
531 return -2;
532 if (outcome < 0)
533 return -1;
534 else if (outcome > 0)
535 return 1;
536 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000537}
538
Guido van Rossum9bfef441993-03-29 10:43:31 +0000539static long
540instance_hash(inst)
541 instanceobject *inst;
542{
543 object *func;
544 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000545 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000546
547 func = instance_getattr(inst, "__hash__");
548 if (func == NULL) {
549 /* If there is no __cmp__ method, we hash on the address.
550 If a __cmp__ method exists, there must be a __hash__. */
551 err_clear();
552 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000553 if (func == NULL) {
554 err_clear();
555 outcome = (long)inst;
556 if (outcome == -1)
557 outcome = -2;
558 return outcome;
559 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000560 err_setstr(TypeError, "unhashable instance");
561 return -1;
562 }
563 res = call_object(func, (object *)NULL);
564 DECREF(func);
565 if (res == NULL)
566 return -1;
567 if (is_intobject(res)) {
568 outcome = getintvalue(res);
569 if (outcome == -1)
570 outcome = -2;
571 }
572 else {
573 err_setstr(TypeError, "__hash__() should return an int");
574 outcome = -1;
575 }
576 DECREF(res);
577 return outcome;
578}
579
580static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000581instance_length(inst)
582 instanceobject *inst;
583{
584 object *func;
585 object *res;
586 int outcome;
587
588 func = instance_getattr(inst, "__len__");
589 if (func == NULL)
590 return -1;
591 res = call_object(func, (object *)NULL);
592 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000593 if (res == NULL)
594 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000595 if (is_intobject(res)) {
596 outcome = getintvalue(res);
597 if (outcome < 0)
598 err_setstr(ValueError, "__len__() should return >= 0");
599 }
600 else {
601 err_setstr(TypeError, "__len__() should return an int");
602 outcome = -1;
603 }
604 DECREF(res);
605 return outcome;
606}
607
Guido van Rossum9bfef441993-03-29 10:43:31 +0000608static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000609instance_subscript(inst, key)
610 instanceobject *inst;
611 object *key;
612{
613 object *func;
614 object *arg;
615 object *res;
616
617 func = instance_getattr(inst, "__getitem__");
618 if (func == NULL)
619 return NULL;
620 arg = mkvalue("(O)", key);
621 if (arg == NULL) {
622 DECREF(func);
623 return NULL;
624 }
625 res = call_object(func, arg);
626 DECREF(func);
627 DECREF(arg);
628 return res;
629}
630
Guido van Rossum9bfef441993-03-29 10:43:31 +0000631static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000632instance_ass_subscript(inst, key, value)
633 instanceobject*inst;
634 object *key;
635 object *value;
636{
637 object *func;
638 object *arg;
639 object *res;
640
641 if (value == NULL)
642 func = instance_getattr(inst, "__delitem__");
643 else
644 func = instance_getattr(inst, "__setitem__");
645 if (func == NULL)
646 return -1;
647 if (value == NULL)
648 arg = mkvalue("(O)", key);
649 else
650 arg = mkvalue("(OO)", key, value);
651 if (arg == NULL) {
652 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000653 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000654 }
655 res = call_object(func, arg);
656 DECREF(func);
657 DECREF(arg);
658 if (res == NULL)
659 return -1;
660 DECREF(res);
661 return 0;
662}
663
Guido van Rossum9bfef441993-03-29 10:43:31 +0000664static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000665 (inquiry)instance_length, /*mp_length*/
666 (binaryfunc)instance_subscript, /*mp_subscript*/
667 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000668};
669
670static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000671instance_item(inst, i)
672 instanceobject *inst;
673 int i;
674{
675 object *func, *arg, *res;
676
677 func = instance_getattr(inst, "__getitem__");
678 if (func == NULL)
679 return NULL;
680 arg = newintobject((long)i);
681 if (arg == NULL) {
682 DECREF(func);
683 return NULL;
684 }
685 res = call_object(func, arg);
686 DECREF(func);
687 DECREF(arg);
688 return res;
689}
690
691static object *
692instance_slice(inst, i, j)
693 instanceobject *inst;
694 int i, j;
695{
696 object *func, *arg, *res;
697
698 func = instance_getattr(inst, "__getslice__");
699 if (func == NULL)
700 return NULL;
701 arg = mkvalue("(ii)", i, j);
702 if (arg == NULL) {
703 DECREF(func);
704 return NULL;
705 }
706 res = call_object(func, arg);
707 DECREF(func);
708 DECREF(arg);
709 return res;
710}
711
712static int
713instance_ass_item(inst, i, item)
714 instanceobject *inst;
715 int i;
716 object *item;
717{
718 object *func, *arg, *res;
719
720 if (item == NULL)
721 func = instance_getattr(inst, "__delitem__");
722 else
723 func = instance_getattr(inst, "__setitem__");
724 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000725 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000726 if (item == NULL)
727 arg = mkvalue("i", i);
728 else
729 arg = mkvalue("(iO)", i, item);
730 if (arg == NULL) {
731 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000732 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000733 }
734 res = call_object(func, arg);
735 DECREF(func);
736 DECREF(arg);
737 if (res == NULL)
738 return -1;
739 DECREF(res);
740 return 0;
741}
742
743static int
744instance_ass_slice(inst, i, j, value)
745 instanceobject *inst;
746 int i, j;
747 object *value;
748{
749 object *func, *arg, *res;
750
751 if (value == NULL)
752 func = instance_getattr(inst, "__delslice__");
753 else
754 func = instance_getattr(inst, "__setslice__");
755 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000756 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000757 if (value == NULL)
758 arg = mkvalue("(ii)", i, j);
759 else
760 arg = mkvalue("(iiO)", i, j, value);
761 if (arg == NULL) {
762 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000763 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764 }
765 res = call_object(func, arg);
766 DECREF(func);
767 DECREF(arg);
768 if (res == NULL)
769 return -1;
770 DECREF(res);
771 return 0;
772}
773
774static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000775 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000776 0, /*sq_concat*/
777 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000778 (intargfunc)instance_item, /*sq_item*/
779 (intintargfunc)instance_slice, /*sq_slice*/
780 (intobjargproc)instance_ass_item, /*sq_ass_item*/
781 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782};
783
784static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785generic_unary_op(self, methodname)
786 instanceobject *self;
787 char *methodname;
788{
789 object *func, *res;
790
791 if ((func = instance_getattr(self, methodname)) == NULL)
792 return NULL;
793 res = call_object(func, (object *)NULL);
794 DECREF(func);
795 return res;
796}
797
Guido van Rossum03093a21994-09-28 15:51:32 +0000798
799/* Forward */
800static int halfbinop PROTO((object *, object *, char *, object **));
801
802
803/* Implement a binary operator involving at least one class instance. */
804
805object *
806instancebinop(v, w, opname, ropname)
807 object *v;
808 object *w;
809 char *opname;
810 char *ropname;
811{
812 char buf[256];
813 object *result = NULL;
814 if (halfbinop(v, w, opname, &result) <= 0)
815 return result;
816 if (halfbinop(w, v, ropname, &result) <= 0)
817 return result;
818 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
819 err_setstr(TypeError, buf);
820 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000821}
822
Guido van Rossum03093a21994-09-28 15:51:32 +0000823
824/* Try one half of a binary operator involving a class instance.
825 Return value:
826 -1 if an exception is to be reported right away
827 0 if we have a valid result
828 1 if we could try another operation
829*/
830
831static int
832halfbinop(v, w, opname, r_result)
833 object *v;
834 object *w;
835 char *opname;
836 object **r_result;
837{
838 object *func;
839 object *args;
840 object *coerce;
841 object *coerced = NULL;
842 object *v1;
843
844 if (!is_instanceobject(v))
845 return 1;
846 func = getattr(v, opname);
847 if (func == NULL) {
848 if (err_occurred() != AttributeError)
849 return -1;
850 err_clear();
851 return 1;
852 }
853 coerce = getattr(v, "__coerce__");
854 if (coerce == NULL) {
855 err_clear();
856 }
857 else {
858 args = mkvalue("(O)", w);
859 if (args == NULL) {
860 DECREF(func);
861 return -1;
862 }
863 coerced = call_object(coerce, args);
864 DECREF(args);
865 DECREF(coerce);
866 if (coerced == NULL) {
867 DECREF(func);
868 return -1;
869 }
870 if (coerced == None) {
871 DECREF(coerced);
872 DECREF(func);
873 return 1;
874 }
875 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
876 DECREF(coerced);
877 DECREF(func);
878 err_setstr(TypeError, "coercion should return None or 2-tuple");
879 return -1;
880 }
881 v1 = gettupleitem(coerced, 0);
882 if (v1 != v) {
883 v = v1;
884 DECREF(func);
885 func = getattr(v, opname);
886 if (func == NULL) {
887 XDECREF(coerced);
888 return -1;
889 }
890 }
891 w = gettupleitem(coerced, 1);
892 }
893 args = mkvalue("(O)", w);
894 if (args == NULL) {
895 DECREF(func);
896 XDECREF(coerced);
897 return -1;
898 }
899 *r_result = call_object(func, args);
900 DECREF(args);
901 DECREF(func);
902 XDECREF(coerced);
903 return *r_result == NULL ? -1 : 0;
904}
905
906
Guido van Rossum04691fc1992-08-12 15:35:34 +0000907#define UNARY(funcname, methodname) \
908static object *funcname(self) instanceobject *self; { \
909 return generic_unary_op(self, methodname); \
910}
911
Guido van Rossum04691fc1992-08-12 15:35:34 +0000912UNARY(instance_neg, "__neg__")
913UNARY(instance_pos, "__pos__")
914UNARY(instance_abs, "__abs__")
915
Guido van Rossum9bfef441993-03-29 10:43:31 +0000916static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000917instance_nonzero(self)
918 instanceobject *self;
919{
920 object *func, *res;
921 long outcome;
922
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000923 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000925 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 err_clear();
927 /* Fall back to the default behavior:
928 all instances are nonzero */
929 return 1;
930 }
931 }
932 res = call_object(func, (object *)NULL);
933 DECREF(func);
934 if (res == NULL)
935 return -1;
936 if (!is_intobject(res)) {
937 DECREF(res);
938 err_setstr(TypeError, "__nonzero__ should return an int");
939 return -1;
940 }
941 outcome = getintvalue(res);
942 DECREF(res);
943 if (outcome < 0) {
944 err_setstr(ValueError, "__nonzero__ should return >= 0");
945 return -1;
946 }
947 return outcome > 0;
948}
949
950UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000951UNARY(instance_int, "__int__")
952UNARY(instance_long, "__long__")
953UNARY(instance_float, "__float__")
954UNARY(instance_oct, "__oct__")
955UNARY(instance_hex, "__hex__")
956
Guido van Rossum03093a21994-09-28 15:51:32 +0000957/* This version is for ternary calls only (z != None) */
958static object *
959instance_pow(v, w, z)
960 object *v;
961 object *w;
962 object *z;
963{
964 /* XXX Doesn't do coercions... */
965 object *func;
966 object *args;
967 object *result;
968 func = getattr(v, "__pow__");
969 if (func == NULL)
970 return NULL;
971 args = mkvalue("(OO)", w, z);
972 if (args == NULL) {
973 DECREF(func);
974 return NULL;
975 }
976 result = call_object(func, args);
977 DECREF(func);
978 DECREF(args);
979 return result;
980}
981
Guido van Rossum04691fc1992-08-12 15:35:34 +0000982static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +0000983 0, /*nb_add*/
984 0, /*nb_subtract*/
985 0, /*nb_multiply*/
986 0, /*nb_divide*/
987 0, /*nb_remainder*/
988 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000989 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000990 (unaryfunc)instance_neg, /*nb_negative*/
991 (unaryfunc)instance_pos, /*nb_positive*/
992 (unaryfunc)instance_abs, /*nb_absolute*/
993 (inquiry)instance_nonzero, /*nb_nonzero*/
994 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000995 0, /*nb_lshift*/
996 0, /*nb_rshift*/
997 0, /*nb_and*/
998 0, /*nb_xor*/
999 0, /*nb_or*/
1000 0, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001 (unaryfunc)instance_int, /*nb_int*/
1002 (unaryfunc)instance_long, /*nb_long*/
1003 (unaryfunc)instance_float, /*nb_float*/
1004 (unaryfunc)instance_oct, /*nb_oct*/
1005 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001006};
1007
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001008typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001009 OB_HEAD_INIT(&Typetype)
1010 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001011 "instance",
1012 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001013 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001014 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001015 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001016 (getattrfunc)instance_getattr, /*tp_getattr*/
1017 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001018 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001020 &instance_as_number, /*tp_as_number*/
1021 &instance_as_sequence, /*tp_as_sequence*/
1022 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001023 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001024};
1025
1026
Guido van Rossum81daa321993-05-20 14:24:46 +00001027/* Instance method objects are used for two purposes:
1028 (a) as bound instance methods (returned by instancename.methodname)
1029 (b) as unbound methods (returned by ClassName.methodname)
1030 In case (b), im_self is NULL
1031*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001032
1033typedef struct {
1034 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001035 object *im_func; /* The function implementing the method */
1036 object *im_self; /* The instance it is bound to, or NULL */
1037 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001038} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001039
1040object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001041newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001042 object *func;
1043 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001044 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045{
Guido van Rossume8122f11991-05-05 20:03:07 +00001046 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001048 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001049 return NULL;
1050 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001051 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1052 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001053 return NULL;
1054 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001055 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001056 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001057 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001058 INCREF(class);
1059 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001060 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061}
1062
1063object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001064instancemethodgetfunc(im)
1065 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001066{
Guido van Rossume8122f11991-05-05 20:03:07 +00001067 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001068 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001069 return NULL;
1070 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001071 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001072}
1073
1074object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001075instancemethodgetself(im)
1076 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001077{
Guido van Rossume8122f11991-05-05 20:03:07 +00001078 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001079 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080 return NULL;
1081 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001082 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001083}
1084
Guido van Rossum81daa321993-05-20 14:24:46 +00001085object *
1086instancemethodgetclass(im)
1087 register object *im;
1088{
1089 if (!is_instancemethodobject(im)) {
1090 err_badcall();
1091 return NULL;
1092 }
1093 return ((instancemethodobject *)im)->im_class;
1094}
1095
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001096/* Class method methods */
1097
Guido van Rossume8122f11991-05-05 20:03:07 +00001098#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001099
Guido van Rossume8122f11991-05-05 20:03:07 +00001100static struct memberlist instancemethod_memberlist[] = {
1101 {"im_func", T_OBJECT, OFF(im_func)},
1102 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001103 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104 {NULL} /* Sentinel */
1105};
1106
1107static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001108instancemethod_getattr(im, name)
1109 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110 char *name;
1111{
Guido van Rossume8122f11991-05-05 20:03:07 +00001112 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001113}
1114
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001115static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001116instancemethod_dealloc(im)
1117 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001118{
Guido van Rossume8122f11991-05-05 20:03:07 +00001119 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001120 XDECREF(im->im_self);
1121 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001122 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123}
1124
Guido van Rossumebc8c511992-09-03 20:39:51 +00001125static int
1126instancemethod_compare(a, b)
1127 instancemethodobject *a, *b;
1128{
1129 int cmp = cmpobject(a->im_self, b->im_self);
1130 if (cmp == 0)
1131 cmp = cmpobject(a->im_func, b->im_func);
1132 return cmp;
1133}
1134
Guido van Rossum25831651993-05-19 14:50:45 +00001135static object *
1136instancemethod_repr(a)
1137 instancemethodobject *a;
1138{
1139 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001140 instanceobject *self = (instanceobject *)(a->im_self);
1141 funcobject *func = (funcobject *)(a->im_func);
1142 classobject *class = (classobject *)(a->im_class);
1143 object *fclassname, *iclassname, *funcname;
1144 char *fcname, *icname, *fname;
1145 fclassname = class->cl_name;
1146 funcname = func->func_name;
1147 if (fclassname != NULL && is_stringobject(fclassname))
1148 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001149 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001150 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001151 if (funcname != NULL && is_stringobject(funcname))
1152 fname = getstringvalue(funcname);
1153 else
1154 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001155 if (self == NULL)
1156 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1157 else {
1158 iclassname = self->in_class->cl_name;
1159 if (iclassname != NULL && is_stringobject(iclassname))
1160 icname = getstringvalue(iclassname);
1161 else
1162 icname = "?";
1163 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1164 fcname, fname, icname, (long)self);
1165 }
Guido van Rossum25831651993-05-19 14:50:45 +00001166 return newstringobject(buf);
1167}
1168
Guido van Rossum9bfef441993-03-29 10:43:31 +00001169static long
1170instancemethod_hash(a)
1171 instancemethodobject *a;
1172{
1173 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001174 if (a->im_self == NULL)
1175 x = hashobject(None);
1176 else
1177 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001178 if (x == -1)
1179 return -1;
1180 y = hashobject(a->im_func);
1181 if (y == -1)
1182 return -1;
1183 return x ^ y;
1184}
1185
Guido van Rossume8122f11991-05-05 20:03:07 +00001186typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187 OB_HEAD_INIT(&Typetype)
1188 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001189 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001190 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001191 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001192 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001194 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001195 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001196 (cmpfunc)instancemethod_compare, /*tp_compare*/
1197 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001198 0, /*tp_as_number*/
1199 0, /*tp_as_sequence*/
1200 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001201 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001202};