blob: a3958010b1596643c890c088cb6c8423c42d60a1 [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__");
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000526 if (result == NULL) {
527 /* no __cmp__ or __rcmp__ methods, so use addresses */
528 err_clear();
529 return inst < other ? -1 : (inst > other ? 1 : 0);
530 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000531 outcome = getintvalue(result);
532 DECREF(result);
533 if (outcome == -1 && err_occurred())
534 return -2;
535 if (outcome < 0)
536 return -1;
537 else if (outcome > 0)
538 return 1;
539 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000540}
541
Guido van Rossum9bfef441993-03-29 10:43:31 +0000542static long
543instance_hash(inst)
544 instanceobject *inst;
545{
546 object *func;
547 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000548 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000549
550 func = instance_getattr(inst, "__hash__");
551 if (func == NULL) {
552 /* If there is no __cmp__ method, we hash on the address.
553 If a __cmp__ method exists, there must be a __hash__. */
554 err_clear();
555 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000556 if (func == NULL) {
557 err_clear();
558 outcome = (long)inst;
559 if (outcome == -1)
560 outcome = -2;
561 return outcome;
562 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000563 err_setstr(TypeError, "unhashable instance");
564 return -1;
565 }
566 res = call_object(func, (object *)NULL);
567 DECREF(func);
568 if (res == NULL)
569 return -1;
570 if (is_intobject(res)) {
571 outcome = getintvalue(res);
572 if (outcome == -1)
573 outcome = -2;
574 }
575 else {
576 err_setstr(TypeError, "__hash__() should return an int");
577 outcome = -1;
578 }
579 DECREF(res);
580 return outcome;
581}
582
583static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000584instance_length(inst)
585 instanceobject *inst;
586{
587 object *func;
588 object *res;
589 int outcome;
590
591 func = instance_getattr(inst, "__len__");
592 if (func == NULL)
593 return -1;
594 res = call_object(func, (object *)NULL);
595 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000596 if (res == NULL)
597 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000598 if (is_intobject(res)) {
599 outcome = getintvalue(res);
600 if (outcome < 0)
601 err_setstr(ValueError, "__len__() should return >= 0");
602 }
603 else {
604 err_setstr(TypeError, "__len__() should return an int");
605 outcome = -1;
606 }
607 DECREF(res);
608 return outcome;
609}
610
Guido van Rossum9bfef441993-03-29 10:43:31 +0000611static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000612instance_subscript(inst, key)
613 instanceobject *inst;
614 object *key;
615{
616 object *func;
617 object *arg;
618 object *res;
619
620 func = instance_getattr(inst, "__getitem__");
621 if (func == NULL)
622 return NULL;
623 arg = mkvalue("(O)", key);
624 if (arg == NULL) {
625 DECREF(func);
626 return NULL;
627 }
628 res = call_object(func, arg);
629 DECREF(func);
630 DECREF(arg);
631 return res;
632}
633
Guido van Rossum9bfef441993-03-29 10:43:31 +0000634static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000635instance_ass_subscript(inst, key, value)
636 instanceobject*inst;
637 object *key;
638 object *value;
639{
640 object *func;
641 object *arg;
642 object *res;
643
644 if (value == NULL)
645 func = instance_getattr(inst, "__delitem__");
646 else
647 func = instance_getattr(inst, "__setitem__");
648 if (func == NULL)
649 return -1;
650 if (value == NULL)
651 arg = mkvalue("(O)", key);
652 else
653 arg = mkvalue("(OO)", key, value);
654 if (arg == NULL) {
655 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000656 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000657 }
658 res = call_object(func, arg);
659 DECREF(func);
660 DECREF(arg);
661 if (res == NULL)
662 return -1;
663 DECREF(res);
664 return 0;
665}
666
Guido van Rossum9bfef441993-03-29 10:43:31 +0000667static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000668 (inquiry)instance_length, /*mp_length*/
669 (binaryfunc)instance_subscript, /*mp_subscript*/
670 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000671};
672
673static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000674instance_item(inst, i)
675 instanceobject *inst;
676 int i;
677{
678 object *func, *arg, *res;
679
680 func = instance_getattr(inst, "__getitem__");
681 if (func == NULL)
682 return NULL;
683 arg = newintobject((long)i);
684 if (arg == NULL) {
685 DECREF(func);
686 return NULL;
687 }
688 res = call_object(func, arg);
689 DECREF(func);
690 DECREF(arg);
691 return res;
692}
693
694static object *
695instance_slice(inst, i, j)
696 instanceobject *inst;
697 int i, j;
698{
699 object *func, *arg, *res;
700
701 func = instance_getattr(inst, "__getslice__");
702 if (func == NULL)
703 return NULL;
704 arg = mkvalue("(ii)", i, j);
705 if (arg == NULL) {
706 DECREF(func);
707 return NULL;
708 }
709 res = call_object(func, arg);
710 DECREF(func);
711 DECREF(arg);
712 return res;
713}
714
715static int
716instance_ass_item(inst, i, item)
717 instanceobject *inst;
718 int i;
719 object *item;
720{
721 object *func, *arg, *res;
722
723 if (item == NULL)
724 func = instance_getattr(inst, "__delitem__");
725 else
726 func = instance_getattr(inst, "__setitem__");
727 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000728 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000729 if (item == NULL)
730 arg = mkvalue("i", i);
731 else
732 arg = mkvalue("(iO)", i, item);
733 if (arg == NULL) {
734 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000735 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000736 }
737 res = call_object(func, arg);
738 DECREF(func);
739 DECREF(arg);
740 if (res == NULL)
741 return -1;
742 DECREF(res);
743 return 0;
744}
745
746static int
747instance_ass_slice(inst, i, j, value)
748 instanceobject *inst;
749 int i, j;
750 object *value;
751{
752 object *func, *arg, *res;
753
754 if (value == NULL)
755 func = instance_getattr(inst, "__delslice__");
756 else
757 func = instance_getattr(inst, "__setslice__");
758 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000759 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000760 if (value == NULL)
761 arg = mkvalue("(ii)", i, j);
762 else
763 arg = mkvalue("(iiO)", i, j, value);
764 if (arg == NULL) {
765 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000766 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767 }
768 res = call_object(func, arg);
769 DECREF(func);
770 DECREF(arg);
771 if (res == NULL)
772 return -1;
773 DECREF(res);
774 return 0;
775}
776
777static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000778 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000779 0, /*sq_concat*/
780 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000781 (intargfunc)instance_item, /*sq_item*/
782 (intintargfunc)instance_slice, /*sq_slice*/
783 (intobjargproc)instance_ass_item, /*sq_ass_item*/
784 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000785};
786
787static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000788generic_unary_op(self, methodname)
789 instanceobject *self;
790 char *methodname;
791{
792 object *func, *res;
793
794 if ((func = instance_getattr(self, methodname)) == NULL)
795 return NULL;
796 res = call_object(func, (object *)NULL);
797 DECREF(func);
798 return res;
799}
800
Guido van Rossum03093a21994-09-28 15:51:32 +0000801
802/* Forward */
803static int halfbinop PROTO((object *, object *, char *, object **));
804
805
806/* Implement a binary operator involving at least one class instance. */
807
808object *
809instancebinop(v, w, opname, ropname)
810 object *v;
811 object *w;
812 char *opname;
813 char *ropname;
814{
815 char buf[256];
816 object *result = NULL;
817 if (halfbinop(v, w, opname, &result) <= 0)
818 return result;
819 if (halfbinop(w, v, ropname, &result) <= 0)
820 return result;
821 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
822 err_setstr(TypeError, buf);
823 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000824}
825
Guido van Rossum03093a21994-09-28 15:51:32 +0000826
827/* Try one half of a binary operator involving a class instance.
828 Return value:
829 -1 if an exception is to be reported right away
830 0 if we have a valid result
831 1 if we could try another operation
832*/
833
834static int
835halfbinop(v, w, opname, r_result)
836 object *v;
837 object *w;
838 char *opname;
839 object **r_result;
840{
841 object *func;
842 object *args;
843 object *coerce;
844 object *coerced = NULL;
845 object *v1;
846
847 if (!is_instanceobject(v))
848 return 1;
849 func = getattr(v, opname);
850 if (func == NULL) {
851 if (err_occurred() != AttributeError)
852 return -1;
853 err_clear();
854 return 1;
855 }
856 coerce = getattr(v, "__coerce__");
857 if (coerce == NULL) {
858 err_clear();
859 }
860 else {
861 args = mkvalue("(O)", w);
862 if (args == NULL) {
863 DECREF(func);
864 return -1;
865 }
866 coerced = call_object(coerce, args);
867 DECREF(args);
868 DECREF(coerce);
869 if (coerced == NULL) {
870 DECREF(func);
871 return -1;
872 }
873 if (coerced == None) {
874 DECREF(coerced);
875 DECREF(func);
876 return 1;
877 }
878 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
879 DECREF(coerced);
880 DECREF(func);
881 err_setstr(TypeError, "coercion should return None or 2-tuple");
882 return -1;
883 }
884 v1 = gettupleitem(coerced, 0);
885 if (v1 != v) {
886 v = v1;
887 DECREF(func);
888 func = getattr(v, opname);
889 if (func == NULL) {
890 XDECREF(coerced);
891 return -1;
892 }
893 }
894 w = gettupleitem(coerced, 1);
895 }
896 args = mkvalue("(O)", w);
897 if (args == NULL) {
898 DECREF(func);
899 XDECREF(coerced);
900 return -1;
901 }
902 *r_result = call_object(func, args);
903 DECREF(args);
904 DECREF(func);
905 XDECREF(coerced);
906 return *r_result == NULL ? -1 : 0;
907}
908
909
Guido van Rossum04691fc1992-08-12 15:35:34 +0000910#define UNARY(funcname, methodname) \
911static object *funcname(self) instanceobject *self; { \
912 return generic_unary_op(self, methodname); \
913}
914
Guido van Rossum04691fc1992-08-12 15:35:34 +0000915UNARY(instance_neg, "__neg__")
916UNARY(instance_pos, "__pos__")
917UNARY(instance_abs, "__abs__")
918
Guido van Rossum9bfef441993-03-29 10:43:31 +0000919static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920instance_nonzero(self)
921 instanceobject *self;
922{
923 object *func, *res;
924 long outcome;
925
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000926 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000927 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000928 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000929 err_clear();
930 /* Fall back to the default behavior:
931 all instances are nonzero */
932 return 1;
933 }
934 }
935 res = call_object(func, (object *)NULL);
936 DECREF(func);
937 if (res == NULL)
938 return -1;
939 if (!is_intobject(res)) {
940 DECREF(res);
941 err_setstr(TypeError, "__nonzero__ should return an int");
942 return -1;
943 }
944 outcome = getintvalue(res);
945 DECREF(res);
946 if (outcome < 0) {
947 err_setstr(ValueError, "__nonzero__ should return >= 0");
948 return -1;
949 }
950 return outcome > 0;
951}
952
953UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000954UNARY(instance_int, "__int__")
955UNARY(instance_long, "__long__")
956UNARY(instance_float, "__float__")
957UNARY(instance_oct, "__oct__")
958UNARY(instance_hex, "__hex__")
959
Guido van Rossum03093a21994-09-28 15:51:32 +0000960/* This version is for ternary calls only (z != None) */
961static object *
962instance_pow(v, w, z)
963 object *v;
964 object *w;
965 object *z;
966{
967 /* XXX Doesn't do coercions... */
968 object *func;
969 object *args;
970 object *result;
971 func = getattr(v, "__pow__");
972 if (func == NULL)
973 return NULL;
974 args = mkvalue("(OO)", w, z);
975 if (args == NULL) {
976 DECREF(func);
977 return NULL;
978 }
979 result = call_object(func, args);
980 DECREF(func);
981 DECREF(args);
982 return result;
983}
984
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +0000986 0, /*nb_add*/
987 0, /*nb_subtract*/
988 0, /*nb_multiply*/
989 0, /*nb_divide*/
990 0, /*nb_remainder*/
991 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000992 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000993 (unaryfunc)instance_neg, /*nb_negative*/
994 (unaryfunc)instance_pos, /*nb_positive*/
995 (unaryfunc)instance_abs, /*nb_absolute*/
996 (inquiry)instance_nonzero, /*nb_nonzero*/
997 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000998 0, /*nb_lshift*/
999 0, /*nb_rshift*/
1000 0, /*nb_and*/
1001 0, /*nb_xor*/
1002 0, /*nb_or*/
1003 0, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001004 (unaryfunc)instance_int, /*nb_int*/
1005 (unaryfunc)instance_long, /*nb_long*/
1006 (unaryfunc)instance_float, /*nb_float*/
1007 (unaryfunc)instance_oct, /*nb_oct*/
1008 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001009};
1010
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001011typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001012 OB_HEAD_INIT(&Typetype)
1013 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001014 "instance",
1015 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001016 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001017 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001018 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019 (getattrfunc)instance_getattr, /*tp_getattr*/
1020 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001021 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001022 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001023 &instance_as_number, /*tp_as_number*/
1024 &instance_as_sequence, /*tp_as_sequence*/
1025 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001027};
1028
1029
Guido van Rossum81daa321993-05-20 14:24:46 +00001030/* Instance method objects are used for two purposes:
1031 (a) as bound instance methods (returned by instancename.methodname)
1032 (b) as unbound methods (returned by ClassName.methodname)
1033 In case (b), im_self is NULL
1034*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035
1036typedef struct {
1037 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001038 object *im_func; /* The function implementing the method */
1039 object *im_self; /* The instance it is bound to, or NULL */
1040 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001041} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001042
1043object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001044newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045 object *func;
1046 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001047 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001048{
Guido van Rossume8122f11991-05-05 20:03:07 +00001049 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001050 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001051 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001052 return NULL;
1053 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001054 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1055 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056 return NULL;
1057 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001058 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001059 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001060 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001061 INCREF(class);
1062 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001063 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001064}
1065
1066object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001067instancemethodgetfunc(im)
1068 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001069{
Guido van Rossume8122f11991-05-05 20:03:07 +00001070 if (!is_instancemethodobject(im)) {
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 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001075}
1076
1077object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001078instancemethodgetself(im)
1079 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080{
Guido van Rossume8122f11991-05-05 20:03:07 +00001081 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001082 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001083 return NULL;
1084 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001085 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001086}
1087
Guido van Rossum81daa321993-05-20 14:24:46 +00001088object *
1089instancemethodgetclass(im)
1090 register object *im;
1091{
1092 if (!is_instancemethodobject(im)) {
1093 err_badcall();
1094 return NULL;
1095 }
1096 return ((instancemethodobject *)im)->im_class;
1097}
1098
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001099/* Class method methods */
1100
Guido van Rossume8122f11991-05-05 20:03:07 +00001101#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001102
Guido van Rossume8122f11991-05-05 20:03:07 +00001103static struct memberlist instancemethod_memberlist[] = {
1104 {"im_func", T_OBJECT, OFF(im_func)},
1105 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001106 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001107 {NULL} /* Sentinel */
1108};
1109
1110static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001111instancemethod_getattr(im, name)
1112 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001113 char *name;
1114{
Guido van Rossume8122f11991-05-05 20:03:07 +00001115 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116}
1117
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001118static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001119instancemethod_dealloc(im)
1120 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001121{
Guido van Rossume8122f11991-05-05 20:03:07 +00001122 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001123 XDECREF(im->im_self);
1124 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001125 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001126}
1127
Guido van Rossumebc8c511992-09-03 20:39:51 +00001128static int
1129instancemethod_compare(a, b)
1130 instancemethodobject *a, *b;
1131{
1132 int cmp = cmpobject(a->im_self, b->im_self);
1133 if (cmp == 0)
1134 cmp = cmpobject(a->im_func, b->im_func);
1135 return cmp;
1136}
1137
Guido van Rossum25831651993-05-19 14:50:45 +00001138static object *
1139instancemethod_repr(a)
1140 instancemethodobject *a;
1141{
1142 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001143 instanceobject *self = (instanceobject *)(a->im_self);
1144 funcobject *func = (funcobject *)(a->im_func);
1145 classobject *class = (classobject *)(a->im_class);
1146 object *fclassname, *iclassname, *funcname;
1147 char *fcname, *icname, *fname;
1148 fclassname = class->cl_name;
1149 funcname = func->func_name;
1150 if (fclassname != NULL && is_stringobject(fclassname))
1151 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001152 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001153 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001154 if (funcname != NULL && is_stringobject(funcname))
1155 fname = getstringvalue(funcname);
1156 else
1157 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001158 if (self == NULL)
1159 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1160 else {
1161 iclassname = self->in_class->cl_name;
1162 if (iclassname != NULL && is_stringobject(iclassname))
1163 icname = getstringvalue(iclassname);
1164 else
1165 icname = "?";
1166 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1167 fcname, fname, icname, (long)self);
1168 }
Guido van Rossum25831651993-05-19 14:50:45 +00001169 return newstringobject(buf);
1170}
1171
Guido van Rossum9bfef441993-03-29 10:43:31 +00001172static long
1173instancemethod_hash(a)
1174 instancemethodobject *a;
1175{
1176 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001177 if (a->im_self == NULL)
1178 x = hashobject(None);
1179 else
1180 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001181 if (x == -1)
1182 return -1;
1183 y = hashobject(a->im_func);
1184 if (y == -1)
1185 return -1;
1186 return x ^ y;
1187}
1188
Guido van Rossume8122f11991-05-05 20:03:07 +00001189typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001190 OB_HEAD_INIT(&Typetype)
1191 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001192 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001193 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001195 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001196 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001197 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001198 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001199 (cmpfunc)instancemethod_compare, /*tp_compare*/
1200 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001201 0, /*tp_as_number*/
1202 0, /*tp_as_sequence*/
1203 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001204 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001205};