blob: d4a873f6fe227e22416478b7c8fd7312174cb1f1 [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 Rossuma83f2701995-07-26 18:07:32 +0000282newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000283 object *class;
284 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000285 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286{
Guido van Rossume8122f11991-05-05 20:03:07 +0000287 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000288 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000290 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
292 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000293 inst = NEWOBJ(instanceobject, &Instancetype);
294 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 return NULL;
296 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000297 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000298 inst->in_dict = newdictobject();
299 if (inst->in_dict == NULL ||
300 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000301 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302 return NULL;
303 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000304 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000305 if (init == NULL) {
306 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000307 if (arg != NULL && (!is_tupleobject(arg) ||
308 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000309 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000310 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000311 DECREF(inst);
312 inst = NULL;
313 }
314 }
315 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000316 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000317 DECREF(init);
318 if (res == NULL) {
319 DECREF(inst);
320 inst = NULL;
321 }
322 else {
323 if (res != None) {
324 err_setstr(TypeError,
325 "__init__() should return None");
326 DECREF(inst);
327 inst = NULL;
328 }
329 DECREF(res);
330 }
331 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000332 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000335/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336
337static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000338instance_dealloc(inst)
339 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000341 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000342 object *del;
343 /* Call the __del__ method if it exists. First temporarily
344 revive the object and save the current exception, if any. */
345 INCREF(inst);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000346 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000347 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000348 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000349 DECREF(del);
350 XDECREF(res);
351 /* XXX If __del__ raised an exception, it is ignored! */
352 }
353 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000354 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000355 /* Can't use DECREF here, it would cause a recursive call */
356 if (--inst->ob_refcnt > 0)
357 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000358 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000359 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000360 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361}
362
Guido van Rossume7737541994-09-05 07:31:41 +0000363static object *
364instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000365 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 register char *name;
367{
Guido van Rossum94308391991-10-20 20:11:48 +0000368 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000369 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000370 if (name[0] == '_' && name[1] == '_') {
371 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000372 if (getrestricted()) {
373 err_setstr(RuntimeError,
374 "instance.__dict__ not accessible in restricted mode");
375 return NULL;
376 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000377 INCREF(inst->in_dict);
378 return inst->in_dict;
379 }
380 if (strcmp(name, "__class__") == 0) {
381 INCREF(inst->in_class);
382 return (object *)inst->in_class;
383 }
Guido van Rossum94308391991-10-20 20:11:48 +0000384 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000385 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000386 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000387 if (v == NULL) {
388 v = class_lookup(inst->in_class, name, &class);
389 if (v == NULL) {
390 err_setstr(AttributeError, name);
391 return NULL;
392 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000394 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000395 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000396 if (v == NULL)
397 return NULL;
398 }
399 else
400 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000401 if (class != NULL) {
402 if (is_funcobject(v)) {
403 object *w = newinstancemethodobject(v, (object *)inst,
404 (object *)class);
405 DECREF(v);
406 v = w;
407 }
408 else if (is_instancemethodobject(v)) {
409 object *im_class = instancemethodgetclass(v);
410 /* Only if classes are compatible */
411 if (issubclass((object *)class, im_class)) {
412 object *im_func = instancemethodgetfunc(v);
413 object *w = newinstancemethodobject(im_func,
414 (object *)inst, im_class);
415 DECREF(v);
416 v = w;
417 }
418 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000419 }
420 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
422
Guido van Rossume7737541994-09-05 07:31:41 +0000423static object *
424instance_getattr(inst, name)
425 register instanceobject *inst;
426 register char *name;
427{
428 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000429 res = instance_getattr1(inst, name);
430 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
431 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000432 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000433 args = mkvalue("(Os)", inst, name);
434 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000435 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000436 res = call_object(func, args);
437 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000438 }
439 return res;
440}
441
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442static int
Guido van Rossume7737541994-09-05 07:31:41 +0000443instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000444 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 char *name;
446 object *v;
447{
Guido van Rossum25831651993-05-19 14:50:45 +0000448 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000449 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000450 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000451 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000452 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000453 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000454 if (rv < 0)
455 err_setstr(AttributeError,
456 "delete non-existing instance attribute");
457 return rv;
458 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000460 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461}
462
Guido van Rossume7737541994-09-05 07:31:41 +0000463static int
464instance_setattr(inst, name, v)
465 instanceobject *inst;
466 char *name;
467 object *v;
468{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000469 object *func, *args, *res;
470 if (name[0] == '_' && name[1] == '_') {
471 int n = strlen(name);
472 if (name[n-1] == '_' && name[n-2] == '_') {
473 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000474 return -1;
475 }
Guido van Rossume7737541994-09-05 07:31:41 +0000476 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000477 if (v == NULL)
478 func = inst->in_class->cl_delattr;
479 else
480 func = inst->in_class->cl_setattr;
481 if (func == NULL)
482 return instance_setattr1(inst, name, v);
483 if (v == NULL)
484 args = mkvalue("(Os)", inst, name);
485 else
486 args = mkvalue("(OsO)", inst, name, v);
487 if (args == NULL)
488 return -1;
489 res = call_object(func, args);
490 DECREF(args);
491 if (res == NULL)
492 return -1;
493 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000494 return 0;
495}
496
Guido van Rossum9bfef441993-03-29 10:43:31 +0000497static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000498instance_repr(inst)
499 instanceobject *inst;
500{
501 object *func;
502 object *res;
503
504 func = instance_getattr(inst, "__repr__");
505 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000506 char buf[140];
507 object *classname = inst->in_class->cl_name;
508 char *cname;
509 if (classname != NULL && is_stringobject(classname))
510 cname = getstringvalue(classname);
511 else
512 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000513 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000514 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000515 return newstringobject(buf);
516 }
517 res = call_object(func, (object *)NULL);
518 DECREF(func);
519 return res;
520}
521
Guido van Rossume7d444f1995-01-07 12:35:18 +0000522static object *
523instance_compare1(inst, other)
524 object *inst, *other;
525{
526 return instancebinop(inst, other, "__cmp__", "__rcmp__",
527 instance_compare1);
528}
529
Guido van Rossum9bfef441993-03-29 10:43:31 +0000530static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000531instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000532 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000533{
Guido van Rossum03093a21994-09-28 15:51:32 +0000534 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000535 long outcome;
536 result = instance_compare1(inst, other);
537 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000538 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000539 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000540 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000541 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000542 outcome = getintvalue(result);
543 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000544 if (outcome < 0)
545 return -1;
546 else if (outcome > 0)
547 return 1;
548 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000549}
550
Guido van Rossum9bfef441993-03-29 10:43:31 +0000551static long
552instance_hash(inst)
553 instanceobject *inst;
554{
555 object *func;
556 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000557 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000558
559 func = instance_getattr(inst, "__hash__");
560 if (func == NULL) {
561 /* If there is no __cmp__ method, we hash on the address.
562 If a __cmp__ method exists, there must be a __hash__. */
563 err_clear();
564 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000565 if (func == NULL) {
566 err_clear();
567 outcome = (long)inst;
568 if (outcome == -1)
569 outcome = -2;
570 return outcome;
571 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000572 err_setstr(TypeError, "unhashable instance");
573 return -1;
574 }
575 res = call_object(func, (object *)NULL);
576 DECREF(func);
577 if (res == NULL)
578 return -1;
579 if (is_intobject(res)) {
580 outcome = getintvalue(res);
581 if (outcome == -1)
582 outcome = -2;
583 }
584 else {
585 err_setstr(TypeError, "__hash__() should return an int");
586 outcome = -1;
587 }
588 DECREF(res);
589 return outcome;
590}
591
592static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000593instance_length(inst)
594 instanceobject *inst;
595{
596 object *func;
597 object *res;
598 int outcome;
599
600 func = instance_getattr(inst, "__len__");
601 if (func == NULL)
602 return -1;
603 res = call_object(func, (object *)NULL);
604 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000605 if (res == NULL)
606 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000607 if (is_intobject(res)) {
608 outcome = getintvalue(res);
609 if (outcome < 0)
610 err_setstr(ValueError, "__len__() should return >= 0");
611 }
612 else {
613 err_setstr(TypeError, "__len__() should return an int");
614 outcome = -1;
615 }
616 DECREF(res);
617 return outcome;
618}
619
Guido van Rossum9bfef441993-03-29 10:43:31 +0000620static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000621instance_subscript(inst, key)
622 instanceobject *inst;
623 object *key;
624{
625 object *func;
626 object *arg;
627 object *res;
628
629 func = instance_getattr(inst, "__getitem__");
630 if (func == NULL)
631 return NULL;
632 arg = mkvalue("(O)", key);
633 if (arg == NULL) {
634 DECREF(func);
635 return NULL;
636 }
637 res = call_object(func, arg);
638 DECREF(func);
639 DECREF(arg);
640 return res;
641}
642
Guido van Rossum9bfef441993-03-29 10:43:31 +0000643static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000644instance_ass_subscript(inst, key, value)
645 instanceobject*inst;
646 object *key;
647 object *value;
648{
649 object *func;
650 object *arg;
651 object *res;
652
653 if (value == NULL)
654 func = instance_getattr(inst, "__delitem__");
655 else
656 func = instance_getattr(inst, "__setitem__");
657 if (func == NULL)
658 return -1;
659 if (value == NULL)
660 arg = mkvalue("(O)", key);
661 else
662 arg = mkvalue("(OO)", key, value);
663 if (arg == NULL) {
664 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000665 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000666 }
667 res = call_object(func, arg);
668 DECREF(func);
669 DECREF(arg);
670 if (res == NULL)
671 return -1;
672 DECREF(res);
673 return 0;
674}
675
Guido van Rossum9bfef441993-03-29 10:43:31 +0000676static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000677 (inquiry)instance_length, /*mp_length*/
678 (binaryfunc)instance_subscript, /*mp_subscript*/
679 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000680};
681
682static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000683instance_item(inst, i)
684 instanceobject *inst;
685 int i;
686{
687 object *func, *arg, *res;
688
689 func = instance_getattr(inst, "__getitem__");
690 if (func == NULL)
691 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000692 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000693 if (arg == NULL) {
694 DECREF(func);
695 return NULL;
696 }
697 res = call_object(func, arg);
698 DECREF(func);
699 DECREF(arg);
700 return res;
701}
702
703static object *
704instance_slice(inst, i, j)
705 instanceobject *inst;
706 int i, j;
707{
708 object *func, *arg, *res;
709
710 func = instance_getattr(inst, "__getslice__");
711 if (func == NULL)
712 return NULL;
713 arg = mkvalue("(ii)", i, j);
714 if (arg == NULL) {
715 DECREF(func);
716 return NULL;
717 }
718 res = call_object(func, arg);
719 DECREF(func);
720 DECREF(arg);
721 return res;
722}
723
724static int
725instance_ass_item(inst, i, item)
726 instanceobject *inst;
727 int i;
728 object *item;
729{
730 object *func, *arg, *res;
731
732 if (item == NULL)
733 func = instance_getattr(inst, "__delitem__");
734 else
735 func = instance_getattr(inst, "__setitem__");
736 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000737 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000738 if (item == NULL)
739 arg = mkvalue("i", i);
740 else
741 arg = mkvalue("(iO)", i, item);
742 if (arg == NULL) {
743 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000744 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745 }
746 res = call_object(func, arg);
747 DECREF(func);
748 DECREF(arg);
749 if (res == NULL)
750 return -1;
751 DECREF(res);
752 return 0;
753}
754
755static int
756instance_ass_slice(inst, i, j, value)
757 instanceobject *inst;
758 int i, j;
759 object *value;
760{
761 object *func, *arg, *res;
762
763 if (value == NULL)
764 func = instance_getattr(inst, "__delslice__");
765 else
766 func = instance_getattr(inst, "__setslice__");
767 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000768 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000769 if (value == NULL)
770 arg = mkvalue("(ii)", i, j);
771 else
772 arg = mkvalue("(iiO)", i, j, value);
773 if (arg == NULL) {
774 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000775 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776 }
777 res = call_object(func, arg);
778 DECREF(func);
779 DECREF(arg);
780 if (res == NULL)
781 return -1;
782 DECREF(res);
783 return 0;
784}
785
786static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000788 0, /*sq_concat*/
789 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790 (intargfunc)instance_item, /*sq_item*/
791 (intintargfunc)instance_slice, /*sq_slice*/
792 (intobjargproc)instance_ass_item, /*sq_ass_item*/
793 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000794};
795
796static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000797generic_unary_op(self, methodname)
798 instanceobject *self;
799 char *methodname;
800{
801 object *func, *res;
802
803 if ((func = instance_getattr(self, methodname)) == NULL)
804 return NULL;
805 res = call_object(func, (object *)NULL);
806 DECREF(func);
807 return res;
808}
809
Guido van Rossum03093a21994-09-28 15:51:32 +0000810
811/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000812static int halfbinop PROTO((object *, object *, char *, object **,
813 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000814
815
816/* Implement a binary operator involving at least one class instance. */
817
818object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000819instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000820 object *v;
821 object *w;
822 char *opname;
823 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000824 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000825{
826 char buf[256];
827 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000828 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000829 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000830 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000831 return result;
832 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
833 err_setstr(TypeError, buf);
834 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000835}
836
Guido van Rossum03093a21994-09-28 15:51:32 +0000837
838/* Try one half of a binary operator involving a class instance.
839 Return value:
840 -1 if an exception is to be reported right away
841 0 if we have a valid result
842 1 if we could try another operation
843*/
844
845static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000846halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000847 object *v;
848 object *w;
849 char *opname;
850 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000851 object * (*thisfunc) PROTO((object *, object *));
852 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000853{
854 object *func;
855 object *args;
856 object *coerce;
857 object *coerced = NULL;
858 object *v1;
859
860 if (!is_instanceobject(v))
861 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000862 coerce = getattr(v, "__coerce__");
863 if (coerce == NULL) {
864 err_clear();
865 }
866 else {
867 args = mkvalue("(O)", w);
868 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000869 return -1;
870 }
871 coerced = call_object(coerce, args);
872 DECREF(args);
873 DECREF(coerce);
874 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000875 return -1;
876 }
877 if (coerced == None) {
878 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000879 return 1;
880 }
881 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
882 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000883 err_setstr(TypeError,
884 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000885 return -1;
886 }
887 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000888 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000889 if (v1 != v) {
890 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000891 if (!is_instanceobject(v) && !is_instanceobject(w)) {
892 if (swapped)
893 *r_result = (*thisfunc)(w, v);
894 else
895 *r_result = (*thisfunc)(v, w);
896 DECREF(coerced);
897 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000898 }
899 }
900 w = gettupleitem(coerced, 1);
901 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000902 func = getattr(v, opname);
903 if (func == NULL) {
904 XDECREF(coerced);
905 if (err_occurred() != AttributeError)
906 return -1;
907 err_clear();
908 return 1;
909 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000910 args = mkvalue("(O)", w);
911 if (args == NULL) {
912 DECREF(func);
913 XDECREF(coerced);
914 return -1;
915 }
916 *r_result = call_object(func, args);
917 DECREF(args);
918 DECREF(func);
919 XDECREF(coerced);
920 return *r_result == NULL ? -1 : 0;
921}
922
Guido van Rossum879c5811995-01-10 15:24:06 +0000923static int
924instance_coerce(pv, pw)
925 object **pv;
926 object **pw;
927{
928 object *v = *pv;
929 object *w = *pw;
930 object *coerce;
931 object *args;
932 object *coerced;
933
934 coerce = getattr(v, "__coerce__");
935 if (coerce == NULL) {
936 /* No __coerce__ method: always OK */
937 err_clear();
938 INCREF(v);
939 INCREF(w);
940 return 0;
941 }
942 /* Has __coerce__ method: call it */
943 args = mkvalue("(O)", w);
944 if (args == NULL) {
945 return -1;
946 }
947 coerced = call_object(coerce, args);
948 DECREF(args);
949 DECREF(coerce);
950 if (coerced == NULL) {
951 /* __coerce__ call raised an exception */
952 return -1;
953 }
954 if (coerced == None) {
955 /* __coerce__ says "I can't do it" */
956 DECREF(coerced);
957 return 1;
958 }
959 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
960 /* __coerce__ return value is malformed */
961 DECREF(coerced);
962 err_setstr(TypeError,
963 "coercion should return None or 2-tuple");
964 return -1;
965 }
966 /* __coerce__ returned two new values */
967 *pv = gettupleitem(coerced, 0);
968 *pw = gettupleitem(coerced, 1);
969 INCREF(*pv);
970 INCREF(*pw);
971 DECREF(coerced);
972 return 0;
973}
974
Guido van Rossum03093a21994-09-28 15:51:32 +0000975
Guido van Rossum04691fc1992-08-12 15:35:34 +0000976#define UNARY(funcname, methodname) \
977static object *funcname(self) instanceobject *self; { \
978 return generic_unary_op(self, methodname); \
979}
980
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981UNARY(instance_neg, "__neg__")
982UNARY(instance_pos, "__pos__")
983UNARY(instance_abs, "__abs__")
984
Guido van Rossum9bfef441993-03-29 10:43:31 +0000985static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986instance_nonzero(self)
987 instanceobject *self;
988{
989 object *func, *res;
990 long outcome;
991
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000992 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000993 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000994 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000995 err_clear();
996 /* Fall back to the default behavior:
997 all instances are nonzero */
998 return 1;
999 }
1000 }
1001 res = call_object(func, (object *)NULL);
1002 DECREF(func);
1003 if (res == NULL)
1004 return -1;
1005 if (!is_intobject(res)) {
1006 DECREF(res);
1007 err_setstr(TypeError, "__nonzero__ should return an int");
1008 return -1;
1009 }
1010 outcome = getintvalue(res);
1011 DECREF(res);
1012 if (outcome < 0) {
1013 err_setstr(ValueError, "__nonzero__ should return >= 0");
1014 return -1;
1015 }
1016 return outcome > 0;
1017}
1018
1019UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001020UNARY(instance_int, "__int__")
1021UNARY(instance_long, "__long__")
1022UNARY(instance_float, "__float__")
1023UNARY(instance_oct, "__oct__")
1024UNARY(instance_hex, "__hex__")
1025
Guido van Rossum03093a21994-09-28 15:51:32 +00001026/* This version is for ternary calls only (z != None) */
1027static object *
1028instance_pow(v, w, z)
1029 object *v;
1030 object *w;
1031 object *z;
1032{
1033 /* XXX Doesn't do coercions... */
1034 object *func;
1035 object *args;
1036 object *result;
1037 func = getattr(v, "__pow__");
1038 if (func == NULL)
1039 return NULL;
1040 args = mkvalue("(OO)", w, z);
1041 if (args == NULL) {
1042 DECREF(func);
1043 return NULL;
1044 }
1045 result = call_object(func, args);
1046 DECREF(func);
1047 DECREF(args);
1048 return result;
1049}
1050
Guido van Rossum04691fc1992-08-12 15:35:34 +00001051static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001052 0, /*nb_add*/
1053 0, /*nb_subtract*/
1054 0, /*nb_multiply*/
1055 0, /*nb_divide*/
1056 0, /*nb_remainder*/
1057 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001058 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001059 (unaryfunc)instance_neg, /*nb_negative*/
1060 (unaryfunc)instance_pos, /*nb_positive*/
1061 (unaryfunc)instance_abs, /*nb_absolute*/
1062 (inquiry)instance_nonzero, /*nb_nonzero*/
1063 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001064 0, /*nb_lshift*/
1065 0, /*nb_rshift*/
1066 0, /*nb_and*/
1067 0, /*nb_xor*/
1068 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001069 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001070 (unaryfunc)instance_int, /*nb_int*/
1071 (unaryfunc)instance_long, /*nb_long*/
1072 (unaryfunc)instance_float, /*nb_float*/
1073 (unaryfunc)instance_oct, /*nb_oct*/
1074 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075};
1076
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001077typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001078 OB_HEAD_INIT(&Typetype)
1079 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001080 "instance",
1081 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001082 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001083 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001084 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001085 (getattrfunc)instance_getattr, /*tp_getattr*/
1086 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001087 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001089 &instance_as_number, /*tp_as_number*/
1090 &instance_as_sequence, /*tp_as_sequence*/
1091 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001092 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001093};
1094
1095
Guido van Rossum81daa321993-05-20 14:24:46 +00001096/* Instance method objects are used for two purposes:
1097 (a) as bound instance methods (returned by instancename.methodname)
1098 (b) as unbound methods (returned by ClassName.methodname)
1099 In case (b), im_self is NULL
1100*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001101
1102typedef struct {
1103 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001104 object *im_func; /* The function implementing the method */
1105 object *im_self; /* The instance it is bound to, or NULL */
1106 object *im_class; /* The class that defined the method */
Guido van Rossume7d444f1995-01-07 12:35:18 +00001107 object *im_doc; /* The documentation string */
Guido van Rossume8122f11991-05-05 20:03:07 +00001108} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001109
1110object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001111newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001112 object *func;
1113 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001114 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001115{
Guido van Rossume8122f11991-05-05 20:03:07 +00001116 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001118 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001119 return NULL;
1120 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001121 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1122 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123 return NULL;
1124 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001125 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001126 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001127 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001128 INCREF(class);
1129 im->im_class = class;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001130 XINCREF(((funcobject *)func)->func_doc);
1131 im->im_doc = ((funcobject *)func)->func_doc;
Guido van Rossume8122f11991-05-05 20:03:07 +00001132 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001133}
1134
1135object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001136instancemethodgetfunc(im)
1137 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138{
Guido van Rossume8122f11991-05-05 20:03:07 +00001139 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001140 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141 return NULL;
1142 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001143 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001144}
1145
1146object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001147instancemethodgetself(im)
1148 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149{
Guido van Rossume8122f11991-05-05 20:03:07 +00001150 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001151 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001152 return NULL;
1153 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001154 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001155}
1156
Guido van Rossum81daa321993-05-20 14:24:46 +00001157object *
1158instancemethodgetclass(im)
1159 register object *im;
1160{
1161 if (!is_instancemethodobject(im)) {
1162 err_badcall();
1163 return NULL;
1164 }
1165 return ((instancemethodobject *)im)->im_class;
1166}
1167
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001168/* Class method methods */
1169
Guido van Rossume8122f11991-05-05 20:03:07 +00001170#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001171
Guido van Rossume8122f11991-05-05 20:03:07 +00001172static struct memberlist instancemethod_memberlist[] = {
1173 {"im_func", T_OBJECT, OFF(im_func)},
1174 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001175 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossume7d444f1995-01-07 12:35:18 +00001176 {"im_doc", T_OBJECT, OFF(im_doc)},
1177 {"__doc__", T_OBJECT, OFF(im_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 {NULL} /* Sentinel */
1179};
1180
1181static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001182instancemethod_getattr(im, name)
1183 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001184 char *name;
1185{
Guido van Rossum10393b11995-01-10 10:39:49 +00001186 if (name[0] != '_' && getrestricted()) {
1187 err_setstr(RuntimeError,
1188 "instance-method attributes not accessible in restricted mode");
1189 return NULL;
1190 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001191 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001192}
1193
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001195instancemethod_dealloc(im)
1196 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197{
Guido van Rossume8122f11991-05-05 20:03:07 +00001198 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001199 XDECREF(im->im_self);
1200 DECREF(im->im_class);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001201 XDECREF(im->im_doc);
Guido van Rossume8122f11991-05-05 20:03:07 +00001202 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203}
1204
Guido van Rossumebc8c511992-09-03 20:39:51 +00001205static int
1206instancemethod_compare(a, b)
1207 instancemethodobject *a, *b;
1208{
Guido van Rossume9df7271995-04-06 14:46:51 +00001209 if (a->im_self != b->im_self)
1210 return (a->im_self < b->im_self) ? -1 : 1;
1211 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001212}
1213
Guido van Rossum25831651993-05-19 14:50:45 +00001214static object *
1215instancemethod_repr(a)
1216 instancemethodobject *a;
1217{
1218 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001219 instanceobject *self = (instanceobject *)(a->im_self);
1220 funcobject *func = (funcobject *)(a->im_func);
1221 classobject *class = (classobject *)(a->im_class);
1222 object *fclassname, *iclassname, *funcname;
1223 char *fcname, *icname, *fname;
1224 fclassname = class->cl_name;
1225 funcname = func->func_name;
1226 if (fclassname != NULL && is_stringobject(fclassname))
1227 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001228 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001229 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001230 if (funcname != NULL && is_stringobject(funcname))
1231 fname = getstringvalue(funcname);
1232 else
1233 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001234 if (self == NULL)
1235 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1236 else {
1237 iclassname = self->in_class->cl_name;
1238 if (iclassname != NULL && is_stringobject(iclassname))
1239 icname = getstringvalue(iclassname);
1240 else
1241 icname = "?";
1242 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1243 fcname, fname, icname, (long)self);
1244 }
Guido van Rossum25831651993-05-19 14:50:45 +00001245 return newstringobject(buf);
1246}
1247
Guido van Rossum9bfef441993-03-29 10:43:31 +00001248static long
1249instancemethod_hash(a)
1250 instancemethodobject *a;
1251{
1252 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001253 if (a->im_self == NULL)
1254 x = hashobject(None);
1255 else
1256 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001257 if (x == -1)
1258 return -1;
1259 y = hashobject(a->im_func);
1260 if (y == -1)
1261 return -1;
1262 return x ^ y;
1263}
1264
Guido van Rossume8122f11991-05-05 20:03:07 +00001265typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001266 OB_HEAD_INIT(&Typetype)
1267 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001268 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001269 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001270 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001271 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001272 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001274 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001275 (cmpfunc)instancemethod_compare, /*tp_compare*/
1276 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277 0, /*tp_as_number*/
1278 0, /*tp_as_sequence*/
1279 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001280 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001281};