blob: fd9da23e1a1b413861f1665709939fffe7b318b5 [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 Rossum25831651993-05-19 14:50:45 +0000347 object *args = newtupleobject(0);
348 object *res = args;
349 if (res != NULL)
350 res = call_object(del, args);
351 XDECREF(args);
352 DECREF(del);
353 XDECREF(res);
354 /* XXX If __del__ raised an exception, it is ignored! */
355 }
356 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000357 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000358 /* Can't use DECREF here, it would cause a recursive call */
359 if (--inst->ob_refcnt > 0)
360 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000361 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000362 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000363 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364}
365
Guido van Rossume7737541994-09-05 07:31:41 +0000366static object *
367instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000368 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 register char *name;
370{
Guido van Rossum94308391991-10-20 20:11:48 +0000371 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000372 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000373 if (name[0] == '_' && name[1] == '_') {
374 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000375 if (getrestricted()) {
376 err_setstr(RuntimeError,
377 "instance.__dict__ not accessible in restricted mode");
378 return NULL;
379 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000380 INCREF(inst->in_dict);
381 return inst->in_dict;
382 }
383 if (strcmp(name, "__class__") == 0) {
384 INCREF(inst->in_class);
385 return (object *)inst->in_class;
386 }
Guido van Rossum94308391991-10-20 20:11:48 +0000387 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000388 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000389 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000390 if (v == NULL) {
391 v = class_lookup(inst->in_class, name, &class);
392 if (v == NULL) {
393 err_setstr(AttributeError, name);
394 return NULL;
395 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000397 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000398 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000399 if (v == NULL)
400 return NULL;
401 }
402 else
403 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000404 if (class != NULL) {
405 if (is_funcobject(v)) {
406 object *w = newinstancemethodobject(v, (object *)inst,
407 (object *)class);
408 DECREF(v);
409 v = w;
410 }
411 else if (is_instancemethodobject(v)) {
412 object *im_class = instancemethodgetclass(v);
413 /* Only if classes are compatible */
414 if (issubclass((object *)class, im_class)) {
415 object *im_func = instancemethodgetfunc(v);
416 object *w = newinstancemethodobject(im_func,
417 (object *)inst, im_class);
418 DECREF(v);
419 v = w;
420 }
421 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000422 }
423 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424}
425
Guido van Rossume7737541994-09-05 07:31:41 +0000426static object *
427instance_getattr(inst, name)
428 register instanceobject *inst;
429 register char *name;
430{
431 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000432 res = instance_getattr1(inst, name);
433 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
434 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000435 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000436 args = mkvalue("(Os)", inst, name);
437 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000438 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000439 res = call_object(func, args);
440 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000441 }
442 return res;
443}
444
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445static int
Guido van Rossume7737541994-09-05 07:31:41 +0000446instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000447 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448 char *name;
449 object *v;
450{
Guido van Rossum25831651993-05-19 14:50:45 +0000451 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000452 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000453 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000454 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000455 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000456 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000457 if (rv < 0)
458 err_setstr(AttributeError,
459 "delete non-existing instance attribute");
460 return rv;
461 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000463 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464}
465
Guido van Rossume7737541994-09-05 07:31:41 +0000466static int
467instance_setattr(inst, name, v)
468 instanceobject *inst;
469 char *name;
470 object *v;
471{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000472 object *func, *args, *res;
473 if (name[0] == '_' && name[1] == '_') {
474 int n = strlen(name);
475 if (name[n-1] == '_' && name[n-2] == '_') {
476 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000477 return -1;
478 }
Guido van Rossume7737541994-09-05 07:31:41 +0000479 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000480 if (v == NULL)
481 func = inst->in_class->cl_delattr;
482 else
483 func = inst->in_class->cl_setattr;
484 if (func == NULL)
485 return instance_setattr1(inst, name, v);
486 if (v == NULL)
487 args = mkvalue("(Os)", inst, name);
488 else
489 args = mkvalue("(OsO)", inst, name, v);
490 if (args == NULL)
491 return -1;
492 res = call_object(func, args);
493 DECREF(args);
494 if (res == NULL)
495 return -1;
496 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000497 return 0;
498}
499
Guido van Rossum9bfef441993-03-29 10:43:31 +0000500static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000501instance_repr(inst)
502 instanceobject *inst;
503{
504 object *func;
505 object *res;
506
507 func = instance_getattr(inst, "__repr__");
508 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000509 char buf[140];
510 object *classname = inst->in_class->cl_name;
511 char *cname;
512 if (classname != NULL && is_stringobject(classname))
513 cname = getstringvalue(classname);
514 else
515 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000516 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000517 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000518 return newstringobject(buf);
519 }
520 res = call_object(func, (object *)NULL);
521 DECREF(func);
522 return res;
523}
524
Guido van Rossume7d444f1995-01-07 12:35:18 +0000525static object *
526instance_compare1(inst, other)
527 object *inst, *other;
528{
529 return instancebinop(inst, other, "__cmp__", "__rcmp__",
530 instance_compare1);
531}
532
Guido van Rossum9bfef441993-03-29 10:43:31 +0000533static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000534instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000535 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000536{
Guido van Rossum03093a21994-09-28 15:51:32 +0000537 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000538 long outcome;
539 result = instance_compare1(inst, other);
540 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000541 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000542 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000543 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000544 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000545 outcome = getintvalue(result);
546 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000547 if (outcome < 0)
548 return -1;
549 else if (outcome > 0)
550 return 1;
551 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000552}
553
Guido van Rossum9bfef441993-03-29 10:43:31 +0000554static long
555instance_hash(inst)
556 instanceobject *inst;
557{
558 object *func;
559 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000560 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000561
562 func = instance_getattr(inst, "__hash__");
563 if (func == NULL) {
564 /* If there is no __cmp__ method, we hash on the address.
565 If a __cmp__ method exists, there must be a __hash__. */
566 err_clear();
567 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000568 if (func == NULL) {
569 err_clear();
570 outcome = (long)inst;
571 if (outcome == -1)
572 outcome = -2;
573 return outcome;
574 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000575 err_setstr(TypeError, "unhashable instance");
576 return -1;
577 }
578 res = call_object(func, (object *)NULL);
579 DECREF(func);
580 if (res == NULL)
581 return -1;
582 if (is_intobject(res)) {
583 outcome = getintvalue(res);
584 if (outcome == -1)
585 outcome = -2;
586 }
587 else {
588 err_setstr(TypeError, "__hash__() should return an int");
589 outcome = -1;
590 }
591 DECREF(res);
592 return outcome;
593}
594
595static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000596instance_length(inst)
597 instanceobject *inst;
598{
599 object *func;
600 object *res;
601 int outcome;
602
603 func = instance_getattr(inst, "__len__");
604 if (func == NULL)
605 return -1;
606 res = call_object(func, (object *)NULL);
607 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000608 if (res == NULL)
609 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000610 if (is_intobject(res)) {
611 outcome = getintvalue(res);
612 if (outcome < 0)
613 err_setstr(ValueError, "__len__() should return >= 0");
614 }
615 else {
616 err_setstr(TypeError, "__len__() should return an int");
617 outcome = -1;
618 }
619 DECREF(res);
620 return outcome;
621}
622
Guido van Rossum9bfef441993-03-29 10:43:31 +0000623static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000624instance_subscript(inst, key)
625 instanceobject *inst;
626 object *key;
627{
628 object *func;
629 object *arg;
630 object *res;
631
632 func = instance_getattr(inst, "__getitem__");
633 if (func == NULL)
634 return NULL;
635 arg = mkvalue("(O)", key);
636 if (arg == NULL) {
637 DECREF(func);
638 return NULL;
639 }
640 res = call_object(func, arg);
641 DECREF(func);
642 DECREF(arg);
643 return res;
644}
645
Guido van Rossum9bfef441993-03-29 10:43:31 +0000646static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000647instance_ass_subscript(inst, key, value)
648 instanceobject*inst;
649 object *key;
650 object *value;
651{
652 object *func;
653 object *arg;
654 object *res;
655
656 if (value == NULL)
657 func = instance_getattr(inst, "__delitem__");
658 else
659 func = instance_getattr(inst, "__setitem__");
660 if (func == NULL)
661 return -1;
662 if (value == NULL)
663 arg = mkvalue("(O)", key);
664 else
665 arg = mkvalue("(OO)", key, value);
666 if (arg == NULL) {
667 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000668 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000669 }
670 res = call_object(func, arg);
671 DECREF(func);
672 DECREF(arg);
673 if (res == NULL)
674 return -1;
675 DECREF(res);
676 return 0;
677}
678
Guido van Rossum9bfef441993-03-29 10:43:31 +0000679static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000680 (inquiry)instance_length, /*mp_length*/
681 (binaryfunc)instance_subscript, /*mp_subscript*/
682 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000683};
684
685static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000686instance_item(inst, i)
687 instanceobject *inst;
688 int i;
689{
690 object *func, *arg, *res;
691
692 func = instance_getattr(inst, "__getitem__");
693 if (func == NULL)
694 return NULL;
695 arg = newintobject((long)i);
696 if (arg == NULL) {
697 DECREF(func);
698 return NULL;
699 }
700 res = call_object(func, arg);
701 DECREF(func);
702 DECREF(arg);
703 return res;
704}
705
706static object *
707instance_slice(inst, i, j)
708 instanceobject *inst;
709 int i, j;
710{
711 object *func, *arg, *res;
712
713 func = instance_getattr(inst, "__getslice__");
714 if (func == NULL)
715 return NULL;
716 arg = mkvalue("(ii)", i, j);
717 if (arg == NULL) {
718 DECREF(func);
719 return NULL;
720 }
721 res = call_object(func, arg);
722 DECREF(func);
723 DECREF(arg);
724 return res;
725}
726
727static int
728instance_ass_item(inst, i, item)
729 instanceobject *inst;
730 int i;
731 object *item;
732{
733 object *func, *arg, *res;
734
735 if (item == NULL)
736 func = instance_getattr(inst, "__delitem__");
737 else
738 func = instance_getattr(inst, "__setitem__");
739 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000740 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000741 if (item == NULL)
742 arg = mkvalue("i", i);
743 else
744 arg = mkvalue("(iO)", i, item);
745 if (arg == NULL) {
746 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000747 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000748 }
749 res = call_object(func, arg);
750 DECREF(func);
751 DECREF(arg);
752 if (res == NULL)
753 return -1;
754 DECREF(res);
755 return 0;
756}
757
758static int
759instance_ass_slice(inst, i, j, value)
760 instanceobject *inst;
761 int i, j;
762 object *value;
763{
764 object *func, *arg, *res;
765
766 if (value == NULL)
767 func = instance_getattr(inst, "__delslice__");
768 else
769 func = instance_getattr(inst, "__setslice__");
770 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000771 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772 if (value == NULL)
773 arg = mkvalue("(ii)", i, j);
774 else
775 arg = mkvalue("(iiO)", i, j, value);
776 if (arg == NULL) {
777 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000778 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000779 }
780 res = call_object(func, arg);
781 DECREF(func);
782 DECREF(arg);
783 if (res == NULL)
784 return -1;
785 DECREF(res);
786 return 0;
787}
788
789static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000791 0, /*sq_concat*/
792 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000793 (intargfunc)instance_item, /*sq_item*/
794 (intintargfunc)instance_slice, /*sq_slice*/
795 (intobjargproc)instance_ass_item, /*sq_ass_item*/
796 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797};
798
799static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800generic_unary_op(self, methodname)
801 instanceobject *self;
802 char *methodname;
803{
804 object *func, *res;
805
806 if ((func = instance_getattr(self, methodname)) == NULL)
807 return NULL;
808 res = call_object(func, (object *)NULL);
809 DECREF(func);
810 return res;
811}
812
Guido van Rossum03093a21994-09-28 15:51:32 +0000813
814/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000815static int halfbinop PROTO((object *, object *, char *, object **,
816 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000817
818
819/* Implement a binary operator involving at least one class instance. */
820
821object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000822instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000823 object *v;
824 object *w;
825 char *opname;
826 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000827 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000828{
829 char buf[256];
830 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000831 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000832 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000833 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000834 return result;
835 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
836 err_setstr(TypeError, buf);
837 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000838}
839
Guido van Rossum03093a21994-09-28 15:51:32 +0000840
841/* Try one half of a binary operator involving a class instance.
842 Return value:
843 -1 if an exception is to be reported right away
844 0 if we have a valid result
845 1 if we could try another operation
846*/
847
848static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000849halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000850 object *v;
851 object *w;
852 char *opname;
853 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000854 object * (*thisfunc) PROTO((object *, object *));
855 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000856{
857 object *func;
858 object *args;
859 object *coerce;
860 object *coerced = NULL;
861 object *v1;
862
863 if (!is_instanceobject(v))
864 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000865 coerce = getattr(v, "__coerce__");
866 if (coerce == NULL) {
867 err_clear();
868 }
869 else {
870 args = mkvalue("(O)", w);
871 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000872 return -1;
873 }
874 coerced = call_object(coerce, args);
875 DECREF(args);
876 DECREF(coerce);
877 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000878 return -1;
879 }
880 if (coerced == None) {
881 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000882 return 1;
883 }
884 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
885 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000886 err_setstr(TypeError,
887 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000888 return -1;
889 }
890 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000891 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000892 if (v1 != v) {
893 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000894 if (!is_instanceobject(v) && !is_instanceobject(w)) {
895 if (swapped)
896 *r_result = (*thisfunc)(w, v);
897 else
898 *r_result = (*thisfunc)(v, w);
899 DECREF(coerced);
900 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000901 }
902 }
903 w = gettupleitem(coerced, 1);
904 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000905 func = getattr(v, opname);
906 if (func == NULL) {
907 XDECREF(coerced);
908 if (err_occurred() != AttributeError)
909 return -1;
910 err_clear();
911 return 1;
912 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000913 args = mkvalue("(O)", w);
914 if (args == NULL) {
915 DECREF(func);
916 XDECREF(coerced);
917 return -1;
918 }
919 *r_result = call_object(func, args);
920 DECREF(args);
921 DECREF(func);
922 XDECREF(coerced);
923 return *r_result == NULL ? -1 : 0;
924}
925
Guido van Rossum879c5811995-01-10 15:24:06 +0000926static int
927instance_coerce(pv, pw)
928 object **pv;
929 object **pw;
930{
931 object *v = *pv;
932 object *w = *pw;
933 object *coerce;
934 object *args;
935 object *coerced;
936
937 coerce = getattr(v, "__coerce__");
938 if (coerce == NULL) {
939 /* No __coerce__ method: always OK */
940 err_clear();
941 INCREF(v);
942 INCREF(w);
943 return 0;
944 }
945 /* Has __coerce__ method: call it */
946 args = mkvalue("(O)", w);
947 if (args == NULL) {
948 return -1;
949 }
950 coerced = call_object(coerce, args);
951 DECREF(args);
952 DECREF(coerce);
953 if (coerced == NULL) {
954 /* __coerce__ call raised an exception */
955 return -1;
956 }
957 if (coerced == None) {
958 /* __coerce__ says "I can't do it" */
959 DECREF(coerced);
960 return 1;
961 }
962 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
963 /* __coerce__ return value is malformed */
964 DECREF(coerced);
965 err_setstr(TypeError,
966 "coercion should return None or 2-tuple");
967 return -1;
968 }
969 /* __coerce__ returned two new values */
970 *pv = gettupleitem(coerced, 0);
971 *pw = gettupleitem(coerced, 1);
972 INCREF(*pv);
973 INCREF(*pw);
974 DECREF(coerced);
975 return 0;
976}
977
Guido van Rossum03093a21994-09-28 15:51:32 +0000978
Guido van Rossum04691fc1992-08-12 15:35:34 +0000979#define UNARY(funcname, methodname) \
980static object *funcname(self) instanceobject *self; { \
981 return generic_unary_op(self, methodname); \
982}
983
Guido van Rossum04691fc1992-08-12 15:35:34 +0000984UNARY(instance_neg, "__neg__")
985UNARY(instance_pos, "__pos__")
986UNARY(instance_abs, "__abs__")
987
Guido van Rossum9bfef441993-03-29 10:43:31 +0000988static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000989instance_nonzero(self)
990 instanceobject *self;
991{
992 object *func, *res;
993 long outcome;
994
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000995 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000996 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000997 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998 err_clear();
999 /* Fall back to the default behavior:
1000 all instances are nonzero */
1001 return 1;
1002 }
1003 }
1004 res = call_object(func, (object *)NULL);
1005 DECREF(func);
1006 if (res == NULL)
1007 return -1;
1008 if (!is_intobject(res)) {
1009 DECREF(res);
1010 err_setstr(TypeError, "__nonzero__ should return an int");
1011 return -1;
1012 }
1013 outcome = getintvalue(res);
1014 DECREF(res);
1015 if (outcome < 0) {
1016 err_setstr(ValueError, "__nonzero__ should return >= 0");
1017 return -1;
1018 }
1019 return outcome > 0;
1020}
1021
1022UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001023UNARY(instance_int, "__int__")
1024UNARY(instance_long, "__long__")
1025UNARY(instance_float, "__float__")
1026UNARY(instance_oct, "__oct__")
1027UNARY(instance_hex, "__hex__")
1028
Guido van Rossum03093a21994-09-28 15:51:32 +00001029/* This version is for ternary calls only (z != None) */
1030static object *
1031instance_pow(v, w, z)
1032 object *v;
1033 object *w;
1034 object *z;
1035{
1036 /* XXX Doesn't do coercions... */
1037 object *func;
1038 object *args;
1039 object *result;
1040 func = getattr(v, "__pow__");
1041 if (func == NULL)
1042 return NULL;
1043 args = mkvalue("(OO)", w, z);
1044 if (args == NULL) {
1045 DECREF(func);
1046 return NULL;
1047 }
1048 result = call_object(func, args);
1049 DECREF(func);
1050 DECREF(args);
1051 return result;
1052}
1053
Guido van Rossum04691fc1992-08-12 15:35:34 +00001054static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001055 0, /*nb_add*/
1056 0, /*nb_subtract*/
1057 0, /*nb_multiply*/
1058 0, /*nb_divide*/
1059 0, /*nb_remainder*/
1060 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001061 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001062 (unaryfunc)instance_neg, /*nb_negative*/
1063 (unaryfunc)instance_pos, /*nb_positive*/
1064 (unaryfunc)instance_abs, /*nb_absolute*/
1065 (inquiry)instance_nonzero, /*nb_nonzero*/
1066 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001067 0, /*nb_lshift*/
1068 0, /*nb_rshift*/
1069 0, /*nb_and*/
1070 0, /*nb_xor*/
1071 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001072 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001073 (unaryfunc)instance_int, /*nb_int*/
1074 (unaryfunc)instance_long, /*nb_long*/
1075 (unaryfunc)instance_float, /*nb_float*/
1076 (unaryfunc)instance_oct, /*nb_oct*/
1077 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078};
1079
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001080typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001081 OB_HEAD_INIT(&Typetype)
1082 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001083 "instance",
1084 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001086 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001087 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088 (getattrfunc)instance_getattr, /*tp_getattr*/
1089 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001090 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001091 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001092 &instance_as_number, /*tp_as_number*/
1093 &instance_as_sequence, /*tp_as_sequence*/
1094 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001095 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001096};
1097
1098
Guido van Rossum81daa321993-05-20 14:24:46 +00001099/* Instance method objects are used for two purposes:
1100 (a) as bound instance methods (returned by instancename.methodname)
1101 (b) as unbound methods (returned by ClassName.methodname)
1102 In case (b), im_self is NULL
1103*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001104
1105typedef struct {
1106 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001107 object *im_func; /* The function implementing the method */
1108 object *im_self; /* The instance it is bound to, or NULL */
1109 object *im_class; /* The class that defined the method */
Guido van Rossume7d444f1995-01-07 12:35:18 +00001110 object *im_doc; /* The documentation string */
Guido van Rossume8122f11991-05-05 20:03:07 +00001111} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001112
1113object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001114newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001115 object *func;
1116 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001117 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001118{
Guido van Rossume8122f11991-05-05 20:03:07 +00001119 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001121 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122 return NULL;
1123 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001124 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1125 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001126 return NULL;
1127 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001128 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001129 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001130 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001131 INCREF(class);
1132 im->im_class = class;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001133 XINCREF(((funcobject *)func)->func_doc);
1134 im->im_doc = ((funcobject *)func)->func_doc;
Guido van Rossume8122f11991-05-05 20:03:07 +00001135 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001136}
1137
1138object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001139instancemethodgetfunc(im)
1140 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141{
Guido van Rossume8122f11991-05-05 20:03:07 +00001142 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001143 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001144 return NULL;
1145 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001146 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147}
1148
1149object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001150instancemethodgetself(im)
1151 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001152{
Guido van Rossume8122f11991-05-05 20:03:07 +00001153 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001154 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001155 return NULL;
1156 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001157 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001158}
1159
Guido van Rossum81daa321993-05-20 14:24:46 +00001160object *
1161instancemethodgetclass(im)
1162 register object *im;
1163{
1164 if (!is_instancemethodobject(im)) {
1165 err_badcall();
1166 return NULL;
1167 }
1168 return ((instancemethodobject *)im)->im_class;
1169}
1170
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001171/* Class method methods */
1172
Guido van Rossume8122f11991-05-05 20:03:07 +00001173#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001174
Guido van Rossume8122f11991-05-05 20:03:07 +00001175static struct memberlist instancemethod_memberlist[] = {
1176 {"im_func", T_OBJECT, OFF(im_func)},
1177 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001178 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossume7d444f1995-01-07 12:35:18 +00001179 {"im_doc", T_OBJECT, OFF(im_doc)},
1180 {"__doc__", T_OBJECT, OFF(im_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181 {NULL} /* Sentinel */
1182};
1183
1184static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001185instancemethod_getattr(im, name)
1186 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001187 char *name;
1188{
Guido van Rossum10393b11995-01-10 10:39:49 +00001189 if (name[0] != '_' && getrestricted()) {
1190 err_setstr(RuntimeError,
1191 "instance-method attributes not accessible in restricted mode");
1192 return NULL;
1193 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001194 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195}
1196
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001198instancemethod_dealloc(im)
1199 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200{
Guido van Rossume8122f11991-05-05 20:03:07 +00001201 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001202 XDECREF(im->im_self);
1203 DECREF(im->im_class);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001204 XDECREF(im->im_doc);
Guido van Rossume8122f11991-05-05 20:03:07 +00001205 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001206}
1207
Guido van Rossumebc8c511992-09-03 20:39:51 +00001208static int
1209instancemethod_compare(a, b)
1210 instancemethodobject *a, *b;
1211{
1212 int cmp = cmpobject(a->im_self, b->im_self);
1213 if (cmp == 0)
1214 cmp = cmpobject(a->im_func, b->im_func);
1215 return cmp;
1216}
1217
Guido van Rossum25831651993-05-19 14:50:45 +00001218static object *
1219instancemethod_repr(a)
1220 instancemethodobject *a;
1221{
1222 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001223 instanceobject *self = (instanceobject *)(a->im_self);
1224 funcobject *func = (funcobject *)(a->im_func);
1225 classobject *class = (classobject *)(a->im_class);
1226 object *fclassname, *iclassname, *funcname;
1227 char *fcname, *icname, *fname;
1228 fclassname = class->cl_name;
1229 funcname = func->func_name;
1230 if (fclassname != NULL && is_stringobject(fclassname))
1231 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001232 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001233 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001234 if (funcname != NULL && is_stringobject(funcname))
1235 fname = getstringvalue(funcname);
1236 else
1237 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001238 if (self == NULL)
1239 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1240 else {
1241 iclassname = self->in_class->cl_name;
1242 if (iclassname != NULL && is_stringobject(iclassname))
1243 icname = getstringvalue(iclassname);
1244 else
1245 icname = "?";
1246 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1247 fcname, fname, icname, (long)self);
1248 }
Guido van Rossum25831651993-05-19 14:50:45 +00001249 return newstringobject(buf);
1250}
1251
Guido van Rossum9bfef441993-03-29 10:43:31 +00001252static long
1253instancemethod_hash(a)
1254 instancemethodobject *a;
1255{
1256 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001257 if (a->im_self == NULL)
1258 x = hashobject(None);
1259 else
1260 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001261 if (x == -1)
1262 return -1;
1263 y = hashobject(a->im_func);
1264 if (y == -1)
1265 return -1;
1266 return x ^ y;
1267}
1268
Guido van Rossume8122f11991-05-05 20:03:07 +00001269typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270 OB_HEAD_INIT(&Typetype)
1271 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001272 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001273 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001274 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001275 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001276 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001277 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001278 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001279 (cmpfunc)instancemethod_compare, /*tp_compare*/
1280 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001281 0, /*tp_as_number*/
1282 0, /*tp_as_sequence*/
1283 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001284 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285};