blob: 0d0a10900e8f7c71b333ba86fb4de91132f58085 [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 Rossumac21f6a1995-08-04 04:05:31 +0000177 if (getrestricted()) {
178 err_setstr(RuntimeError,
179 "classes are read-only in restricted mode");
180 return -1;
181 }
Guido van Rossum81daa321993-05-20 14:24:46 +0000182 ac = dictlookup(op->cl_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000183 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000184 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000185 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000186 int rv = dictremove(op->cl_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000187 if (rv < 0)
188 err_setstr(AttributeError,
189 "delete non-existing class attribute");
190 return rv;
191 }
Guido van Rossum94308391991-10-20 20:11:48 +0000192 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000193 return dictinsert(op->cl_dict, name, v);
Guido van Rossum94308391991-10-20 20:11:48 +0000194}
195
Guido van Rossum25831651993-05-19 14:50:45 +0000196static object *
197class_repr(op)
198 classobject *op;
199{
200 char buf[140];
201 char *name;
202 if (op->cl_name == NULL || !is_stringobject(op->cl_name))
203 name = "?";
204 else
205 name = getstringvalue(op->cl_name);
206 sprintf(buf, "<class %.100s at %lx>", name, (long)op);
207 return newstringobject(buf);
208}
209
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210typeobject Classtype = {
211 OB_HEAD_INIT(&Typetype)
212 0,
213 "class",
214 sizeof(classobject),
215 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000216 (destructor)class_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000218 (getattrfunc)class_getattr, /*tp_getattr*/
219 (setattrfunc)class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 0, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221 (reprfunc)class_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 0, /*tp_as_number*/
223 0, /*tp_as_sequence*/
224 0, /*tp_as_mapping*/
225};
226
Guido van Rossum81daa321993-05-20 14:24:46 +0000227int
228issubclass(class, base)
229 object *class;
230 object *base;
231{
232 int i, n;
233 classobject *cp;
Guido van Rossum81daa321993-05-20 14:24:46 +0000234 if (class == base)
235 return 1;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000236 if (class == NULL || !is_classobject(class))
237 return 0;
Guido van Rossum81daa321993-05-20 14:24:46 +0000238 cp = (classobject *)class;
239 n = gettuplesize(cp->cl_bases);
240 for (i = 0; i < n; i++) {
241 if (issubclass(gettupleitem(cp->cl_bases, i), base))
242 return 1;
243 }
244 return 0;
245}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246
Guido van Rossum81daa321993-05-20 14:24:46 +0000247
248/* Instance objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249
Guido van Rossum81daa321993-05-20 14:24:46 +0000250static int
251addaccess(class, inst)
252 classobject *class;
253 instanceobject *inst;
254{
255 int i, n, pos, ret;
256 object *key, *value, *ac;
257
258 n = gettuplesize(class->cl_bases);
259 for (i = 0; i < n; i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260 if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
Guido van Rossum81daa321993-05-20 14:24:46 +0000261 return -1;
262 }
263
264 pos = 0;
265 while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
266 if (!is_accessobject(value))
267 continue;
Guido van Rossumb3f72581993-05-21 19:56:10 +0000268 if (hasaccessvalue(value))
269 continue;
Guido van Rossum81daa321993-05-20 14:24:46 +0000270 ac = dict2lookup(inst->in_dict, key);
271 if (ac != NULL && is_accessobject(ac)) {
272 err_setval(ConflictError, key);
273 return -1;
274 }
275 ac = cloneaccessobject(value);
276 if (ac == NULL)
277 return -1;
278 ret = dict2insert(inst->in_dict, key, ac);
279 DECREF(ac);
280 if (ret != 0)
281 return -1;
282 }
283 return 0;
284}
285
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286object *
Guido van Rossuma83f2701995-07-26 18:07:32 +0000287newinstanceobject(class, arg, kw)
Guido van Rossum25831651993-05-19 14:50:45 +0000288 object *class;
289 object *arg;
Guido van Rossuma83f2701995-07-26 18:07:32 +0000290 object *kw;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291{
Guido van Rossume8122f11991-05-05 20:03:07 +0000292 register instanceobject *inst;
Guido van Rossum25831651993-05-19 14:50:45 +0000293 object *init;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000295 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 return NULL;
297 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000298 inst = NEWOBJ(instanceobject, &Instancetype);
299 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
301 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000302 inst->in_class = (classobject *)class;
Guido van Rossum81daa321993-05-20 14:24:46 +0000303 inst->in_dict = newdictobject();
304 if (inst->in_dict == NULL ||
305 addaccess((classobject *)class, inst) != 0) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000306 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 return NULL;
308 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000309 init = instance_getattr1(inst, "__init__");
Guido van Rossum25831651993-05-19 14:50:45 +0000310 if (init == NULL) {
311 err_clear();
Guido van Rossuma83f2701995-07-26 18:07:32 +0000312 if (arg != NULL && (!is_tupleobject(arg) ||
313 gettuplesize(arg) != 0) || kw != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000314 err_setstr(TypeError,
Guido van Rossuma83f2701995-07-26 18:07:32 +0000315 "this constructor takes no arguments");
Guido van Rossum25831651993-05-19 14:50:45 +0000316 DECREF(inst);
317 inst = NULL;
318 }
319 }
320 else {
Guido van Rossuma83f2701995-07-26 18:07:32 +0000321 object *res = PyEval_CallObjectWithKeywords(init, arg, kw);
Guido van Rossum25831651993-05-19 14:50:45 +0000322 DECREF(init);
323 if (res == NULL) {
324 DECREF(inst);
325 inst = NULL;
326 }
327 else {
328 if (res != None) {
329 err_setstr(TypeError,
330 "__init__() should return None");
331 DECREF(inst);
332 inst = NULL;
333 }
334 DECREF(res);
335 }
336 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000337 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338}
339
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000340/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341
342static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000343instance_dealloc(inst)
344 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000346 object *error_type, *error_value, *error_traceback;
Guido van Rossum25831651993-05-19 14:50:45 +0000347 object *del;
348 /* Call the __del__ method if it exists. First temporarily
349 revive the object and save the current exception, if any. */
350 INCREF(inst);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000351 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000352 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000353 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000354 DECREF(del);
355 XDECREF(res);
356 /* XXX If __del__ raised an exception, it is ignored! */
357 }
358 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000359 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000360 /* Can't use DECREF here, it would cause a recursive call */
361 if (--inst->ob_refcnt > 0)
362 return; /* __del__ added a reference; don't delete now */
Guido van Rossume8122f11991-05-05 20:03:07 +0000363 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000364 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000365 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
Guido van Rossume7737541994-09-05 07:31:41 +0000368static object *
369instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000370 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 register char *name;
372{
Guido van Rossum94308391991-10-20 20:11:48 +0000373 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000374 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000375 if (name[0] == '_' && name[1] == '_') {
376 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000377 if (getrestricted()) {
378 err_setstr(RuntimeError,
379 "instance.__dict__ not accessible in restricted mode");
380 return NULL;
381 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000382 INCREF(inst->in_dict);
383 return inst->in_dict;
384 }
385 if (strcmp(name, "__class__") == 0) {
386 INCREF(inst->in_class);
387 return (object *)inst->in_class;
388 }
Guido van Rossum94308391991-10-20 20:11:48 +0000389 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000390 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000391 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000392 if (v == NULL) {
393 v = class_lookup(inst->in_class, name, &class);
394 if (v == NULL) {
395 err_setstr(AttributeError, name);
396 return NULL;
397 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000399 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000400 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000401 if (v == NULL)
402 return NULL;
403 }
404 else
405 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000406 if (class != NULL) {
407 if (is_funcobject(v)) {
408 object *w = newinstancemethodobject(v, (object *)inst,
409 (object *)class);
410 DECREF(v);
411 v = w;
412 }
413 else if (is_instancemethodobject(v)) {
414 object *im_class = instancemethodgetclass(v);
415 /* Only if classes are compatible */
416 if (issubclass((object *)class, im_class)) {
417 object *im_func = instancemethodgetfunc(v);
418 object *w = newinstancemethodobject(im_func,
419 (object *)inst, im_class);
420 DECREF(v);
421 v = w;
422 }
423 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000424 }
425 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}
427
Guido van Rossume7737541994-09-05 07:31:41 +0000428static object *
429instance_getattr(inst, name)
430 register instanceobject *inst;
431 register char *name;
432{
433 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000434 res = instance_getattr1(inst, name);
435 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
436 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000437 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000438 args = mkvalue("(Os)", inst, name);
439 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000440 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000441 res = call_object(func, args);
442 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000443 }
444 return res;
445}
446
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447static int
Guido van Rossume7737541994-09-05 07:31:41 +0000448instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000449 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450 char *name;
451 object *v;
452{
Guido van Rossum25831651993-05-19 14:50:45 +0000453 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000454 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000455 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000456 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000457 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000458 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000459 if (rv < 0)
460 err_setstr(AttributeError,
461 "delete non-existing instance attribute");
462 return rv;
463 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000465 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466}
467
Guido van Rossume7737541994-09-05 07:31:41 +0000468static int
469instance_setattr(inst, name, v)
470 instanceobject *inst;
471 char *name;
472 object *v;
473{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000474 object *func, *args, *res;
475 if (name[0] == '_' && name[1] == '_') {
476 int n = strlen(name);
477 if (name[n-1] == '_' && name[n-2] == '_') {
478 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000479 return -1;
480 }
Guido van Rossume7737541994-09-05 07:31:41 +0000481 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000482 if (v == NULL)
483 func = inst->in_class->cl_delattr;
484 else
485 func = inst->in_class->cl_setattr;
486 if (func == NULL)
487 return instance_setattr1(inst, name, v);
488 if (v == NULL)
489 args = mkvalue("(Os)", inst, name);
490 else
491 args = mkvalue("(OsO)", inst, name, v);
492 if (args == NULL)
493 return -1;
494 res = call_object(func, args);
495 DECREF(args);
496 if (res == NULL)
497 return -1;
498 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000499 return 0;
500}
501
Guido van Rossum9bfef441993-03-29 10:43:31 +0000502static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000503instance_repr(inst)
504 instanceobject *inst;
505{
506 object *func;
507 object *res;
508
509 func = instance_getattr(inst, "__repr__");
510 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000511 char buf[140];
512 object *classname = inst->in_class->cl_name;
513 char *cname;
514 if (classname != NULL && is_stringobject(classname))
515 cname = getstringvalue(classname);
516 else
517 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000518 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000519 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000520 return newstringobject(buf);
521 }
522 res = call_object(func, (object *)NULL);
523 DECREF(func);
524 return res;
525}
526
Guido van Rossume7d444f1995-01-07 12:35:18 +0000527static object *
528instance_compare1(inst, other)
529 object *inst, *other;
530{
531 return instancebinop(inst, other, "__cmp__", "__rcmp__",
532 instance_compare1);
533}
534
Guido van Rossum9bfef441993-03-29 10:43:31 +0000535static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000536instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000537 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000538{
Guido van Rossum03093a21994-09-28 15:51:32 +0000539 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000540 long outcome;
541 result = instance_compare1(inst, other);
542 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000543 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000544 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000545 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000546 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000547 outcome = getintvalue(result);
548 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000549 if (outcome < 0)
550 return -1;
551 else if (outcome > 0)
552 return 1;
553 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000554}
555
Guido van Rossum9bfef441993-03-29 10:43:31 +0000556static long
557instance_hash(inst)
558 instanceobject *inst;
559{
560 object *func;
561 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000562 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000563
564 func = instance_getattr(inst, "__hash__");
565 if (func == NULL) {
566 /* If there is no __cmp__ method, we hash on the address.
567 If a __cmp__ method exists, there must be a __hash__. */
568 err_clear();
569 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000570 if (func == NULL) {
571 err_clear();
572 outcome = (long)inst;
573 if (outcome == -1)
574 outcome = -2;
575 return outcome;
576 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000577 err_setstr(TypeError, "unhashable instance");
578 return -1;
579 }
580 res = call_object(func, (object *)NULL);
581 DECREF(func);
582 if (res == NULL)
583 return -1;
584 if (is_intobject(res)) {
585 outcome = getintvalue(res);
586 if (outcome == -1)
587 outcome = -2;
588 }
589 else {
590 err_setstr(TypeError, "__hash__() should return an int");
591 outcome = -1;
592 }
593 DECREF(res);
594 return outcome;
595}
596
597static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000598instance_length(inst)
599 instanceobject *inst;
600{
601 object *func;
602 object *res;
603 int outcome;
604
605 func = instance_getattr(inst, "__len__");
606 if (func == NULL)
607 return -1;
608 res = call_object(func, (object *)NULL);
609 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000610 if (res == NULL)
611 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000612 if (is_intobject(res)) {
613 outcome = getintvalue(res);
614 if (outcome < 0)
615 err_setstr(ValueError, "__len__() should return >= 0");
616 }
617 else {
618 err_setstr(TypeError, "__len__() should return an int");
619 outcome = -1;
620 }
621 DECREF(res);
622 return outcome;
623}
624
Guido van Rossum9bfef441993-03-29 10:43:31 +0000625static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000626instance_subscript(inst, key)
627 instanceobject *inst;
628 object *key;
629{
630 object *func;
631 object *arg;
632 object *res;
633
634 func = instance_getattr(inst, "__getitem__");
635 if (func == NULL)
636 return NULL;
637 arg = mkvalue("(O)", key);
638 if (arg == NULL) {
639 DECREF(func);
640 return NULL;
641 }
642 res = call_object(func, arg);
643 DECREF(func);
644 DECREF(arg);
645 return res;
646}
647
Guido van Rossum9bfef441993-03-29 10:43:31 +0000648static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000649instance_ass_subscript(inst, key, value)
650 instanceobject*inst;
651 object *key;
652 object *value;
653{
654 object *func;
655 object *arg;
656 object *res;
657
658 if (value == NULL)
659 func = instance_getattr(inst, "__delitem__");
660 else
661 func = instance_getattr(inst, "__setitem__");
662 if (func == NULL)
663 return -1;
664 if (value == NULL)
665 arg = mkvalue("(O)", key);
666 else
667 arg = mkvalue("(OO)", key, value);
668 if (arg == NULL) {
669 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000670 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000671 }
672 res = call_object(func, arg);
673 DECREF(func);
674 DECREF(arg);
675 if (res == NULL)
676 return -1;
677 DECREF(res);
678 return 0;
679}
680
Guido van Rossum9bfef441993-03-29 10:43:31 +0000681static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682 (inquiry)instance_length, /*mp_length*/
683 (binaryfunc)instance_subscript, /*mp_subscript*/
684 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000685};
686
687static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000688instance_item(inst, i)
689 instanceobject *inst;
690 int i;
691{
692 object *func, *arg, *res;
693
694 func = instance_getattr(inst, "__getitem__");
695 if (func == NULL)
696 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000697 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000698 if (arg == NULL) {
699 DECREF(func);
700 return NULL;
701 }
702 res = call_object(func, arg);
703 DECREF(func);
704 DECREF(arg);
705 return res;
706}
707
708static object *
709instance_slice(inst, i, j)
710 instanceobject *inst;
711 int i, j;
712{
713 object *func, *arg, *res;
714
715 func = instance_getattr(inst, "__getslice__");
716 if (func == NULL)
717 return NULL;
718 arg = mkvalue("(ii)", i, j);
719 if (arg == NULL) {
720 DECREF(func);
721 return NULL;
722 }
723 res = call_object(func, arg);
724 DECREF(func);
725 DECREF(arg);
726 return res;
727}
728
729static int
730instance_ass_item(inst, i, item)
731 instanceobject *inst;
732 int i;
733 object *item;
734{
735 object *func, *arg, *res;
736
737 if (item == NULL)
738 func = instance_getattr(inst, "__delitem__");
739 else
740 func = instance_getattr(inst, "__setitem__");
741 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000742 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743 if (item == NULL)
744 arg = mkvalue("i", i);
745 else
746 arg = mkvalue("(iO)", i, item);
747 if (arg == NULL) {
748 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000749 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000750 }
751 res = call_object(func, arg);
752 DECREF(func);
753 DECREF(arg);
754 if (res == NULL)
755 return -1;
756 DECREF(res);
757 return 0;
758}
759
760static int
761instance_ass_slice(inst, i, j, value)
762 instanceobject *inst;
763 int i, j;
764 object *value;
765{
766 object *func, *arg, *res;
767
768 if (value == NULL)
769 func = instance_getattr(inst, "__delslice__");
770 else
771 func = instance_getattr(inst, "__setslice__");
772 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000773 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774 if (value == NULL)
775 arg = mkvalue("(ii)", i, j);
776 else
777 arg = mkvalue("(iiO)", i, j, value);
778 if (arg == NULL) {
779 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000780 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000781 }
782 res = call_object(func, arg);
783 DECREF(func);
784 DECREF(arg);
785 if (res == NULL)
786 return -1;
787 DECREF(res);
788 return 0;
789}
790
791static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000792 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000793 0, /*sq_concat*/
794 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000795 (intargfunc)instance_item, /*sq_item*/
796 (intintargfunc)instance_slice, /*sq_slice*/
797 (intobjargproc)instance_ass_item, /*sq_ass_item*/
798 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799};
800
801static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000802generic_unary_op(self, methodname)
803 instanceobject *self;
804 char *methodname;
805{
806 object *func, *res;
807
808 if ((func = instance_getattr(self, methodname)) == NULL)
809 return NULL;
810 res = call_object(func, (object *)NULL);
811 DECREF(func);
812 return res;
813}
814
Guido van Rossum03093a21994-09-28 15:51:32 +0000815
816/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000817static int halfbinop PROTO((object *, object *, char *, object **,
818 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000819
820
821/* Implement a binary operator involving at least one class instance. */
822
823object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000824instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000825 object *v;
826 object *w;
827 char *opname;
828 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000829 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000830{
831 char buf[256];
832 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000833 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000834 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000835 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000836 return result;
837 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
838 err_setstr(TypeError, buf);
839 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000840}
841
Guido van Rossum03093a21994-09-28 15:51:32 +0000842
843/* Try one half of a binary operator involving a class instance.
844 Return value:
845 -1 if an exception is to be reported right away
846 0 if we have a valid result
847 1 if we could try another operation
848*/
849
850static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000851halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000852 object *v;
853 object *w;
854 char *opname;
855 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000856 object * (*thisfunc) PROTO((object *, object *));
857 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000858{
859 object *func;
860 object *args;
861 object *coerce;
862 object *coerced = NULL;
863 object *v1;
864
865 if (!is_instanceobject(v))
866 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000867 coerce = getattr(v, "__coerce__");
868 if (coerce == NULL) {
869 err_clear();
870 }
871 else {
872 args = mkvalue("(O)", w);
873 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000874 return -1;
875 }
876 coerced = call_object(coerce, args);
877 DECREF(args);
878 DECREF(coerce);
879 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000880 return -1;
881 }
882 if (coerced == None) {
883 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000884 return 1;
885 }
886 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
887 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000888 err_setstr(TypeError,
889 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000890 return -1;
891 }
892 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000893 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000894 if (v1 != v) {
895 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000896 if (!is_instanceobject(v) && !is_instanceobject(w)) {
897 if (swapped)
898 *r_result = (*thisfunc)(w, v);
899 else
900 *r_result = (*thisfunc)(v, w);
901 DECREF(coerced);
902 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000903 }
904 }
905 w = gettupleitem(coerced, 1);
906 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000907 func = getattr(v, opname);
908 if (func == NULL) {
909 XDECREF(coerced);
910 if (err_occurred() != AttributeError)
911 return -1;
912 err_clear();
913 return 1;
914 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000915 args = mkvalue("(O)", w);
916 if (args == NULL) {
917 DECREF(func);
918 XDECREF(coerced);
919 return -1;
920 }
921 *r_result = call_object(func, args);
922 DECREF(args);
923 DECREF(func);
924 XDECREF(coerced);
925 return *r_result == NULL ? -1 : 0;
926}
927
Guido van Rossum879c5811995-01-10 15:24:06 +0000928static int
929instance_coerce(pv, pw)
930 object **pv;
931 object **pw;
932{
933 object *v = *pv;
934 object *w = *pw;
935 object *coerce;
936 object *args;
937 object *coerced;
938
939 coerce = getattr(v, "__coerce__");
940 if (coerce == NULL) {
941 /* No __coerce__ method: always OK */
942 err_clear();
943 INCREF(v);
944 INCREF(w);
945 return 0;
946 }
947 /* Has __coerce__ method: call it */
948 args = mkvalue("(O)", w);
949 if (args == NULL) {
950 return -1;
951 }
952 coerced = call_object(coerce, args);
953 DECREF(args);
954 DECREF(coerce);
955 if (coerced == NULL) {
956 /* __coerce__ call raised an exception */
957 return -1;
958 }
959 if (coerced == None) {
960 /* __coerce__ says "I can't do it" */
961 DECREF(coerced);
962 return 1;
963 }
964 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
965 /* __coerce__ return value is malformed */
966 DECREF(coerced);
967 err_setstr(TypeError,
968 "coercion should return None or 2-tuple");
969 return -1;
970 }
971 /* __coerce__ returned two new values */
972 *pv = gettupleitem(coerced, 0);
973 *pw = gettupleitem(coerced, 1);
974 INCREF(*pv);
975 INCREF(*pw);
976 DECREF(coerced);
977 return 0;
978}
979
Guido van Rossum03093a21994-09-28 15:51:32 +0000980
Guido van Rossum04691fc1992-08-12 15:35:34 +0000981#define UNARY(funcname, methodname) \
982static object *funcname(self) instanceobject *self; { \
983 return generic_unary_op(self, methodname); \
984}
985
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986UNARY(instance_neg, "__neg__")
987UNARY(instance_pos, "__pos__")
988UNARY(instance_abs, "__abs__")
989
Guido van Rossum9bfef441993-03-29 10:43:31 +0000990static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000991instance_nonzero(self)
992 instanceobject *self;
993{
994 object *func, *res;
995 long outcome;
996
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000997 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000998 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000999 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001000 err_clear();
1001 /* Fall back to the default behavior:
1002 all instances are nonzero */
1003 return 1;
1004 }
1005 }
1006 res = call_object(func, (object *)NULL);
1007 DECREF(func);
1008 if (res == NULL)
1009 return -1;
1010 if (!is_intobject(res)) {
1011 DECREF(res);
1012 err_setstr(TypeError, "__nonzero__ should return an int");
1013 return -1;
1014 }
1015 outcome = getintvalue(res);
1016 DECREF(res);
1017 if (outcome < 0) {
1018 err_setstr(ValueError, "__nonzero__ should return >= 0");
1019 return -1;
1020 }
1021 return outcome > 0;
1022}
1023
1024UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001025UNARY(instance_int, "__int__")
1026UNARY(instance_long, "__long__")
1027UNARY(instance_float, "__float__")
1028UNARY(instance_oct, "__oct__")
1029UNARY(instance_hex, "__hex__")
1030
Guido van Rossum03093a21994-09-28 15:51:32 +00001031/* This version is for ternary calls only (z != None) */
1032static object *
1033instance_pow(v, w, z)
1034 object *v;
1035 object *w;
1036 object *z;
1037{
1038 /* XXX Doesn't do coercions... */
1039 object *func;
1040 object *args;
1041 object *result;
1042 func = getattr(v, "__pow__");
1043 if (func == NULL)
1044 return NULL;
1045 args = mkvalue("(OO)", w, z);
1046 if (args == NULL) {
1047 DECREF(func);
1048 return NULL;
1049 }
1050 result = call_object(func, args);
1051 DECREF(func);
1052 DECREF(args);
1053 return result;
1054}
1055
Guido van Rossum04691fc1992-08-12 15:35:34 +00001056static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001057 0, /*nb_add*/
1058 0, /*nb_subtract*/
1059 0, /*nb_multiply*/
1060 0, /*nb_divide*/
1061 0, /*nb_remainder*/
1062 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001063 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001064 (unaryfunc)instance_neg, /*nb_negative*/
1065 (unaryfunc)instance_pos, /*nb_positive*/
1066 (unaryfunc)instance_abs, /*nb_absolute*/
1067 (inquiry)instance_nonzero, /*nb_nonzero*/
1068 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001069 0, /*nb_lshift*/
1070 0, /*nb_rshift*/
1071 0, /*nb_and*/
1072 0, /*nb_xor*/
1073 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001074 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001075 (unaryfunc)instance_int, /*nb_int*/
1076 (unaryfunc)instance_long, /*nb_long*/
1077 (unaryfunc)instance_float, /*nb_float*/
1078 (unaryfunc)instance_oct, /*nb_oct*/
1079 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080};
1081
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001082typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001083 OB_HEAD_INIT(&Typetype)
1084 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001085 "instance",
1086 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001087 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001089 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001090 (getattrfunc)instance_getattr, /*tp_getattr*/
1091 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001092 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001093 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001094 &instance_as_number, /*tp_as_number*/
1095 &instance_as_sequence, /*tp_as_sequence*/
1096 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001097 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001098};
1099
1100
Guido van Rossum81daa321993-05-20 14:24:46 +00001101/* Instance method objects are used for two purposes:
1102 (a) as bound instance methods (returned by instancename.methodname)
1103 (b) as unbound methods (returned by ClassName.methodname)
1104 In case (b), im_self is NULL
1105*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001106
1107typedef struct {
1108 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001109 object *im_func; /* The function implementing the method */
1110 object *im_self; /* The instance it is bound to, or NULL */
1111 object *im_class; /* The class that defined the method */
Guido van Rossume7d444f1995-01-07 12:35:18 +00001112 object *im_doc; /* The documentation string */
Guido van Rossume8122f11991-05-05 20:03:07 +00001113} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114
1115object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001116newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117 object *func;
1118 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001119 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120{
Guido van Rossume8122f11991-05-05 20:03:07 +00001121 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001123 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001124 return NULL;
1125 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001126 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1127 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001128 return NULL;
1129 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001130 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001131 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001132 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001133 INCREF(class);
1134 im->im_class = class;
Guido van Rossume7d444f1995-01-07 12:35:18 +00001135 XINCREF(((funcobject *)func)->func_doc);
1136 im->im_doc = ((funcobject *)func)->func_doc;
Guido van Rossume8122f11991-05-05 20:03:07 +00001137 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138}
1139
1140object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001141instancemethodgetfunc(im)
1142 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143{
Guido van Rossume8122f11991-05-05 20:03:07 +00001144 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001145 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001146 return NULL;
1147 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001148 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149}
1150
1151object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001152instancemethodgetself(im)
1153 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001154{
Guido van Rossume8122f11991-05-05 20:03:07 +00001155 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001156 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001157 return NULL;
1158 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001159 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001160}
1161
Guido van Rossum81daa321993-05-20 14:24:46 +00001162object *
1163instancemethodgetclass(im)
1164 register object *im;
1165{
1166 if (!is_instancemethodobject(im)) {
1167 err_badcall();
1168 return NULL;
1169 }
1170 return ((instancemethodobject *)im)->im_class;
1171}
1172
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001173/* Class method methods */
1174
Guido van Rossume8122f11991-05-05 20:03:07 +00001175#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176
Guido van Rossume8122f11991-05-05 20:03:07 +00001177static struct memberlist instancemethod_memberlist[] = {
1178 {"im_func", T_OBJECT, OFF(im_func)},
1179 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001180 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossume7d444f1995-01-07 12:35:18 +00001181 {"im_doc", T_OBJECT, OFF(im_doc)},
1182 {"__doc__", T_OBJECT, OFF(im_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183 {NULL} /* Sentinel */
1184};
1185
1186static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001187instancemethod_getattr(im, name)
1188 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001189 char *name;
1190{
Guido van Rossum10393b11995-01-10 10:39:49 +00001191 if (name[0] != '_' && getrestricted()) {
1192 err_setstr(RuntimeError,
1193 "instance-method attributes not accessible in restricted mode");
1194 return NULL;
1195 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001196 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197}
1198
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001199static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001200instancemethod_dealloc(im)
1201 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001202{
Guido van Rossume8122f11991-05-05 20:03:07 +00001203 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001204 XDECREF(im->im_self);
1205 DECREF(im->im_class);
Guido van Rossume7d444f1995-01-07 12:35:18 +00001206 XDECREF(im->im_doc);
Guido van Rossume8122f11991-05-05 20:03:07 +00001207 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001208}
1209
Guido van Rossumebc8c511992-09-03 20:39:51 +00001210static int
1211instancemethod_compare(a, b)
1212 instancemethodobject *a, *b;
1213{
Guido van Rossume9df7271995-04-06 14:46:51 +00001214 if (a->im_self != b->im_self)
1215 return (a->im_self < b->im_self) ? -1 : 1;
1216 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001217}
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};