blob: 1fc5d6951d14945351e7981d965e9eff8944ac27 [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{
Guido van Rossume7d444f1995-01-07 12:35:18 +0000829 object *v1, *w1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000830 char buf[256];
831 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000832 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000833 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000834 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000835 return result;
836 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
837 err_setstr(TypeError, buf);
838 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000839}
840
Guido van Rossum03093a21994-09-28 15:51:32 +0000841
842/* Try one half of a binary operator involving a class instance.
843 Return value:
844 -1 if an exception is to be reported right away
845 0 if we have a valid result
846 1 if we could try another operation
847*/
848
849static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000850halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000851 object *v;
852 object *w;
853 char *opname;
854 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000855 object * (*thisfunc) PROTO((object *, object *));
856 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000857{
858 object *func;
859 object *args;
860 object *coerce;
861 object *coerced = NULL;
862 object *v1;
863
864 if (!is_instanceobject(v))
865 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000866 coerce = getattr(v, "__coerce__");
867 if (coerce == NULL) {
868 err_clear();
869 }
870 else {
871 args = mkvalue("(O)", w);
872 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000873 return -1;
874 }
875 coerced = call_object(coerce, args);
876 DECREF(args);
877 DECREF(coerce);
878 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000879 return -1;
880 }
881 if (coerced == None) {
882 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000883 return 1;
884 }
885 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
886 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000887 err_setstr(TypeError,
888 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000889 return -1;
890 }
891 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000892 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000893 if (v1 != v) {
894 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000895 if (!is_instanceobject(v) && !is_instanceobject(w)) {
896 if (swapped)
897 *r_result = (*thisfunc)(w, v);
898 else
899 *r_result = (*thisfunc)(v, w);
900 DECREF(coerced);
901 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000902 }
903 }
904 w = gettupleitem(coerced, 1);
905 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000906 func = getattr(v, opname);
907 if (func == NULL) {
908 XDECREF(coerced);
909 if (err_occurred() != AttributeError)
910 return -1;
911 err_clear();
912 return 1;
913 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000914 args = mkvalue("(O)", w);
915 if (args == NULL) {
916 DECREF(func);
917 XDECREF(coerced);
918 return -1;
919 }
920 *r_result = call_object(func, args);
921 DECREF(args);
922 DECREF(func);
923 XDECREF(coerced);
924 return *r_result == NULL ? -1 : 0;
925}
926
Guido van Rossum879c5811995-01-10 15:24:06 +0000927static int
928instance_coerce(pv, pw)
929 object **pv;
930 object **pw;
931{
932 object *v = *pv;
933 object *w = *pw;
934 object *coerce;
935 object *args;
936 object *coerced;
937
938 coerce = getattr(v, "__coerce__");
939 if (coerce == NULL) {
940 /* No __coerce__ method: always OK */
941 err_clear();
942 INCREF(v);
943 INCREF(w);
944 return 0;
945 }
946 /* Has __coerce__ method: call it */
947 args = mkvalue("(O)", w);
948 if (args == NULL) {
949 return -1;
950 }
951 coerced = call_object(coerce, args);
952 DECREF(args);
953 DECREF(coerce);
954 if (coerced == NULL) {
955 /* __coerce__ call raised an exception */
956 return -1;
957 }
958 if (coerced == None) {
959 /* __coerce__ says "I can't do it" */
960 DECREF(coerced);
961 return 1;
962 }
963 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
964 /* __coerce__ return value is malformed */
965 DECREF(coerced);
966 err_setstr(TypeError,
967 "coercion should return None or 2-tuple");
968 return -1;
969 }
970 /* __coerce__ returned two new values */
971 *pv = gettupleitem(coerced, 0);
972 *pw = gettupleitem(coerced, 1);
973 INCREF(*pv);
974 INCREF(*pw);
975 DECREF(coerced);
976 return 0;
977}
978
Guido van Rossum03093a21994-09-28 15:51:32 +0000979
Guido van Rossum04691fc1992-08-12 15:35:34 +0000980#define UNARY(funcname, methodname) \
981static object *funcname(self) instanceobject *self; { \
982 return generic_unary_op(self, methodname); \
983}
984
Guido van Rossum04691fc1992-08-12 15:35:34 +0000985UNARY(instance_neg, "__neg__")
986UNARY(instance_pos, "__pos__")
987UNARY(instance_abs, "__abs__")
988
Guido van Rossum9bfef441993-03-29 10:43:31 +0000989static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000990instance_nonzero(self)
991 instanceobject *self;
992{
993 object *func, *res;
994 long outcome;
995
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000996 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000997 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000998 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000999 err_clear();
1000 /* Fall back to the default behavior:
1001 all instances are nonzero */
1002 return 1;
1003 }
1004 }
1005 res = call_object(func, (object *)NULL);
1006 DECREF(func);
1007 if (res == NULL)
1008 return -1;
1009 if (!is_intobject(res)) {
1010 DECREF(res);
1011 err_setstr(TypeError, "__nonzero__ should return an int");
1012 return -1;
1013 }
1014 outcome = getintvalue(res);
1015 DECREF(res);
1016 if (outcome < 0) {
1017 err_setstr(ValueError, "__nonzero__ should return >= 0");
1018 return -1;
1019 }
1020 return outcome > 0;
1021}
1022
1023UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001024UNARY(instance_int, "__int__")
1025UNARY(instance_long, "__long__")
1026UNARY(instance_float, "__float__")
1027UNARY(instance_oct, "__oct__")
1028UNARY(instance_hex, "__hex__")
1029
Guido van Rossum03093a21994-09-28 15:51:32 +00001030/* This version is for ternary calls only (z != None) */
1031static object *
1032instance_pow(v, w, z)
1033 object *v;
1034 object *w;
1035 object *z;
1036{
1037 /* XXX Doesn't do coercions... */
1038 object *func;
1039 object *args;
1040 object *result;
1041 func = getattr(v, "__pow__");
1042 if (func == NULL)
1043 return NULL;
1044 args = mkvalue("(OO)", w, z);
1045 if (args == NULL) {
1046 DECREF(func);
1047 return NULL;
1048 }
1049 result = call_object(func, args);
1050 DECREF(func);
1051 DECREF(args);
1052 return result;
1053}
1054
Guido van Rossum04691fc1992-08-12 15:35:34 +00001055static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001056 0, /*nb_add*/
1057 0, /*nb_subtract*/
1058 0, /*nb_multiply*/
1059 0, /*nb_divide*/
1060 0, /*nb_remainder*/
1061 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001062 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063 (unaryfunc)instance_neg, /*nb_negative*/
1064 (unaryfunc)instance_pos, /*nb_positive*/
1065 (unaryfunc)instance_abs, /*nb_absolute*/
1066 (inquiry)instance_nonzero, /*nb_nonzero*/
1067 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001068 0, /*nb_lshift*/
1069 0, /*nb_rshift*/
1070 0, /*nb_and*/
1071 0, /*nb_xor*/
1072 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001073 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001074 (unaryfunc)instance_int, /*nb_int*/
1075 (unaryfunc)instance_long, /*nb_long*/
1076 (unaryfunc)instance_float, /*nb_float*/
1077 (unaryfunc)instance_oct, /*nb_oct*/
1078 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001079};
1080
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001081typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001082 OB_HEAD_INIT(&Typetype)
1083 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001084 "instance",
1085 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001086 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001087 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001088 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001089 (getattrfunc)instance_getattr, /*tp_getattr*/
1090 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001091 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001092 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001093 &instance_as_number, /*tp_as_number*/
1094 &instance_as_sequence, /*tp_as_sequence*/
1095 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001096 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001097};
1098
1099
Guido van Rossum81daa321993-05-20 14:24:46 +00001100/* Instance method objects are used for two purposes:
1101 (a) as bound instance methods (returned by instancename.methodname)
1102 (b) as unbound methods (returned by ClassName.methodname)
1103 In case (b), im_self is NULL
1104*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001105
1106typedef struct {
1107 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001108 object *im_func; /* The function implementing the method */
1109 object *im_self; /* The instance it is bound to, or NULL */
1110 object *im_class; /* The class that defined the method */
Guido van Rossume7d444f1995-01-07 12:35:18 +00001111 object *im_doc; /* The documentation string */
Guido van Rossume8122f11991-05-05 20:03:07 +00001112} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001113
1114object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001115newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116 object *func;
1117 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001118 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001119{
Guido van Rossume8122f11991-05-05 20:03:07 +00001120 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001121 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001122 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123 return NULL;
1124 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001125 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1126 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001127 return NULL;
1128 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001129 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001130 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001131 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001132 INCREF(class);
1133 im->im_class = class;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001134 XINCREF(((funcobject *)func)->func_doc);
1135 im->im_doc = ((funcobject *)func)->func_doc;
Guido van Rossume8122f11991-05-05 20:03:07 +00001136 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137}
1138
1139object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001140instancemethodgetfunc(im)
1141 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001142{
Guido van Rossume8122f11991-05-05 20:03:07 +00001143 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001144 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001145 return NULL;
1146 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001147 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001148}
1149
1150object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001151instancemethodgetself(im)
1152 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001153{
Guido van Rossume8122f11991-05-05 20:03:07 +00001154 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001155 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001156 return NULL;
1157 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001158 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001159}
1160
Guido van Rossum81daa321993-05-20 14:24:46 +00001161object *
1162instancemethodgetclass(im)
1163 register object *im;
1164{
1165 if (!is_instancemethodobject(im)) {
1166 err_badcall();
1167 return NULL;
1168 }
1169 return ((instancemethodobject *)im)->im_class;
1170}
1171
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001172/* Class method methods */
1173
Guido van Rossume8122f11991-05-05 20:03:07 +00001174#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001175
Guido van Rossume8122f11991-05-05 20:03:07 +00001176static struct memberlist instancemethod_memberlist[] = {
1177 {"im_func", T_OBJECT, OFF(im_func)},
1178 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001179 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossume7d444f1995-01-07 12:35:18 +00001180 {"im_doc", T_OBJECT, OFF(im_doc)},
1181 {"__doc__", T_OBJECT, OFF(im_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 {NULL} /* Sentinel */
1183};
1184
1185static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001186instancemethod_getattr(im, name)
1187 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001188 char *name;
1189{
Guido van Rossum10393b11995-01-10 10:39:49 +00001190 if (name[0] != '_' && getrestricted()) {
1191 err_setstr(RuntimeError,
1192 "instance-method attributes not accessible in restricted mode");
1193 return NULL;
1194 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001195 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196}
1197
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001198static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001199instancemethod_dealloc(im)
1200 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001201{
Guido van Rossume8122f11991-05-05 20:03:07 +00001202 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001203 XDECREF(im->im_self);
1204 DECREF(im->im_class);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001205 XDECREF(im->im_doc);
Guido van Rossume8122f11991-05-05 20:03:07 +00001206 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207}
1208
Guido van Rossumebc8c511992-09-03 20:39:51 +00001209static int
1210instancemethod_compare(a, b)
1211 instancemethodobject *a, *b;
1212{
1213 int cmp = cmpobject(a->im_self, b->im_self);
1214 if (cmp == 0)
1215 cmp = cmpobject(a->im_func, b->im_func);
1216 return cmp;
1217}
1218
Guido van Rossum25831651993-05-19 14:50:45 +00001219static object *
1220instancemethod_repr(a)
1221 instancemethodobject *a;
1222{
1223 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001224 instanceobject *self = (instanceobject *)(a->im_self);
1225 funcobject *func = (funcobject *)(a->im_func);
1226 classobject *class = (classobject *)(a->im_class);
1227 object *fclassname, *iclassname, *funcname;
1228 char *fcname, *icname, *fname;
1229 fclassname = class->cl_name;
1230 funcname = func->func_name;
1231 if (fclassname != NULL && is_stringobject(fclassname))
1232 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001233 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001234 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001235 if (funcname != NULL && is_stringobject(funcname))
1236 fname = getstringvalue(funcname);
1237 else
1238 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001239 if (self == NULL)
1240 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1241 else {
1242 iclassname = self->in_class->cl_name;
1243 if (iclassname != NULL && is_stringobject(iclassname))
1244 icname = getstringvalue(iclassname);
1245 else
1246 icname = "?";
1247 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1248 fcname, fname, icname, (long)self);
1249 }
Guido van Rossum25831651993-05-19 14:50:45 +00001250 return newstringobject(buf);
1251}
1252
Guido van Rossum9bfef441993-03-29 10:43:31 +00001253static long
1254instancemethod_hash(a)
1255 instancemethodobject *a;
1256{
1257 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001258 if (a->im_self == NULL)
1259 x = hashobject(None);
1260 else
1261 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001262 if (x == -1)
1263 return -1;
1264 y = hashobject(a->im_func);
1265 if (y == -1)
1266 return -1;
1267 return x ^ y;
1268}
1269
Guido van Rossume8122f11991-05-05 20:03:07 +00001270typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001271 OB_HEAD_INIT(&Typetype)
1272 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001273 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001274 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001275 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001278 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001279 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001280 (cmpfunc)instancemethod_compare, /*tp_compare*/
1281 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282 0, /*tp_as_number*/
1283 0, /*tp_as_sequence*/
1284 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001285 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001286};