blob: 9870b6e77e969fe7c3aa4e2ac80c9dcaa0b39b30 [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 Rossume7d444f1995-01-07 12:35:18 +000043 if (dictlookup(dict, "__doc__") == NULL) {
44 if (dictinsert(dict, "__doc__", None) < 0)
45 return NULL;
46 }
Guido van Rossume2966a61991-12-10 13:53:23 +000047 if (bases == NULL) {
48 bases = newtupleobject(0);
49 if (bases == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +000050 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000051 }
52 else
53 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000055 if (op == NULL) {
56 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000058 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 op->cl_bases = bases;
Guido van Rossum81daa321993-05-20 14:24:46 +000060 INCREF(dict);
61 op->cl_dict = dict;
Guido van Rossum94308391991-10-20 20:11:48 +000062 XINCREF(name);
63 op->cl_name = name;
Guido van Rossum52ca98a1994-09-05 07:32:29 +000064 op->cl_getattr = class_lookup(op, "__getattr__", &dummy);
65 op->cl_setattr = class_lookup(op, "__setattr__", &dummy);
66 op->cl_delattr = class_lookup(op, "__delattr__", &dummy);
67 XINCREF(op->cl_getattr);
68 XINCREF(op->cl_setattr);
69 XINCREF(op->cl_delattr);
Guido van Rossum81daa321993-05-20 14:24:46 +000070 pos = 0;
71 while (mappinggetnext(dict, &pos, &key, &value)) {
72 if (is_accessobject(value))
73 setaccessowner(value, (object *)op);
74 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 return (object *) op;
76}
77
78/* Class methods */
79
80static void
81class_dealloc(op)
82 classobject *op;
83{
Guido van Rossume2966a61991-12-10 13:53:23 +000084 DECREF(op->cl_bases);
Guido van Rossum81daa321993-05-20 14:24:46 +000085 DECREF(op->cl_dict);
Guido van Rossum94308391991-10-20 20:11:48 +000086 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 free((ANY *)op);
88}
89
90static object *
Guido van Rossum81daa321993-05-20 14:24:46 +000091class_lookup(cp, name, pclass)
92 classobject *cp;
93 char *name;
94 classobject **pclass;
95{
96 int i, n;
97 object *value = dictlookup(cp->cl_dict, name);
98 if (value != NULL) {
99 *pclass = cp;
100 return value;
101 }
102 n = gettuplesize(cp->cl_bases);
103 for (i = 0; i < n; i++) {
104 object *v = class_lookup((classobject *)
105 gettupleitem(cp->cl_bases, i), name, pclass);
106 if (v != NULL)
107 return v;
108 }
109 return NULL;
110}
111
112static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113class_getattr(op, name)
114 register classobject *op;
115 register char *name;
116{
117 register object *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118 classobject *class;
Guido van Rossum10393b11995-01-10 10:39:49 +0000119 if (name[0] == '_' && name[1] == '_') {
120 if (strcmp(name, "__dict__") == 0) {
121 if (getrestricted()) {
122 err_setstr(RuntimeError,
123 "class.__dict__ not accessible in restricted mode");
124 return NULL;
125 }
126 INCREF(op->cl_dict);
127 return op->cl_dict;
128 }
129 if (strcmp(name, "__bases__") == 0) {
130 INCREF(op->cl_bases);
131 return op->cl_bases;
132 }
133 if (strcmp(name, "__name__") == 0) {
134 if (op->cl_name == NULL)
135 v = None;
136 else
137 v = op->cl_name;
138 INCREF(v);
139 return v;
140 }
Guido van Rossum94308391991-10-20 20:11:48 +0000141 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000142 v = class_lookup(op, name, &class);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000143 if (v == NULL) {
144 err_setstr(AttributeError, name);
145 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000147 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000148 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000149 if (v == NULL)
150 return NULL;
151 }
152 else
153 INCREF(v);
154 if (is_funcobject(v)) {
155 object *w = newinstancemethodobject(v, (object *)NULL,
156 (object *)class);
157 DECREF(v);
158 v = w;
159 }
160 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
Guido van Rossum94308391991-10-20 20:11:48 +0000163static int
164class_setattr(op, name, v)
165 classobject *op;
166 char *name;
167 object *v;
168{
Guido van Rossum25831651993-05-19 14:50:45 +0000169 object *ac;
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000170 if (name[0] == '_' && name[1] == '_') {
171 int n = strlen(name);
172 if (name[n-1] == '_' && name[n-2] == '_') {
173 err_setstr(TypeError, "read-only special attribute");
174 return -1;
175 }
176 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000177 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000178 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000179 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000180 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000181 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000182 if (rv < 0)
183 err_setstr(AttributeError,
184 "delete non-existing class attribute");
185 return rv;
186 }
Guido van Rossum94308391991-10-20 20:11:48 +0000187 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000188 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000189}
190
Guido van Rossum25831651993-05-19 14:50:45 +0000191static object *
192class_repr(op)
193 classobject *op;
194{
195 char buf[140];
196 char *name;
197 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
198 name = "?";
199 else
200 name = getstringvalue(op->cl_name);
201 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
202 return newstringobject(buf);
203}
204
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205typeobject Classtype = {
206 OB_HEAD_INIT(&Typetype)
207 0,
208 "class",
209 sizeof(classobject),
210 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000213 (getattrfunc)class_getattr, /*tp_getattr*/
214 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000216 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 0, /*tp_as_number*/
218 0, /*tp_as_sequence*/
219 0, /*tp_as_mapping*/
220};
221
Guido van Rossum81daa321993-05-20 14:24:46 +0000222int
223issubclass(class, base)
224 object *class;
225 object *base;
226{
227 int i, n;
228 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000229 if (class == base)
230 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000231 if (class == NULL || !is_classobject(class))
232 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000233 cp = (classobject *)class;
234 n = gettuplesize(cp->cl_bases);
235 for (i = 0; i < n; i++) {
236 if (issubclass(gettupleitem(cp->cl_bases, i), base))
237 return 1;
238 }
239 return 0;
240}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241
Guido van Rossum81daa321993-05-20 14:24:46 +0000242
243/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244
Guido van Rossum81daa321993-05-20 14:24:46 +0000245static int
246addaccess(class, inst)
247 classobject *class;
248 instanceobject *inst;
249{
250 int i, n, pos, ret;
251 object *key, *value, *ac;
252
253 n = gettuplesize(class->cl_bases);
254 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000256 return -1;
257 }
258
259 pos = 0;
260 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
261 if (!is_accessobject(value))
262 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000263 if (hasaccessvalue(value))
264 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000265 ac = dict2lookup(inst->in_dict, key);
266 if (ac != NULL && is_accessobject(ac)) {
267 err_setval(ConflictError, key);
268 return -1;
269 }
270 ac = cloneaccessobject(value);
271 if (ac == NULL)
272 return -1;
273 ret = dict2insert(inst->in_dict, key, ac);
274 DECREF(ac);
275 if (ret != 0)
276 return -1;
277 }
278 return 0;
279}
280
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281object *
Guido van Rossum25831651993-05-19 14:50:45 +0000282newinstanceobject(class, arg)
283 object *class;
284 object *arg;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
Guido van Rossume8122f11991-05-05 20:03:07 +0000286 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000287 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000289 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 return NULL;
291 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000292 inst = NEWOBJ(instanceobject, &Instancetype);
293 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000296 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000297 inst->in_dict = newdictobject();
298 if (inst->in_dict == NULL ||
299 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000300 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301 return NULL;
302 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000303 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000304 if (init == NULL) {
305 err_clear();
306 if (arg != NULL && !(is_tupleobject(arg) &&
307 gettuplesize(arg) == 0)) {
308 err_setstr(TypeError,
309 "this classobject() takes no arguments");
310 DECREF(inst);
311 inst = NULL;
312 }
313 }
314 else {
315 object *res = call_object(init, arg);
316 DECREF(init);
317 if (res == NULL) {
318 DECREF(inst);
319 inst = NULL;
320 }
321 else {
322 if (res != None) {
323 err_setstr(TypeError,
324 "__init__() should return None");
325 DECREF(inst);
326 inst = NULL;
327 }
328 DECREF(res);
329 }
330 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000331 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332}
333
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000334/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335
336static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000337instance_dealloc(inst)
338 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000340 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000341 object *del;
342 /* Call the __del__ method if it exists. First temporarily
343 revive the object and save the current exception, if any. */
344 INCREF(inst);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000345 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000346 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000347 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000348 DECREF(del);
349 XDECREF(res);
350 /* XXX If __del__ raised an exception, it is ignored! */
351 }
352 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000353 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000354 /* Can't use DECREF here, it would cause a recursive call */
355 if (--inst->ob_refcnt > 0)
356 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000357 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000358 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000359 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360}
361
Guido van Rossume7737541994-09-05 07:31:41 +0000362static object *
363instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000364 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 register char *name;
366{
Guido van Rossum94308391991-10-20 20:11:48 +0000367 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000368 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000369 if (name[0] == '_' && name[1] == '_') {
370 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000371 if (getrestricted()) {
372 err_setstr(RuntimeError,
373 "instance.__dict__ not accessible in restricted mode");
374 return NULL;
375 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000376 INCREF(inst->in_dict);
377 return inst->in_dict;
378 }
379 if (strcmp(name, "__class__") == 0) {
380 INCREF(inst->in_class);
381 return (object *)inst->in_class;
382 }
Guido van Rossum94308391991-10-20 20:11:48 +0000383 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000384 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000385 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000386 if (v == NULL) {
387 v = class_lookup(inst->in_class, name, &class);
388 if (v == NULL) {
389 err_setstr(AttributeError, name);
390 return NULL;
391 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000393 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000394 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000395 if (v == NULL)
396 return NULL;
397 }
398 else
399 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000400 if (class != NULL) {
401 if (is_funcobject(v)) {
402 object *w = newinstancemethodobject(v, (object *)inst,
403 (object *)class);
404 DECREF(v);
405 v = w;
406 }
407 else if (is_instancemethodobject(v)) {
408 object *im_class = instancemethodgetclass(v);
409 /* Only if classes are compatible */
410 if (issubclass((object *)class, im_class)) {
411 object *im_func = instancemethodgetfunc(v);
412 object *w = newinstancemethodobject(im_func,
413 (object *)inst, im_class);
414 DECREF(v);
415 v = w;
416 }
417 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000418 }
419 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420}
421
Guido van Rossume7737541994-09-05 07:31:41 +0000422static object *
423instance_getattr(inst, name)
424 register instanceobject *inst;
425 register char *name;
426{
427 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000428 res = instance_getattr1(inst, name);
429 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
430 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000431 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000432 args = mkvalue("(Os)", inst, name);
433 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000434 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000435 res = call_object(func, args);
436 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000437 }
438 return res;
439}
440
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441static int
Guido van Rossume7737541994-09-05 07:31:41 +0000442instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000443 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 char *name;
445 object *v;
446{
Guido van Rossum25831651993-05-19 14:50:45 +0000447 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000448 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000449 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000450 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000451 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000452 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000453 if (rv < 0)
454 err_setstr(AttributeError,
455 "delete non-existing instance attribute");
456 return rv;
457 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000459 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460}
461
Guido van Rossume7737541994-09-05 07:31:41 +0000462static int
463instance_setattr(inst, name, v)
464 instanceobject *inst;
465 char *name;
466 object *v;
467{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000468 object *func, *args, *res;
469 if (name[0] == '_' && name[1] == '_') {
470 int n = strlen(name);
471 if (name[n-1] == '_' && name[n-2] == '_') {
472 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000473 return -1;
474 }
Guido van Rossume7737541994-09-05 07:31:41 +0000475 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000476 if (v == NULL)
477 func = inst->in_class->cl_delattr;
478 else
479 func = inst->in_class->cl_setattr;
480 if (func == NULL)
481 return instance_setattr1(inst, name, v);
482 if (v == NULL)
483 args = mkvalue("(Os)", inst, name);
484 else
485 args = mkvalue("(OsO)", inst, name, v);
486 if (args == NULL)
487 return -1;
488 res = call_object(func, args);
489 DECREF(args);
490 if (res == NULL)
491 return -1;
492 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000493 return 0;
494}
495
Guido van Rossum9bfef441993-03-29 10:43:31 +0000496static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000497instance_repr(inst)
498 instanceobject *inst;
499{
500 object *func;
501 object *res;
502
503 func = instance_getattr(inst, "__repr__");
504 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000505 char buf[140];
506 object *classname = inst->in_class->cl_name;
507 char *cname;
508 if (classname != NULL && is_stringobject(classname))
509 cname = getstringvalue(classname);
510 else
511 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000512 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000513 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000514 return newstringobject(buf);
515 }
516 res = call_object(func, (object *)NULL);
517 DECREF(func);
518 return res;
519}
520
Guido van Rossume7d444f1995-01-07 12:35:18 +0000521static object *
522instance_compare1(inst, other)
523 object *inst, *other;
524{
525 return instancebinop(inst, other, "__cmp__", "__rcmp__",
526 instance_compare1);
527}
528
Guido van Rossum9bfef441993-03-29 10:43:31 +0000529static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000530instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000531 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000532{
Guido van Rossum03093a21994-09-28 15:51:32 +0000533 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000534 long outcome;
535 result = instance_compare1(inst, other);
536 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000537 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000538 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000539 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000540 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000541 outcome = getintvalue(result);
542 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000543 if (outcome < 0)
544 return -1;
545 else if (outcome > 0)
546 return 1;
547 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000548}
549
Guido van Rossum9bfef441993-03-29 10:43:31 +0000550static long
551instance_hash(inst)
552 instanceobject *inst;
553{
554 object *func;
555 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000556 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000557
558 func = instance_getattr(inst, "__hash__");
559 if (func == NULL) {
560 /* If there is no __cmp__ method, we hash on the address.
561 If a __cmp__ method exists, there must be a __hash__. */
562 err_clear();
563 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000564 if (func == NULL) {
565 err_clear();
566 outcome = (long)inst;
567 if (outcome == -1)
568 outcome = -2;
569 return outcome;
570 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000571 err_setstr(TypeError, "unhashable instance");
572 return -1;
573 }
574 res = call_object(func, (object *)NULL);
575 DECREF(func);
576 if (res == NULL)
577 return -1;
578 if (is_intobject(res)) {
579 outcome = getintvalue(res);
580 if (outcome == -1)
581 outcome = -2;
582 }
583 else {
584 err_setstr(TypeError, "__hash__() should return an int");
585 outcome = -1;
586 }
587 DECREF(res);
588 return outcome;
589}
590
591static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000592instance_length(inst)
593 instanceobject *inst;
594{
595 object *func;
596 object *res;
597 int outcome;
598
599 func = instance_getattr(inst, "__len__");
600 if (func == NULL)
601 return -1;
602 res = call_object(func, (object *)NULL);
603 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000604 if (res == NULL)
605 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000606 if (is_intobject(res)) {
607 outcome = getintvalue(res);
608 if (outcome < 0)
609 err_setstr(ValueError, "__len__() should return >= 0");
610 }
611 else {
612 err_setstr(TypeError, "__len__() should return an int");
613 outcome = -1;
614 }
615 DECREF(res);
616 return outcome;
617}
618
Guido van Rossum9bfef441993-03-29 10:43:31 +0000619static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000620instance_subscript(inst, key)
621 instanceobject *inst;
622 object *key;
623{
624 object *func;
625 object *arg;
626 object *res;
627
628 func = instance_getattr(inst, "__getitem__");
629 if (func == NULL)
630 return NULL;
631 arg = mkvalue("(O)", key);
632 if (arg == NULL) {
633 DECREF(func);
634 return NULL;
635 }
636 res = call_object(func, arg);
637 DECREF(func);
638 DECREF(arg);
639 return res;
640}
641
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000643instance_ass_subscript(inst, key, value)
644 instanceobject*inst;
645 object *key;
646 object *value;
647{
648 object *func;
649 object *arg;
650 object *res;
651
652 if (value == NULL)
653 func = instance_getattr(inst, "__delitem__");
654 else
655 func = instance_getattr(inst, "__setitem__");
656 if (func == NULL)
657 return -1;
658 if (value == NULL)
659 arg = mkvalue("(O)", key);
660 else
661 arg = mkvalue("(OO)", key, value);
662 if (arg == NULL) {
663 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000664 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000665 }
666 res = call_object(func, arg);
667 DECREF(func);
668 DECREF(arg);
669 if (res == NULL)
670 return -1;
671 DECREF(res);
672 return 0;
673}
674
Guido van Rossum9bfef441993-03-29 10:43:31 +0000675static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000676 (inquiry)instance_length, /*mp_length*/
677 (binaryfunc)instance_subscript, /*mp_subscript*/
678 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000679};
680
681static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000682instance_item(inst, i)
683 instanceobject *inst;
684 int i;
685{
686 object *func, *arg, *res;
687
688 func = instance_getattr(inst, "__getitem__");
689 if (func == NULL)
690 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000691 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000692 if (arg == NULL) {
693 DECREF(func);
694 return NULL;
695 }
696 res = call_object(func, arg);
697 DECREF(func);
698 DECREF(arg);
699 return res;
700}
701
702static object *
703instance_slice(inst, i, j)
704 instanceobject *inst;
705 int i, j;
706{
707 object *func, *arg, *res;
708
709 func = instance_getattr(inst, "__getslice__");
710 if (func == NULL)
711 return NULL;
712 arg = mkvalue("(ii)", i, j);
713 if (arg == NULL) {
714 DECREF(func);
715 return NULL;
716 }
717 res = call_object(func, arg);
718 DECREF(func);
719 DECREF(arg);
720 return res;
721}
722
723static int
724instance_ass_item(inst, i, item)
725 instanceobject *inst;
726 int i;
727 object *item;
728{
729 object *func, *arg, *res;
730
731 if (item == NULL)
732 func = instance_getattr(inst, "__delitem__");
733 else
734 func = instance_getattr(inst, "__setitem__");
735 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000736 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000737 if (item == NULL)
738 arg = mkvalue("i", i);
739 else
740 arg = mkvalue("(iO)", i, item);
741 if (arg == NULL) {
742 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000743 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000744 }
745 res = call_object(func, arg);
746 DECREF(func);
747 DECREF(arg);
748 if (res == NULL)
749 return -1;
750 DECREF(res);
751 return 0;
752}
753
754static int
755instance_ass_slice(inst, i, j, value)
756 instanceobject *inst;
757 int i, j;
758 object *value;
759{
760 object *func, *arg, *res;
761
762 if (value == NULL)
763 func = instance_getattr(inst, "__delslice__");
764 else
765 func = instance_getattr(inst, "__setslice__");
766 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000767 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000768 if (value == NULL)
769 arg = mkvalue("(ii)", i, j);
770 else
771 arg = mkvalue("(iiO)", i, j, value);
772 if (arg == NULL) {
773 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000774 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000775 }
776 res = call_object(func, arg);
777 DECREF(func);
778 DECREF(arg);
779 if (res == NULL)
780 return -1;
781 DECREF(res);
782 return 0;
783}
784
785static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000786 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000787 0, /*sq_concat*/
788 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000789 (intargfunc)instance_item, /*sq_item*/
790 (intintargfunc)instance_slice, /*sq_slice*/
791 (intobjargproc)instance_ass_item, /*sq_ass_item*/
792 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000793};
794
795static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796generic_unary_op(self, methodname)
797 instanceobject *self;
798 char *methodname;
799{
800 object *func, *res;
801
802 if ((func = instance_getattr(self, methodname)) == NULL)
803 return NULL;
804 res = call_object(func, (object *)NULL);
805 DECREF(func);
806 return res;
807}
808
Guido van Rossum03093a21994-09-28 15:51:32 +0000809
810/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000811static int halfbinop PROTO((object *, object *, char *, object **,
812 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000813
814
815/* Implement a binary operator involving at least one class instance. */
816
817object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000818instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000819 object *v;
820 object *w;
821 char *opname;
822 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000823 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000824{
825 char buf[256];
826 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000827 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000828 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000829 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000830 return result;
831 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
832 err_setstr(TypeError, buf);
833 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000834}
835
Guido van Rossum03093a21994-09-28 15:51:32 +0000836
837/* Try one half of a binary operator involving a class instance.
838 Return value:
839 -1 if an exception is to be reported right away
840 0 if we have a valid result
841 1 if we could try another operation
842*/
843
844static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000845halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000846 object *v;
847 object *w;
848 char *opname;
849 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000850 object * (*thisfunc) PROTO((object *, object *));
851 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000852{
853 object *func;
854 object *args;
855 object *coerce;
856 object *coerced = NULL;
857 object *v1;
858
859 if (!is_instanceobject(v))
860 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000861 coerce = getattr(v, "__coerce__");
862 if (coerce == NULL) {
863 err_clear();
864 }
865 else {
866 args = mkvalue("(O)", w);
867 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000868 return -1;
869 }
870 coerced = call_object(coerce, args);
871 DECREF(args);
872 DECREF(coerce);
873 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000874 return -1;
875 }
876 if (coerced == None) {
877 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000878 return 1;
879 }
880 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
881 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000882 err_setstr(TypeError,
883 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000884 return -1;
885 }
886 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000887 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000888 if (v1 != v) {
889 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000890 if (!is_instanceobject(v) && !is_instanceobject(w)) {
891 if (swapped)
892 *r_result = (*thisfunc)(w, v);
893 else
894 *r_result = (*thisfunc)(v, w);
895 DECREF(coerced);
896 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000897 }
898 }
899 w = gettupleitem(coerced, 1);
900 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000901 func = getattr(v, opname);
902 if (func == NULL) {
903 XDECREF(coerced);
904 if (err_occurred() != AttributeError)
905 return -1;
906 err_clear();
907 return 1;
908 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000909 args = mkvalue("(O)", w);
910 if (args == NULL) {
911 DECREF(func);
912 XDECREF(coerced);
913 return -1;
914 }
915 *r_result = call_object(func, args);
916 DECREF(args);
917 DECREF(func);
918 XDECREF(coerced);
919 return *r_result == NULL ? -1 : 0;
920}
921
Guido van Rossum879c5811995-01-10 15:24:06 +0000922static int
923instance_coerce(pv, pw)
924 object **pv;
925 object **pw;
926{
927 object *v = *pv;
928 object *w = *pw;
929 object *coerce;
930 object *args;
931 object *coerced;
932
933 coerce = getattr(v, "__coerce__");
934 if (coerce == NULL) {
935 /* No __coerce__ method: always OK */
936 err_clear();
937 INCREF(v);
938 INCREF(w);
939 return 0;
940 }
941 /* Has __coerce__ method: call it */
942 args = mkvalue("(O)", w);
943 if (args == NULL) {
944 return -1;
945 }
946 coerced = call_object(coerce, args);
947 DECREF(args);
948 DECREF(coerce);
949 if (coerced == NULL) {
950 /* __coerce__ call raised an exception */
951 return -1;
952 }
953 if (coerced == None) {
954 /* __coerce__ says "I can't do it" */
955 DECREF(coerced);
956 return 1;
957 }
958 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
959 /* __coerce__ return value is malformed */
960 DECREF(coerced);
961 err_setstr(TypeError,
962 "coercion should return None or 2-tuple");
963 return -1;
964 }
965 /* __coerce__ returned two new values */
966 *pv = gettupleitem(coerced, 0);
967 *pw = gettupleitem(coerced, 1);
968 INCREF(*pv);
969 INCREF(*pw);
970 DECREF(coerced);
971 return 0;
972}
973
Guido van Rossum03093a21994-09-28 15:51:32 +0000974
Guido van Rossum04691fc1992-08-12 15:35:34 +0000975#define UNARY(funcname, methodname) \
976static object *funcname(self) instanceobject *self; { \
977 return generic_unary_op(self, methodname); \
978}
979
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980UNARY(instance_neg, "__neg__")
981UNARY(instance_pos, "__pos__")
982UNARY(instance_abs, "__abs__")
983
Guido van Rossum9bfef441993-03-29 10:43:31 +0000984static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985instance_nonzero(self)
986 instanceobject *self;
987{
988 object *func, *res;
989 long outcome;
990
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000991 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000992 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000993 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000994 err_clear();
995 /* Fall back to the default behavior:
996 all instances are nonzero */
997 return 1;
998 }
999 }
1000 res = call_object(func, (object *)NULL);
1001 DECREF(func);
1002 if (res == NULL)
1003 return -1;
1004 if (!is_intobject(res)) {
1005 DECREF(res);
1006 err_setstr(TypeError, "__nonzero__ should return an int");
1007 return -1;
1008 }
1009 outcome = getintvalue(res);
1010 DECREF(res);
1011 if (outcome < 0) {
1012 err_setstr(ValueError, "__nonzero__ should return >= 0");
1013 return -1;
1014 }
1015 return outcome > 0;
1016}
1017
1018UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001019UNARY(instance_int, "__int__")
1020UNARY(instance_long, "__long__")
1021UNARY(instance_float, "__float__")
1022UNARY(instance_oct, "__oct__")
1023UNARY(instance_hex, "__hex__")
1024
Guido van Rossum03093a21994-09-28 15:51:32 +00001025/* This version is for ternary calls only (z != None) */
1026static object *
1027instance_pow(v, w, z)
1028 object *v;
1029 object *w;
1030 object *z;
1031{
1032 /* XXX Doesn't do coercions... */
1033 object *func;
1034 object *args;
1035 object *result;
1036 func = getattr(v, "__pow__");
1037 if (func == NULL)
1038 return NULL;
1039 args = mkvalue("(OO)", w, z);
1040 if (args == NULL) {
1041 DECREF(func);
1042 return NULL;
1043 }
1044 result = call_object(func, args);
1045 DECREF(func);
1046 DECREF(args);
1047 return result;
1048}
1049
Guido van Rossum04691fc1992-08-12 15:35:34 +00001050static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001051 0, /*nb_add*/
1052 0, /*nb_subtract*/
1053 0, /*nb_multiply*/
1054 0, /*nb_divide*/
1055 0, /*nb_remainder*/
1056 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001057 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001058 (unaryfunc)instance_neg, /*nb_negative*/
1059 (unaryfunc)instance_pos, /*nb_positive*/
1060 (unaryfunc)instance_abs, /*nb_absolute*/
1061 (inquiry)instance_nonzero, /*nb_nonzero*/
1062 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001063 0, /*nb_lshift*/
1064 0, /*nb_rshift*/
1065 0, /*nb_and*/
1066 0, /*nb_xor*/
1067 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001068 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001069 (unaryfunc)instance_int, /*nb_int*/
1070 (unaryfunc)instance_long, /*nb_long*/
1071 (unaryfunc)instance_float, /*nb_float*/
1072 (unaryfunc)instance_oct, /*nb_oct*/
1073 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074};
1075
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001076typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001077 OB_HEAD_INIT(&Typetype)
1078 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001079 "instance",
1080 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001081 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001082 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001083 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001084 (getattrfunc)instance_getattr, /*tp_getattr*/
1085 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001086 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001087 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088 &instance_as_number, /*tp_as_number*/
1089 &instance_as_sequence, /*tp_as_sequence*/
1090 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001091 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001092};
1093
1094
Guido van Rossum81daa321993-05-20 14:24:46 +00001095/* Instance method objects are used for two purposes:
1096 (a) as bound instance methods (returned by instancename.methodname)
1097 (b) as unbound methods (returned by ClassName.methodname)
1098 In case (b), im_self is NULL
1099*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001100
1101typedef struct {
1102 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001103 object *im_func; /* The function implementing the method */
1104 object *im_self; /* The instance it is bound to, or NULL */
1105 object *im_class; /* The class that defined the method */
Guido van Rossume7d444f1995-01-07 12:35:18 +00001106 object *im_doc; /* The documentation string */
Guido van Rossume8122f11991-05-05 20:03:07 +00001107} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001108
1109object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001110newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001111 object *func;
1112 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001113 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114{
Guido van Rossume8122f11991-05-05 20:03:07 +00001115 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001117 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001118 return NULL;
1119 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001120 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1121 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122 return NULL;
1123 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001124 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001125 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001126 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001127 INCREF(class);
1128 im->im_class = class;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001129 XINCREF(((funcobject *)func)->func_doc);
1130 im->im_doc = ((funcobject *)func)->func_doc;
Guido van Rossume8122f11991-05-05 20:03:07 +00001131 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001132}
1133
1134object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001135instancemethodgetfunc(im)
1136 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137{
Guido van Rossume8122f11991-05-05 20:03:07 +00001138 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001139 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001140 return NULL;
1141 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001142 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143}
1144
1145object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001146instancemethodgetself(im)
1147 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001148{
Guido van Rossume8122f11991-05-05 20:03:07 +00001149 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001150 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001151 return NULL;
1152 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001153 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001154}
1155
Guido van Rossum81daa321993-05-20 14:24:46 +00001156object *
1157instancemethodgetclass(im)
1158 register object *im;
1159{
1160 if (!is_instancemethodobject(im)) {
1161 err_badcall();
1162 return NULL;
1163 }
1164 return ((instancemethodobject *)im)->im_class;
1165}
1166
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001167/* Class method methods */
1168
Guido van Rossume8122f11991-05-05 20:03:07 +00001169#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001170
Guido van Rossume8122f11991-05-05 20:03:07 +00001171static struct memberlist instancemethod_memberlist[] = {
1172 {"im_func", T_OBJECT, OFF(im_func)},
1173 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001174 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossume7d444f1995-01-07 12:35:18 +00001175 {"im_doc", T_OBJECT, OFF(im_doc)},
1176 {"__doc__", T_OBJECT, OFF(im_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177 {NULL} /* Sentinel */
1178};
1179
1180static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001181instancemethod_getattr(im, name)
1182 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183 char *name;
1184{
Guido van Rossum10393b11995-01-10 10:39:49 +00001185 if (name[0] != '_' && getrestricted()) {
1186 err_setstr(RuntimeError,
1187 "instance-method attributes not accessible in restricted mode");
1188 return NULL;
1189 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001190 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001191}
1192
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001194instancemethod_dealloc(im)
1195 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001196{
Guido van Rossume8122f11991-05-05 20:03:07 +00001197 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001198 XDECREF(im->im_self);
1199 DECREF(im->im_class);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001200 XDECREF(im->im_doc);
Guido van Rossume8122f11991-05-05 20:03:07 +00001201 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001202}
1203
Guido van Rossumebc8c511992-09-03 20:39:51 +00001204static int
1205instancemethod_compare(a, b)
1206 instancemethodobject *a, *b;
1207{
Guido van Rossume9df7271995-04-06 14:46:51 +00001208 if (a->im_self != b->im_self)
1209 return (a->im_self < b->im_self) ? -1 : 1;
1210 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001211}
1212
Guido van Rossum25831651993-05-19 14:50:45 +00001213static object *
1214instancemethod_repr(a)
1215 instancemethodobject *a;
1216{
1217 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001218 instanceobject *self = (instanceobject *)(a->im_self);
1219 funcobject *func = (funcobject *)(a->im_func);
1220 classobject *class = (classobject *)(a->im_class);
1221 object *fclassname, *iclassname, *funcname;
1222 char *fcname, *icname, *fname;
1223 fclassname = class->cl_name;
1224 funcname = func->func_name;
1225 if (fclassname != NULL && is_stringobject(fclassname))
1226 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001227 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001228 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001229 if (funcname != NULL && is_stringobject(funcname))
1230 fname = getstringvalue(funcname);
1231 else
1232 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001233 if (self == NULL)
1234 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1235 else {
1236 iclassname = self->in_class->cl_name;
1237 if (iclassname != NULL && is_stringobject(iclassname))
1238 icname = getstringvalue(iclassname);
1239 else
1240 icname = "?";
1241 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1242 fcname, fname, icname, (long)self);
1243 }
Guido van Rossum25831651993-05-19 14:50:45 +00001244 return newstringobject(buf);
1245}
1246
Guido van Rossum9bfef441993-03-29 10:43:31 +00001247static long
1248instancemethod_hash(a)
1249 instancemethodobject *a;
1250{
1251 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001252 if (a->im_self == NULL)
1253 x = hashobject(None);
1254 else
1255 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001256 if (x == -1)
1257 return -1;
1258 y = hashobject(a->im_func);
1259 if (y == -1)
1260 return -1;
1261 return x ^ y;
1262}
1263
Guido van Rossume8122f11991-05-05 20:03:07 +00001264typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001265 OB_HEAD_INIT(&Typetype)
1266 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001267 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001268 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001269 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001270 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001271 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001272 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001273 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001274 (cmpfunc)instancemethod_compare, /*tp_compare*/
1275 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001276 0, /*tp_as_number*/
1277 0, /*tp_as_sequence*/
1278 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001279 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001280};