blob: b1b355b905fb44fa275cf8e69f80340cfa3b4102 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The 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)) {
250 if (!is_accessobject(value))
251 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000252 if (hasaccessvalue(value))
253 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000254 ac = dict2lookup(inst->in_dict, key);
255 if (ac != NULL && is_accessobject(ac)) {
256 err_setval(ConflictError, key);
257 return -1;
258 }
259 ac = cloneaccessobject(value);
260 if (ac == NULL)
261 return -1;
262 ret = dict2insert(inst->in_dict, key, ac);
263 DECREF(ac);
264 if (ret != 0)
265 return -1;
266 }
267 return 0;
268}
269
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270object *
Guido van Rossum25831651993-05-19 14:50:45 +0000271newinstanceobject(class, arg)
272 object *class;
273 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274{
Guido van Rossume8122f11991-05-05 20:03:07 +0000275 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000276 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000278 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return NULL;
280 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000281 inst = NEWOBJ(instanceobject, &Instancetype);
282 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000285 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000286 inst->in_dict = newdictobject();
287 if (inst->in_dict == NULL ||
288 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000289 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 return NULL;
291 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000292 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000293 if (init == NULL) {
294 err_clear();
295 if (arg != NULL && !(is_tupleobject(arg) &&
296 gettuplesize(arg) == 0)) {
297 err_setstr(TypeError,
298 "this classobject() takes no arguments");
299 DECREF(inst);
300 inst = NULL;
301 }
302 }
303 else {
304 object *res = call_object(init, arg);
305 DECREF(init);
306 if (res == NULL) {
307 DECREF(inst);
308 inst = NULL;
309 }
310 else {
311 if (res != None) {
312 err_setstr(TypeError,
313 "__init__() should return None");
314 DECREF(inst);
315 inst = NULL;
316 }
317 DECREF(res);
318 }
319 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000320 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321}
322
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000323/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324
325static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000326instance_dealloc(inst)
327 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000329 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000330 object *del;
331 /* Call the __del__ method if it exists. First temporarily
332 revive the object and save the current exception, if any. */
333 INCREF(inst);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000334 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000335 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000336 object *args = newtupleobject(0);
337 object *res = args;
338 if (res != NULL)
339 res = call_object(del, args);
340 XDECREF(args);
341 DECREF(del);
342 XDECREF(res);
343 /* XXX If __del__ raised an exception, it is ignored! */
344 }
345 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000346 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000347 /* Can't use DECREF here, it would cause a recursive call */
348 if (--inst->ob_refcnt > 0)
349 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000350 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000351 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000352 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353}
354
Guido van Rossume7737541994-09-05 07:31:41 +0000355static object *
356instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000357 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 register char *name;
359{
Guido van Rossum94308391991-10-20 20:11:48 +0000360 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000361 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000362 if (name[0] == '_' && name[1] == '_') {
363 if (strcmp(name, "__dict__") == 0) {
364 INCREF(inst->in_dict);
365 return inst->in_dict;
366 }
367 if (strcmp(name, "__class__") == 0) {
368 INCREF(inst->in_class);
369 return (object *)inst->in_class;
370 }
Guido van Rossum94308391991-10-20 20:11:48 +0000371 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000372 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000373 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000374 if (v == NULL) {
375 v = class_lookup(inst->in_class, name, &class);
376 if (v == NULL) {
377 err_setstr(AttributeError, name);
378 return NULL;
379 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000381 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000382 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000383 if (v == NULL)
384 return NULL;
385 }
386 else
387 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000388 if (class != NULL) {
389 if (is_funcobject(v)) {
390 object *w = newinstancemethodobject(v, (object *)inst,
391 (object *)class);
392 DECREF(v);
393 v = w;
394 }
395 else if (is_instancemethodobject(v)) {
396 object *im_class = instancemethodgetclass(v);
397 /* Only if classes are compatible */
398 if (issubclass((object *)class, im_class)) {
399 object *im_func = instancemethodgetfunc(v);
400 object *w = newinstancemethodobject(im_func,
401 (object *)inst, im_class);
402 DECREF(v);
403 v = w;
404 }
405 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000406 }
407 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408}
409
Guido van Rossume7737541994-09-05 07:31:41 +0000410static object *
411instance_getattr(inst, name)
412 register instanceobject *inst;
413 register char *name;
414{
415 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000416 res = instance_getattr1(inst, name);
417 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
418 object *args;
419#if 0
420 if (name[0] == '_' && name[1] == '_') {
421 int n = strlen(name);
422 if (name[n-1] == '_' && name[n-2] == '_') {
423 /* Don't mess with system attributes */
424 return NULL;
425 }
Guido van Rossume7737541994-09-05 07:31:41 +0000426 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000427#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000428 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000429 args = mkvalue("(Os)", inst, name);
430 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000431 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000432 res = call_object(func, args);
433 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000434 }
435 return res;
436}
437
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438static int
Guido van Rossume7737541994-09-05 07:31:41 +0000439instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000440 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441 char *name;
442 object *v;
443{
Guido van Rossum25831651993-05-19 14:50:45 +0000444 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000445 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000446 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000447 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000448 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000449 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000450 if (rv < 0)
451 err_setstr(AttributeError,
452 "delete non-existing instance attribute");
453 return rv;
454 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000456 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457}
458
Guido van Rossume7737541994-09-05 07:31:41 +0000459static int
460instance_setattr(inst, name, v)
461 instanceobject *inst;
462 char *name;
463 object *v;
464{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000465 object *func, *args, *res;
466 if (name[0] == '_' && name[1] == '_') {
467 int n = strlen(name);
468 if (name[n-1] == '_' && name[n-2] == '_') {
469 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000470 return -1;
471 }
Guido van Rossume7737541994-09-05 07:31:41 +0000472 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000473 if (v == NULL)
474 func = inst->in_class->cl_delattr;
475 else
476 func = inst->in_class->cl_setattr;
477 if (func == NULL)
478 return instance_setattr1(inst, name, v);
479 if (v == NULL)
480 args = mkvalue("(Os)", inst, name);
481 else
482 args = mkvalue("(OsO)", inst, name, v);
483 if (args == NULL)
484 return -1;
485 res = call_object(func, args);
486 DECREF(args);
487 if (res == NULL)
488 return -1;
489 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000490 return 0;
491}
492
Guido van Rossum9bfef441993-03-29 10:43:31 +0000493static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000494instance_repr(inst)
495 instanceobject *inst;
496{
497 object *func;
498 object *res;
499
500 func = instance_getattr(inst, "__repr__");
501 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000502 char buf[140];
503 object *classname = inst->in_class->cl_name;
504 char *cname;
505 if (classname != NULL && is_stringobject(classname))
506 cname = getstringvalue(classname);
507 else
508 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000509 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000510 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000511 return newstringobject(buf);
512 }
513 res = call_object(func, (object *)NULL);
514 DECREF(func);
515 return res;
516}
517
Guido van Rossum9bfef441993-03-29 10:43:31 +0000518static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000519instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000520 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000521{
Guido van Rossum03093a21994-09-28 15:51:32 +0000522 object *result;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000523 int outcome;
Guido van Rossum03093a21994-09-28 15:51:32 +0000524 result = instancebinop(inst, other, "__cmp__", "__rcmp__");
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000525 if (result == NULL) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000526 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000527 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000528 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000529 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000530 outcome = getintvalue(result);
531 DECREF(result);
532 if (outcome == -1 && err_occurred())
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000533 goto error;
Guido van Rossum03093a21994-09-28 15:51:32 +0000534 if (outcome < 0)
535 return -1;
536 else if (outcome > 0)
537 return 1;
538 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000539}
540
Guido van Rossum9bfef441993-03-29 10:43:31 +0000541static long
542instance_hash(inst)
543 instanceobject *inst;
544{
545 object *func;
546 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000547 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000548
549 func = instance_getattr(inst, "__hash__");
550 if (func == NULL) {
551 /* If there is no __cmp__ method, we hash on the address.
552 If a __cmp__ method exists, there must be a __hash__. */
553 err_clear();
554 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000555 if (func == NULL) {
556 err_clear();
557 outcome = (long)inst;
558 if (outcome == -1)
559 outcome = -2;
560 return outcome;
561 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000562 err_setstr(TypeError, "unhashable instance");
563 return -1;
564 }
565 res = call_object(func, (object *)NULL);
566 DECREF(func);
567 if (res == NULL)
568 return -1;
569 if (is_intobject(res)) {
570 outcome = getintvalue(res);
571 if (outcome == -1)
572 outcome = -2;
573 }
574 else {
575 err_setstr(TypeError, "__hash__() should return an int");
576 outcome = -1;
577 }
578 DECREF(res);
579 return outcome;
580}
581
582static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000583instance_length(inst)
584 instanceobject *inst;
585{
586 object *func;
587 object *res;
588 int outcome;
589
590 func = instance_getattr(inst, "__len__");
591 if (func == NULL)
592 return -1;
593 res = call_object(func, (object *)NULL);
594 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000595 if (res == NULL)
596 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000597 if (is_intobject(res)) {
598 outcome = getintvalue(res);
599 if (outcome < 0)
600 err_setstr(ValueError, "__len__() should return >= 0");
601 }
602 else {
603 err_setstr(TypeError, "__len__() should return an int");
604 outcome = -1;
605 }
606 DECREF(res);
607 return outcome;
608}
609
Guido van Rossum9bfef441993-03-29 10:43:31 +0000610static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000611instance_subscript(inst, key)
612 instanceobject *inst;
613 object *key;
614{
615 object *func;
616 object *arg;
617 object *res;
618
619 func = instance_getattr(inst, "__getitem__");
620 if (func == NULL)
621 return NULL;
622 arg = mkvalue("(O)", key);
623 if (arg == NULL) {
624 DECREF(func);
625 return NULL;
626 }
627 res = call_object(func, arg);
628 DECREF(func);
629 DECREF(arg);
630 return res;
631}
632
Guido van Rossum9bfef441993-03-29 10:43:31 +0000633static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000634instance_ass_subscript(inst, key, value)
635 instanceobject*inst;
636 object *key;
637 object *value;
638{
639 object *func;
640 object *arg;
641 object *res;
642
643 if (value == NULL)
644 func = instance_getattr(inst, "__delitem__");
645 else
646 func = instance_getattr(inst, "__setitem__");
647 if (func == NULL)
648 return -1;
649 if (value == NULL)
650 arg = mkvalue("(O)", key);
651 else
652 arg = mkvalue("(OO)", key, value);
653 if (arg == NULL) {
654 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000655 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000656 }
657 res = call_object(func, arg);
658 DECREF(func);
659 DECREF(arg);
660 if (res == NULL)
661 return -1;
662 DECREF(res);
663 return 0;
664}
665
Guido van Rossum9bfef441993-03-29 10:43:31 +0000666static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000667 (inquiry)instance_length, /*mp_length*/
668 (binaryfunc)instance_subscript, /*mp_subscript*/
669 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000670};
671
672static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000673instance_item(inst, i)
674 instanceobject *inst;
675 int i;
676{
677 object *func, *arg, *res;
678
679 func = instance_getattr(inst, "__getitem__");
680 if (func == NULL)
681 return NULL;
682 arg = newintobject((long)i);
683 if (arg == NULL) {
684 DECREF(func);
685 return NULL;
686 }
687 res = call_object(func, arg);
688 DECREF(func);
689 DECREF(arg);
690 return res;
691}
692
693static object *
694instance_slice(inst, i, j)
695 instanceobject *inst;
696 int i, j;
697{
698 object *func, *arg, *res;
699
700 func = instance_getattr(inst, "__getslice__");
701 if (func == NULL)
702 return NULL;
703 arg = mkvalue("(ii)", i, j);
704 if (arg == NULL) {
705 DECREF(func);
706 return NULL;
707 }
708 res = call_object(func, arg);
709 DECREF(func);
710 DECREF(arg);
711 return res;
712}
713
714static int
715instance_ass_item(inst, i, item)
716 instanceobject *inst;
717 int i;
718 object *item;
719{
720 object *func, *arg, *res;
721
722 if (item == NULL)
723 func = instance_getattr(inst, "__delitem__");
724 else
725 func = instance_getattr(inst, "__setitem__");
726 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000727 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000728 if (item == NULL)
729 arg = mkvalue("i", i);
730 else
731 arg = mkvalue("(iO)", i, item);
732 if (arg == NULL) {
733 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000734 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735 }
736 res = call_object(func, arg);
737 DECREF(func);
738 DECREF(arg);
739 if (res == NULL)
740 return -1;
741 DECREF(res);
742 return 0;
743}
744
745static int
746instance_ass_slice(inst, i, j, value)
747 instanceobject *inst;
748 int i, j;
749 object *value;
750{
751 object *func, *arg, *res;
752
753 if (value == NULL)
754 func = instance_getattr(inst, "__delslice__");
755 else
756 func = instance_getattr(inst, "__setslice__");
757 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000758 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000759 if (value == NULL)
760 arg = mkvalue("(ii)", i, j);
761 else
762 arg = mkvalue("(iiO)", i, j, value);
763 if (arg == NULL) {
764 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000765 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766 }
767 res = call_object(func, arg);
768 DECREF(func);
769 DECREF(arg);
770 if (res == NULL)
771 return -1;
772 DECREF(res);
773 return 0;
774}
775
776static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000777 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000778 0, /*sq_concat*/
779 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000780 (intargfunc)instance_item, /*sq_item*/
781 (intintargfunc)instance_slice, /*sq_slice*/
782 (intobjargproc)instance_ass_item, /*sq_ass_item*/
783 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000784};
785
786static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000787generic_unary_op(self, methodname)
788 instanceobject *self;
789 char *methodname;
790{
791 object *func, *res;
792
793 if ((func = instance_getattr(self, methodname)) == NULL)
794 return NULL;
795 res = call_object(func, (object *)NULL);
796 DECREF(func);
797 return res;
798}
799
Guido van Rossum03093a21994-09-28 15:51:32 +0000800
801/* Forward */
802static int halfbinop PROTO((object *, object *, char *, object **));
803
804
805/* Implement a binary operator involving at least one class instance. */
806
807object *
808instancebinop(v, w, opname, ropname)
809 object *v;
810 object *w;
811 char *opname;
812 char *ropname;
813{
814 char buf[256];
815 object *result = NULL;
816 if (halfbinop(v, w, opname, &result) <= 0)
817 return result;
818 if (halfbinop(w, v, ropname, &result) <= 0)
819 return result;
820 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
821 err_setstr(TypeError, buf);
822 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000823}
824
Guido van Rossum03093a21994-09-28 15:51:32 +0000825
826/* Try one half of a binary operator involving a class instance.
827 Return value:
828 -1 if an exception is to be reported right away
829 0 if we have a valid result
830 1 if we could try another operation
831*/
832
833static int
834halfbinop(v, w, opname, r_result)
835 object *v;
836 object *w;
837 char *opname;
838 object **r_result;
839{
840 object *func;
841 object *args;
842 object *coerce;
843 object *coerced = NULL;
844 object *v1;
845
846 if (!is_instanceobject(v))
847 return 1;
848 func = getattr(v, opname);
849 if (func == NULL) {
850 if (err_occurred() != AttributeError)
851 return -1;
852 err_clear();
853 return 1;
854 }
855 coerce = getattr(v, "__coerce__");
856 if (coerce == NULL) {
857 err_clear();
858 }
859 else {
860 args = mkvalue("(O)", w);
861 if (args == NULL) {
862 DECREF(func);
863 return -1;
864 }
865 coerced = call_object(coerce, args);
866 DECREF(args);
867 DECREF(coerce);
868 if (coerced == NULL) {
869 DECREF(func);
870 return -1;
871 }
872 if (coerced == None) {
873 DECREF(coerced);
874 DECREF(func);
875 return 1;
876 }
877 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
878 DECREF(coerced);
879 DECREF(func);
880 err_setstr(TypeError, "coercion should return None or 2-tuple");
881 return -1;
882 }
883 v1 = gettupleitem(coerced, 0);
884 if (v1 != v) {
885 v = v1;
886 DECREF(func);
887 func = getattr(v, opname);
888 if (func == NULL) {
889 XDECREF(coerced);
890 return -1;
891 }
892 }
893 w = gettupleitem(coerced, 1);
894 }
895 args = mkvalue("(O)", w);
896 if (args == NULL) {
897 DECREF(func);
898 XDECREF(coerced);
899 return -1;
900 }
901 *r_result = call_object(func, args);
902 DECREF(args);
903 DECREF(func);
904 XDECREF(coerced);
905 return *r_result == NULL ? -1 : 0;
906}
907
908
Guido van Rossum04691fc1992-08-12 15:35:34 +0000909#define UNARY(funcname, methodname) \
910static object *funcname(self) instanceobject *self; { \
911 return generic_unary_op(self, methodname); \
912}
913
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914UNARY(instance_neg, "__neg__")
915UNARY(instance_pos, "__pos__")
916UNARY(instance_abs, "__abs__")
917
Guido van Rossum9bfef441993-03-29 10:43:31 +0000918static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000919instance_nonzero(self)
920 instanceobject *self;
921{
922 object *func, *res;
923 long outcome;
924
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000925 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000926 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000927 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000928 err_clear();
929 /* Fall back to the default behavior:
930 all instances are nonzero */
931 return 1;
932 }
933 }
934 res = call_object(func, (object *)NULL);
935 DECREF(func);
936 if (res == NULL)
937 return -1;
938 if (!is_intobject(res)) {
939 DECREF(res);
940 err_setstr(TypeError, "__nonzero__ should return an int");
941 return -1;
942 }
943 outcome = getintvalue(res);
944 DECREF(res);
945 if (outcome < 0) {
946 err_setstr(ValueError, "__nonzero__ should return >= 0");
947 return -1;
948 }
949 return outcome > 0;
950}
951
952UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000953UNARY(instance_int, "__int__")
954UNARY(instance_long, "__long__")
955UNARY(instance_float, "__float__")
956UNARY(instance_oct, "__oct__")
957UNARY(instance_hex, "__hex__")
958
Guido van Rossum03093a21994-09-28 15:51:32 +0000959/* This version is for ternary calls only (z != None) */
960static object *
961instance_pow(v, w, z)
962 object *v;
963 object *w;
964 object *z;
965{
966 /* XXX Doesn't do coercions... */
967 object *func;
968 object *args;
969 object *result;
970 func = getattr(v, "__pow__");
971 if (func == NULL)
972 return NULL;
973 args = mkvalue("(OO)", w, z);
974 if (args == NULL) {
975 DECREF(func);
976 return NULL;
977 }
978 result = call_object(func, args);
979 DECREF(func);
980 DECREF(args);
981 return result;
982}
983
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +0000985 0, /*nb_add*/
986 0, /*nb_subtract*/
987 0, /*nb_multiply*/
988 0, /*nb_divide*/
989 0, /*nb_remainder*/
990 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000991 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000992 (unaryfunc)instance_neg, /*nb_negative*/
993 (unaryfunc)instance_pos, /*nb_positive*/
994 (unaryfunc)instance_abs, /*nb_absolute*/
995 (inquiry)instance_nonzero, /*nb_nonzero*/
996 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000997 0, /*nb_lshift*/
998 0, /*nb_rshift*/
999 0, /*nb_and*/
1000 0, /*nb_xor*/
1001 0, /*nb_or*/
1002 0, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003 (unaryfunc)instance_int, /*nb_int*/
1004 (unaryfunc)instance_long, /*nb_long*/
1005 (unaryfunc)instance_float, /*nb_float*/
1006 (unaryfunc)instance_oct, /*nb_oct*/
1007 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001008};
1009
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001010typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001011 OB_HEAD_INIT(&Typetype)
1012 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001013 "instance",
1014 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001015 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001016 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001017 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001018 (getattrfunc)instance_getattr, /*tp_getattr*/
1019 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001020 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 &instance_as_number, /*tp_as_number*/
1023 &instance_as_sequence, /*tp_as_sequence*/
1024 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001025 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001026};
1027
1028
Guido van Rossum81daa321993-05-20 14:24:46 +00001029/* Instance method objects are used for two purposes:
1030 (a) as bound instance methods (returned by instancename.methodname)
1031 (b) as unbound methods (returned by ClassName.methodname)
1032 In case (b), im_self is NULL
1033*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001034
1035typedef struct {
1036 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001037 object *im_func; /* The function implementing the method */
1038 object *im_self; /* The instance it is bound to, or NULL */
1039 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001040} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001041
1042object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001043newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044 object *func;
1045 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001046 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047{
Guido van Rossume8122f11991-05-05 20:03:07 +00001048 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001049 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001050 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001051 return NULL;
1052 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001053 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1054 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001055 return NULL;
1056 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001057 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001058 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001059 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001060 INCREF(class);
1061 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001062 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001063}
1064
1065object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001066instancemethodgetfunc(im)
1067 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068{
Guido van Rossume8122f11991-05-05 20:03:07 +00001069 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001070 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001071 return NULL;
1072 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001073 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001074}
1075
1076object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001077instancemethodgetself(im)
1078 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001079{
Guido van Rossume8122f11991-05-05 20:03:07 +00001080 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001081 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001082 return NULL;
1083 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001084 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085}
1086
Guido van Rossum81daa321993-05-20 14:24:46 +00001087object *
1088instancemethodgetclass(im)
1089 register object *im;
1090{
1091 if (!is_instancemethodobject(im)) {
1092 err_badcall();
1093 return NULL;
1094 }
1095 return ((instancemethodobject *)im)->im_class;
1096}
1097
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001098/* Class method methods */
1099
Guido van Rossume8122f11991-05-05 20:03:07 +00001100#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101
Guido van Rossume8122f11991-05-05 20:03:07 +00001102static struct memberlist instancemethod_memberlist[] = {
1103 {"im_func", T_OBJECT, OFF(im_func)},
1104 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001105 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001106 {NULL} /* Sentinel */
1107};
1108
1109static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001110instancemethod_getattr(im, name)
1111 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112 char *name;
1113{
Guido van Rossume8122f11991-05-05 20:03:07 +00001114 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001115}
1116
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001118instancemethod_dealloc(im)
1119 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120{
Guido van Rossume8122f11991-05-05 20:03:07 +00001121 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001122 XDECREF(im->im_self);
1123 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001124 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001125}
1126
Guido van Rossumebc8c511992-09-03 20:39:51 +00001127static int
1128instancemethod_compare(a, b)
1129 instancemethodobject *a, *b;
1130{
1131 int cmp = cmpobject(a->im_self, b->im_self);
1132 if (cmp == 0)
1133 cmp = cmpobject(a->im_func, b->im_func);
1134 return cmp;
1135}
1136
Guido van Rossum25831651993-05-19 14:50:45 +00001137static object *
1138instancemethod_repr(a)
1139 instancemethodobject *a;
1140{
1141 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001142 instanceobject *self = (instanceobject *)(a->im_self);
1143 funcobject *func = (funcobject *)(a->im_func);
1144 classobject *class = (classobject *)(a->im_class);
1145 object *fclassname, *iclassname, *funcname;
1146 char *fcname, *icname, *fname;
1147 fclassname = class->cl_name;
1148 funcname = func->func_name;
1149 if (fclassname != NULL && is_stringobject(fclassname))
1150 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001151 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001152 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001153 if (funcname != NULL && is_stringobject(funcname))
1154 fname = getstringvalue(funcname);
1155 else
1156 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001157 if (self == NULL)
1158 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1159 else {
1160 iclassname = self->in_class->cl_name;
1161 if (iclassname != NULL && is_stringobject(iclassname))
1162 icname = getstringvalue(iclassname);
1163 else
1164 icname = "?";
1165 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1166 fcname, fname, icname, (long)self);
1167 }
Guido van Rossum25831651993-05-19 14:50:45 +00001168 return newstringobject(buf);
1169}
1170
Guido van Rossum9bfef441993-03-29 10:43:31 +00001171static long
1172instancemethod_hash(a)
1173 instancemethodobject *a;
1174{
1175 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001176 if (a->im_self == NULL)
1177 x = hashobject(None);
1178 else
1179 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001180 if (x == -1)
1181 return -1;
1182 y = hashobject(a->im_func);
1183 if (y == -1)
1184 return -1;
1185 return x ^ y;
1186}
1187
Guido van Rossume8122f11991-05-05 20:03:07 +00001188typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189 OB_HEAD_INIT(&Typetype)
1190 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001191 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001192 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001194 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001195 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001196 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001198 (cmpfunc)instancemethod_compare, /*tp_compare*/
1199 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200 0, /*tp_as_number*/
1201 0, /*tp_as_sequence*/
1202 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001203 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001204};