blob: 27f1f26858fbbbbd209891ff03c86dbb957973b9 [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. */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000350#ifdef Py_TRACE_REFS
351 /* much too complicated if Py_TRACE_REFS defined */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000352 extern long ref_total;
353 inst->ob_type = &Instancetype;
Sjoerd Mullender6f011d71995-09-18 10:49:04 +0000354 NEWREF(inst);
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000355 ref_total--; /* compensate for increment in NEWREF */
356#ifdef COUNT_ALLOCS
357 inst->ob_type->tp_alloc--; /* ditto */
358#endif
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000359#else /* !Py_TRACE_REFS */
Guido van Rossum25831651993-05-19 14:50:45 +0000360 INCREF(inst);
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000361#endif /* !Py_TRACE_REFS */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000362 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000363 if ((del = instance_getattr1(inst, "__del__")) != NULL) {
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000364 object *res = call_object(del, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +0000365 DECREF(del);
366 XDECREF(res);
367 /* XXX If __del__ raised an exception, it is ignored! */
368 }
369 /* Restore the saved exception and undo the temporary revival */
Guido van Rossumd7047b31995-01-02 19:07:15 +0000370 err_restore(error_type, error_value, error_traceback);
Guido van Rossum25831651993-05-19 14:50:45 +0000371 /* Can't use DECREF here, it would cause a recursive call */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000372 if (--inst->ob_refcnt > 0) {
373#ifdef COUNT_ALLOCS
374 inst->ob_type->tp_free--;
375#endif
Guido van Rossum25831651993-05-19 14:50:45 +0000376 return; /* __del__ added a reference; don't delete now */
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000377 }
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000378#ifdef Py_TRACE_REFS
Sjoerd Mullender740f3571995-08-28 09:00:43 +0000379#ifdef COUNT_ALLOCS
380 inst->ob_type->tp_free--; /* compensate for increment in UNREF */
381#endif
382 UNREF(inst);
383 inst->ob_type = NULL;
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000384#endif /* Py_TRACE_REFS */
Guido van Rossume8122f11991-05-05 20:03:07 +0000385 DECREF(inst->in_class);
Guido van Rossum81daa321993-05-20 14:24:46 +0000386 XDECREF(inst->in_dict);
Guido van Rossume8122f11991-05-05 20:03:07 +0000387 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388}
389
Guido van Rossume7737541994-09-05 07:31:41 +0000390static object *
391instance_getattr1(inst, name)
Guido van Rossume8122f11991-05-05 20:03:07 +0000392 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 register char *name;
394{
Guido van Rossum94308391991-10-20 20:11:48 +0000395 register object *v;
Guido van Rossum81daa321993-05-20 14:24:46 +0000396 classobject *class;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000397 if (name[0] == '_' && name[1] == '_') {
398 if (strcmp(name, "__dict__") == 0) {
Guido van Rossum10393b11995-01-10 10:39:49 +0000399 if (getrestricted()) {
400 err_setstr(RuntimeError,
401 "instance.__dict__ not accessible in restricted mode");
402 return NULL;
403 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000404 INCREF(inst->in_dict);
405 return inst->in_dict;
406 }
407 if (strcmp(name, "__class__") == 0) {
408 INCREF(inst->in_class);
409 return (object *)inst->in_class;
410 }
Guido van Rossum94308391991-10-20 20:11:48 +0000411 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000412 class = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000413 v = dictlookup(inst->in_dict, name);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000414 if (v == NULL) {
415 v = class_lookup(inst->in_class, name, &class);
416 if (v == NULL) {
417 err_setstr(AttributeError, name);
418 return NULL;
419 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000421 if (is_accessobject(v)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000422 v = getaccessvalue(v, getowner());
Guido van Rossumb3f72581993-05-21 19:56:10 +0000423 if (v == NULL)
424 return NULL;
425 }
426 else
427 INCREF(v);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000428 if (class != NULL) {
429 if (is_funcobject(v)) {
430 object *w = newinstancemethodobject(v, (object *)inst,
431 (object *)class);
432 DECREF(v);
433 v = w;
434 }
435 else if (is_instancemethodobject(v)) {
436 object *im_class = instancemethodgetclass(v);
437 /* Only if classes are compatible */
438 if (issubclass((object *)class, im_class)) {
439 object *im_func = instancemethodgetfunc(v);
440 object *w = newinstancemethodobject(im_func,
441 (object *)inst, im_class);
442 DECREF(v);
443 v = w;
444 }
445 }
Guido van Rossumb3f72581993-05-21 19:56:10 +0000446 }
447 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448}
449
Guido van Rossume7737541994-09-05 07:31:41 +0000450static object *
451instance_getattr(inst, name)
452 register instanceobject *inst;
453 register char *name;
454{
455 register object *func, *res;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000456 res = instance_getattr1(inst, name);
457 if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
458 object *args;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000459 err_clear();
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000460 args = mkvalue("(Os)", inst, name);
461 if (args == NULL)
Guido van Rossume7737541994-09-05 07:31:41 +0000462 return NULL;
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000463 res = call_object(func, args);
464 DECREF(args);
Guido van Rossume7737541994-09-05 07:31:41 +0000465 }
466 return res;
467}
468
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469static int
Guido van Rossume7737541994-09-05 07:31:41 +0000470instance_setattr1(inst, name, v)
Guido van Rossume8122f11991-05-05 20:03:07 +0000471 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 char *name;
473 object *v;
474{
Guido van Rossum25831651993-05-19 14:50:45 +0000475 object *ac;
Guido van Rossum81daa321993-05-20 14:24:46 +0000476 ac = dictlookup(inst->in_dict, name);
Guido van Rossum25831651993-05-19 14:50:45 +0000477 if (ac != NULL && is_accessobject(ac))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000478 return setaccessvalue(ac, getowner(), v);
Guido van Rossum94472a01992-09-04 09:45:18 +0000479 if (v == NULL) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000480 int rv = dictremove(inst->in_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000481 if (rv < 0)
482 err_setstr(AttributeError,
483 "delete non-existing instance attribute");
484 return rv;
485 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 else
Guido van Rossum81daa321993-05-20 14:24:46 +0000487 return dictinsert(inst->in_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488}
489
Guido van Rossume7737541994-09-05 07:31:41 +0000490static int
491instance_setattr(inst, name, v)
492 instanceobject *inst;
493 char *name;
494 object *v;
495{
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000496 object *func, *args, *res;
Guido van Rossum3cb48681996-07-21 02:29:46 +0000497 if (name[0] == '_' && name[1] == '_'
498 && (strcmp(name, "__dict__") == 0 ||
499 strcmp(name, "__class__") == 0)) {
500 int n = strlen(name);
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000501 if (name[n-1] == '_' && name[n-2] == '_') {
502 err_setstr(TypeError, "read-only special attribute");
Guido van Rossume7737541994-09-05 07:31:41 +0000503 return -1;
504 }
Guido van Rossume7737541994-09-05 07:31:41 +0000505 }
Guido van Rossum52ca98a1994-09-05 07:32:29 +0000506 if (v == NULL)
507 func = inst->in_class->cl_delattr;
508 else
509 func = inst->in_class->cl_setattr;
510 if (func == NULL)
511 return instance_setattr1(inst, name, v);
512 if (v == NULL)
513 args = mkvalue("(Os)", inst, name);
514 else
515 args = mkvalue("(OsO)", inst, name, v);
516 if (args == NULL)
517 return -1;
518 res = call_object(func, args);
519 DECREF(args);
520 if (res == NULL)
521 return -1;
522 DECREF(res);
Guido van Rossume7737541994-09-05 07:31:41 +0000523 return 0;
524}
525
Guido van Rossum9bfef441993-03-29 10:43:31 +0000526static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000527instance_repr(inst)
528 instanceobject *inst;
529{
530 object *func;
531 object *res;
532
533 func = instance_getattr(inst, "__repr__");
534 if (func == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000535 char buf[140];
536 object *classname = inst->in_class->cl_name;
537 char *cname;
538 if (classname != NULL && is_stringobject(classname))
539 cname = getstringvalue(classname);
540 else
541 cname = "?";
Guido van Rossum04691fc1992-08-12 15:35:34 +0000542 err_clear();
Guido van Rossum25831651993-05-19 14:50:45 +0000543 sprintf(buf, "<%.100s instance at %lx>", cname, (long)inst);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000544 return newstringobject(buf);
545 }
546 res = call_object(func, (object *)NULL);
547 DECREF(func);
548 return res;
549}
550
Guido van Rossume7d444f1995-01-07 12:35:18 +0000551static object *
552instance_compare1(inst, other)
553 object *inst, *other;
554{
555 return instancebinop(inst, other, "__cmp__", "__rcmp__",
556 instance_compare1);
557}
558
Guido van Rossum9bfef441993-03-29 10:43:31 +0000559static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000560instance_compare(inst, other)
Guido van Rossum03093a21994-09-28 15:51:32 +0000561 object *inst, *other;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000562{
Guido van Rossum03093a21994-09-28 15:51:32 +0000563 object *result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000564 long outcome;
565 result = instance_compare1(inst, other);
566 if (result == NULL || !is_intobject(result)) {
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000567 error:
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000568 err_clear();
Guido van Rossumbb3c5f71994-11-10 22:31:02 +0000569 return (inst < other) ? -1 : 1;
Sjoerd Mullenderb9a6d121994-10-19 15:11:52 +0000570 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000571 outcome = getintvalue(result);
572 DECREF(result);
Guido van Rossum03093a21994-09-28 15:51:32 +0000573 if (outcome < 0)
574 return -1;
575 else if (outcome > 0)
576 return 1;
577 return 0;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000578}
579
Guido van Rossum9bfef441993-03-29 10:43:31 +0000580static long
581instance_hash(inst)
582 instanceobject *inst;
583{
584 object *func;
585 object *res;
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000586 long outcome;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000587
588 func = instance_getattr(inst, "__hash__");
589 if (func == NULL) {
590 /* If there is no __cmp__ method, we hash on the address.
591 If a __cmp__ method exists, there must be a __hash__. */
592 err_clear();
593 func = instance_getattr(inst, "__cmp__");
Guido van Rossum8a0c3451993-04-08 12:56:19 +0000594 if (func == NULL) {
595 err_clear();
596 outcome = (long)inst;
597 if (outcome == -1)
598 outcome = -2;
599 return outcome;
600 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000601 err_setstr(TypeError, "unhashable instance");
602 return -1;
603 }
604 res = call_object(func, (object *)NULL);
605 DECREF(func);
606 if (res == NULL)
607 return -1;
608 if (is_intobject(res)) {
609 outcome = getintvalue(res);
610 if (outcome == -1)
611 outcome = -2;
612 }
613 else {
614 err_setstr(TypeError, "__hash__() should return an int");
615 outcome = -1;
616 }
617 DECREF(res);
618 return outcome;
619}
620
621static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000622instance_length(inst)
623 instanceobject *inst;
624{
625 object *func;
626 object *res;
627 int outcome;
628
629 func = instance_getattr(inst, "__len__");
630 if (func == NULL)
631 return -1;
632 res = call_object(func, (object *)NULL);
633 DECREF(func);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000634 if (res == NULL)
635 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000636 if (is_intobject(res)) {
637 outcome = getintvalue(res);
638 if (outcome < 0)
639 err_setstr(ValueError, "__len__() should return >= 0");
640 }
641 else {
642 err_setstr(TypeError, "__len__() should return an int");
643 outcome = -1;
644 }
645 DECREF(res);
646 return outcome;
647}
648
Guido van Rossum9bfef441993-03-29 10:43:31 +0000649static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000650instance_subscript(inst, key)
651 instanceobject *inst;
652 object *key;
653{
654 object *func;
655 object *arg;
656 object *res;
657
658 func = instance_getattr(inst, "__getitem__");
659 if (func == NULL)
660 return NULL;
661 arg = mkvalue("(O)", key);
662 if (arg == NULL) {
663 DECREF(func);
664 return NULL;
665 }
666 res = call_object(func, arg);
667 DECREF(func);
668 DECREF(arg);
669 return res;
670}
671
Guido van Rossum9bfef441993-03-29 10:43:31 +0000672static int
Guido van Rossum04691fc1992-08-12 15:35:34 +0000673instance_ass_subscript(inst, key, value)
674 instanceobject*inst;
675 object *key;
676 object *value;
677{
678 object *func;
679 object *arg;
680 object *res;
681
682 if (value == NULL)
683 func = instance_getattr(inst, "__delitem__");
684 else
685 func = instance_getattr(inst, "__setitem__");
686 if (func == NULL)
687 return -1;
688 if (value == NULL)
689 arg = mkvalue("(O)", key);
690 else
691 arg = mkvalue("(OO)", key, value);
692 if (arg == NULL) {
693 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000694 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000695 }
696 res = call_object(func, arg);
697 DECREF(func);
698 DECREF(arg);
699 if (res == NULL)
700 return -1;
701 DECREF(res);
702 return 0;
703}
704
Guido van Rossum9bfef441993-03-29 10:43:31 +0000705static mapping_methods instance_as_mapping = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000706 (inquiry)instance_length, /*mp_length*/
707 (binaryfunc)instance_subscript, /*mp_subscript*/
708 (objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000709};
710
711static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000712instance_item(inst, i)
713 instanceobject *inst;
714 int i;
715{
716 object *func, *arg, *res;
717
718 func = instance_getattr(inst, "__getitem__");
719 if (func == NULL)
720 return NULL;
Guido van Rossum1311e3c1995-07-12 02:22:06 +0000721 arg = mkvalue("(i)", i);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000722 if (arg == NULL) {
723 DECREF(func);
724 return NULL;
725 }
726 res = call_object(func, arg);
727 DECREF(func);
728 DECREF(arg);
729 return res;
730}
731
732static object *
733instance_slice(inst, i, j)
734 instanceobject *inst;
735 int i, j;
736{
737 object *func, *arg, *res;
738
739 func = instance_getattr(inst, "__getslice__");
740 if (func == NULL)
741 return NULL;
742 arg = mkvalue("(ii)", i, j);
743 if (arg == NULL) {
744 DECREF(func);
745 return NULL;
746 }
747 res = call_object(func, arg);
748 DECREF(func);
749 DECREF(arg);
750 return res;
751}
752
753static int
754instance_ass_item(inst, i, item)
755 instanceobject *inst;
756 int i;
757 object *item;
758{
759 object *func, *arg, *res;
760
761 if (item == NULL)
762 func = instance_getattr(inst, "__delitem__");
763 else
764 func = instance_getattr(inst, "__setitem__");
765 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000766 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767 if (item == NULL)
768 arg = mkvalue("i", i);
769 else
770 arg = mkvalue("(iO)", i, item);
771 if (arg == NULL) {
772 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000773 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000774 }
775 res = call_object(func, arg);
776 DECREF(func);
777 DECREF(arg);
778 if (res == NULL)
779 return -1;
780 DECREF(res);
781 return 0;
782}
783
784static int
785instance_ass_slice(inst, i, j, value)
786 instanceobject *inst;
787 int i, j;
788 object *value;
789{
790 object *func, *arg, *res;
791
792 if (value == NULL)
793 func = instance_getattr(inst, "__delslice__");
794 else
795 func = instance_getattr(inst, "__setslice__");
796 if (func == NULL)
Guido van Rossum6d946f91992-08-14 13:49:30 +0000797 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000798 if (value == NULL)
799 arg = mkvalue("(ii)", i, j);
800 else
801 arg = mkvalue("(iiO)", i, j, value);
802 if (arg == NULL) {
803 DECREF(func);
Guido van Rossum6d946f91992-08-14 13:49:30 +0000804 return -1;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000805 }
806 res = call_object(func, arg);
807 DECREF(func);
808 DECREF(arg);
809 if (res == NULL)
810 return -1;
811 DECREF(res);
812 return 0;
813}
814
815static sequence_methods instance_as_sequence = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816 (inquiry)instance_length, /*sq_length*/
Guido van Rossum03093a21994-09-28 15:51:32 +0000817 0, /*sq_concat*/
818 0, /*sq_repeat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000819 (intargfunc)instance_item, /*sq_item*/
820 (intintargfunc)instance_slice, /*sq_slice*/
821 (intobjargproc)instance_ass_item, /*sq_ass_item*/
822 (intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
Guido van Rossum04691fc1992-08-12 15:35:34 +0000823};
824
825static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826generic_unary_op(self, methodname)
827 instanceobject *self;
828 char *methodname;
829{
830 object *func, *res;
831
832 if ((func = instance_getattr(self, methodname)) == NULL)
833 return NULL;
834 res = call_object(func, (object *)NULL);
835 DECREF(func);
836 return res;
837}
838
Guido van Rossum03093a21994-09-28 15:51:32 +0000839
840/* Forward */
Guido van Rossume7d444f1995-01-07 12:35:18 +0000841static int halfbinop PROTO((object *, object *, char *, object **,
842 object * (*) PROTO((object *, object *)), int ));
Guido van Rossum03093a21994-09-28 15:51:32 +0000843
844
845/* Implement a binary operator involving at least one class instance. */
846
847object *
Guido van Rossume7d444f1995-01-07 12:35:18 +0000848instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum03093a21994-09-28 15:51:32 +0000849 object *v;
850 object *w;
851 char *opname;
852 char *ropname;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000853 object * (*thisfunc) PROTO((object *, object *));
Guido van Rossum03093a21994-09-28 15:51:32 +0000854{
855 char buf[256];
856 object *result = NULL;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000857 if (halfbinop(v, w, opname, &result, thisfunc, 0) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000858 return result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000859 if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
Guido van Rossum03093a21994-09-28 15:51:32 +0000860 return result;
861 sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
862 err_setstr(TypeError, buf);
863 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000864}
865
Guido van Rossum03093a21994-09-28 15:51:32 +0000866
867/* Try one half of a binary operator involving a class instance.
868 Return value:
869 -1 if an exception is to be reported right away
870 0 if we have a valid result
871 1 if we could try another operation
872*/
873
874static int
Guido van Rossume7d444f1995-01-07 12:35:18 +0000875halfbinop(v, w, opname, r_result, thisfunc, swapped)
Guido van Rossum03093a21994-09-28 15:51:32 +0000876 object *v;
877 object *w;
878 char *opname;
879 object **r_result;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000880 object * (*thisfunc) PROTO((object *, object *));
881 int swapped;
Guido van Rossum03093a21994-09-28 15:51:32 +0000882{
883 object *func;
884 object *args;
885 object *coerce;
886 object *coerced = NULL;
887 object *v1;
888
889 if (!is_instanceobject(v))
890 return 1;
Guido van Rossum03093a21994-09-28 15:51:32 +0000891 coerce = getattr(v, "__coerce__");
892 if (coerce == NULL) {
893 err_clear();
894 }
895 else {
896 args = mkvalue("(O)", w);
897 if (args == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000898 return -1;
899 }
900 coerced = call_object(coerce, args);
901 DECREF(args);
902 DECREF(coerce);
903 if (coerced == NULL) {
Guido van Rossum03093a21994-09-28 15:51:32 +0000904 return -1;
905 }
906 if (coerced == None) {
907 DECREF(coerced);
Guido van Rossum03093a21994-09-28 15:51:32 +0000908 return 1;
909 }
910 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
911 DECREF(coerced);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000912 err_setstr(TypeError,
913 "coercion should return None or 2-tuple");
Guido van Rossum03093a21994-09-28 15:51:32 +0000914 return -1;
915 }
916 v1 = gettupleitem(coerced, 0);
Guido van Rossume7d444f1995-01-07 12:35:18 +0000917 w = gettupleitem(coerced, 1);
Guido van Rossum03093a21994-09-28 15:51:32 +0000918 if (v1 != v) {
919 v = v1;
Guido van Rossume7d444f1995-01-07 12:35:18 +0000920 if (!is_instanceobject(v) && !is_instanceobject(w)) {
921 if (swapped)
922 *r_result = (*thisfunc)(w, v);
923 else
924 *r_result = (*thisfunc)(v, w);
925 DECREF(coerced);
926 return *r_result == NULL ? -1 : 0;
Guido van Rossum03093a21994-09-28 15:51:32 +0000927 }
928 }
929 w = gettupleitem(coerced, 1);
930 }
Guido van Rossume7d444f1995-01-07 12:35:18 +0000931 func = getattr(v, opname);
932 if (func == NULL) {
933 XDECREF(coerced);
934 if (err_occurred() != AttributeError)
935 return -1;
936 err_clear();
937 return 1;
938 }
Guido van Rossum03093a21994-09-28 15:51:32 +0000939 args = mkvalue("(O)", w);
940 if (args == NULL) {
941 DECREF(func);
942 XDECREF(coerced);
943 return -1;
944 }
945 *r_result = call_object(func, args);
946 DECREF(args);
947 DECREF(func);
948 XDECREF(coerced);
949 return *r_result == NULL ? -1 : 0;
950}
951
Guido van Rossum879c5811995-01-10 15:24:06 +0000952static int
953instance_coerce(pv, pw)
954 object **pv;
955 object **pw;
956{
957 object *v = *pv;
958 object *w = *pw;
959 object *coerce;
960 object *args;
961 object *coerced;
962
963 coerce = getattr(v, "__coerce__");
964 if (coerce == NULL) {
965 /* No __coerce__ method: always OK */
966 err_clear();
967 INCREF(v);
968 INCREF(w);
969 return 0;
970 }
971 /* Has __coerce__ method: call it */
972 args = mkvalue("(O)", w);
973 if (args == NULL) {
974 return -1;
975 }
976 coerced = call_object(coerce, args);
977 DECREF(args);
978 DECREF(coerce);
979 if (coerced == NULL) {
980 /* __coerce__ call raised an exception */
981 return -1;
982 }
983 if (coerced == None) {
984 /* __coerce__ says "I can't do it" */
985 DECREF(coerced);
986 return 1;
987 }
988 if (!is_tupleobject(coerced) || gettuplesize(coerced) != 2) {
989 /* __coerce__ return value is malformed */
990 DECREF(coerced);
991 err_setstr(TypeError,
992 "coercion should return None or 2-tuple");
993 return -1;
994 }
995 /* __coerce__ returned two new values */
996 *pv = gettupleitem(coerced, 0);
997 *pw = gettupleitem(coerced, 1);
998 INCREF(*pv);
999 INCREF(*pw);
1000 DECREF(coerced);
1001 return 0;
1002}
1003
Guido van Rossum03093a21994-09-28 15:51:32 +00001004
Guido van Rossum04691fc1992-08-12 15:35:34 +00001005#define UNARY(funcname, methodname) \
1006static object *funcname(self) instanceobject *self; { \
1007 return generic_unary_op(self, methodname); \
1008}
1009
Guido van Rossum04691fc1992-08-12 15:35:34 +00001010UNARY(instance_neg, "__neg__")
1011UNARY(instance_pos, "__pos__")
1012UNARY(instance_abs, "__abs__")
1013
Guido van Rossum9bfef441993-03-29 10:43:31 +00001014static int
Guido van Rossum04691fc1992-08-12 15:35:34 +00001015instance_nonzero(self)
1016 instanceobject *self;
1017{
1018 object *func, *res;
1019 long outcome;
1020
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001021 if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001022 err_clear();
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001023 if ((func = instance_getattr(self, "__len__")) == NULL) {
Guido van Rossum04691fc1992-08-12 15:35:34 +00001024 err_clear();
1025 /* Fall back to the default behavior:
1026 all instances are nonzero */
1027 return 1;
1028 }
1029 }
1030 res = call_object(func, (object *)NULL);
1031 DECREF(func);
1032 if (res == NULL)
1033 return -1;
1034 if (!is_intobject(res)) {
1035 DECREF(res);
1036 err_setstr(TypeError, "__nonzero__ should return an int");
1037 return -1;
1038 }
1039 outcome = getintvalue(res);
1040 DECREF(res);
1041 if (outcome < 0) {
1042 err_setstr(ValueError, "__nonzero__ should return >= 0");
1043 return -1;
1044 }
1045 return outcome > 0;
1046}
1047
1048UNARY(instance_invert, "__invert__")
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001049UNARY(instance_int, "__int__")
1050UNARY(instance_long, "__long__")
1051UNARY(instance_float, "__float__")
1052UNARY(instance_oct, "__oct__")
1053UNARY(instance_hex, "__hex__")
1054
Guido van Rossum03093a21994-09-28 15:51:32 +00001055/* This version is for ternary calls only (z != None) */
1056static object *
1057instance_pow(v, w, z)
1058 object *v;
1059 object *w;
1060 object *z;
1061{
1062 /* XXX Doesn't do coercions... */
1063 object *func;
1064 object *args;
1065 object *result;
1066 func = getattr(v, "__pow__");
1067 if (func == NULL)
1068 return NULL;
1069 args = mkvalue("(OO)", w, z);
1070 if (args == NULL) {
1071 DECREF(func);
1072 return NULL;
1073 }
1074 result = call_object(func, args);
1075 DECREF(func);
1076 DECREF(args);
1077 return result;
1078}
1079
Guido van Rossum04691fc1992-08-12 15:35:34 +00001080static number_methods instance_as_number = {
Guido van Rossum03093a21994-09-28 15:51:32 +00001081 0, /*nb_add*/
1082 0, /*nb_subtract*/
1083 0, /*nb_multiply*/
1084 0, /*nb_divide*/
1085 0, /*nb_remainder*/
1086 0, /*nb_divmod*/
Guido van Rossum52ca98a1994-09-05 07:32:29 +00001087 (ternaryfunc)instance_pow, /*nb_power*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088 (unaryfunc)instance_neg, /*nb_negative*/
1089 (unaryfunc)instance_pos, /*nb_positive*/
1090 (unaryfunc)instance_abs, /*nb_absolute*/
1091 (inquiry)instance_nonzero, /*nb_nonzero*/
1092 (unaryfunc)instance_invert, /*nb_invert*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001093 0, /*nb_lshift*/
1094 0, /*nb_rshift*/
1095 0, /*nb_and*/
1096 0, /*nb_xor*/
1097 0, /*nb_or*/
Guido van Rossum879c5811995-01-10 15:24:06 +00001098 (coercion)instance_coerce, /*nb_coerce*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001099 (unaryfunc)instance_int, /*nb_int*/
1100 (unaryfunc)instance_long, /*nb_long*/
1101 (unaryfunc)instance_float, /*nb_float*/
1102 (unaryfunc)instance_oct, /*nb_oct*/
1103 (unaryfunc)instance_hex, /*nb_hex*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001104};
1105
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001106typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001107 OB_HEAD_INIT(&Typetype)
1108 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +00001109 "instance",
1110 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001111 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001112 (destructor)instance_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001113 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001114 (getattrfunc)instance_getattr, /*tp_getattr*/
1115 (setattrfunc)instance_setattr, /*tp_setattr*/
Guido van Rossum03093a21994-09-28 15:51:32 +00001116 instance_compare, /*tp_compare*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001117 (reprfunc)instance_repr, /*tp_repr*/
Guido van Rossum04691fc1992-08-12 15:35:34 +00001118 &instance_as_number, /*tp_as_number*/
1119 &instance_as_sequence, /*tp_as_sequence*/
1120 &instance_as_mapping, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001121 (hashfunc)instance_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001122};
1123
1124
Guido van Rossum81daa321993-05-20 14:24:46 +00001125/* Instance method objects are used for two purposes:
1126 (a) as bound instance methods (returned by instancename.methodname)
1127 (b) as unbound methods (returned by ClassName.methodname)
1128 In case (b), im_self is NULL
1129*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001130
1131typedef struct {
1132 OB_HEAD
Guido van Rossum81daa321993-05-20 14:24:46 +00001133 object *im_func; /* The function implementing the method */
1134 object *im_self; /* The instance it is bound to, or NULL */
1135 object *im_class; /* The class that defined the method */
Guido van Rossume8122f11991-05-05 20:03:07 +00001136} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137
1138object *
Guido van Rossum81daa321993-05-20 14:24:46 +00001139newinstancemethodobject(func, self, class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001140 object *func;
1141 object *self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001142 object *class;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143{
Guido van Rossume8122f11991-05-05 20:03:07 +00001144 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001145 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001146 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147 return NULL;
1148 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001149 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
1150 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001151 return NULL;
1152 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001153 im->im_func = func;
Guido van Rossum81daa321993-05-20 14:24:46 +00001154 XINCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +00001155 im->im_self = self;
Guido van Rossum81daa321993-05-20 14:24:46 +00001156 INCREF(class);
1157 im->im_class = class;
Guido van Rossume8122f11991-05-05 20:03:07 +00001158 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001159}
1160
1161object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001162instancemethodgetfunc(im)
1163 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001164{
Guido van Rossume8122f11991-05-05 20:03:07 +00001165 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001166 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001167 return NULL;
1168 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001169 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001170}
1171
1172object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001173instancemethodgetself(im)
1174 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001175{
Guido van Rossume8122f11991-05-05 20:03:07 +00001176 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +00001177 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001178 return NULL;
1179 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001180 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001181}
1182
Guido van Rossum81daa321993-05-20 14:24:46 +00001183object *
1184instancemethodgetclass(im)
1185 register object *im;
1186{
1187 if (!is_instancemethodobject(im)) {
1188 err_badcall();
1189 return NULL;
1190 }
1191 return ((instancemethodobject *)im)->im_class;
1192}
1193
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194/* Class method methods */
1195
Guido van Rossume8122f11991-05-05 20:03:07 +00001196#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197
Guido van Rossume8122f11991-05-05 20:03:07 +00001198static struct memberlist instancemethod_memberlist[] = {
1199 {"im_func", T_OBJECT, OFF(im_func)},
1200 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum81daa321993-05-20 14:24:46 +00001201 {"im_class", T_OBJECT, OFF(im_class)},
Guido van Rossum6dabc981996-05-14 21:54:20 +00001202 /* Dummies that are not handled by getattr() except for __members__ */
1203 {"__doc__", T_INT, 0},
1204 {"__name__", T_INT, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001205 {NULL} /* Sentinel */
1206};
1207
1208static object *
Guido van Rossume8122f11991-05-05 20:03:07 +00001209instancemethod_getattr(im, name)
1210 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001211 char *name;
1212{
Guido van Rossum6dabc981996-05-14 21:54:20 +00001213 if (name[0] == '_') {
1214 funcobject *func = (funcobject *)(im->im_func);
1215 if (strcmp(name, "__name__") == 0) {
1216 INCREF(func->func_name);
1217 return func->func_name;
1218 }
1219 if (strcmp(name, "__doc__") == 0) {
1220 INCREF(func->func_doc);
1221 return func->func_doc;
1222 }
1223 }
1224 if (getrestricted()) {
Guido van Rossum10393b11995-01-10 10:39:49 +00001225 err_setstr(RuntimeError,
1226 "instance-method attributes not accessible in restricted mode");
1227 return NULL;
1228 }
Guido van Rossume8122f11991-05-05 20:03:07 +00001229 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230}
1231
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001232static void
Guido van Rossume8122f11991-05-05 20:03:07 +00001233instancemethod_dealloc(im)
1234 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001235{
Guido van Rossume8122f11991-05-05 20:03:07 +00001236 DECREF(im->im_func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001237 XDECREF(im->im_self);
1238 DECREF(im->im_class);
Guido van Rossume8122f11991-05-05 20:03:07 +00001239 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240}
1241
Guido van Rossumebc8c511992-09-03 20:39:51 +00001242static int
1243instancemethod_compare(a, b)
1244 instancemethodobject *a, *b;
1245{
Guido van Rossume9df7271995-04-06 14:46:51 +00001246 if (a->im_self != b->im_self)
1247 return (a->im_self < b->im_self) ? -1 : 1;
1248 return cmpobject(a->im_func, b->im_func);
Guido van Rossumebc8c511992-09-03 20:39:51 +00001249}
1250
Guido van Rossum25831651993-05-19 14:50:45 +00001251static object *
1252instancemethod_repr(a)
1253 instancemethodobject *a;
1254{
1255 char buf[240];
Guido van Rossum81daa321993-05-20 14:24:46 +00001256 instanceobject *self = (instanceobject *)(a->im_self);
1257 funcobject *func = (funcobject *)(a->im_func);
1258 classobject *class = (classobject *)(a->im_class);
1259 object *fclassname, *iclassname, *funcname;
1260 char *fcname, *icname, *fname;
1261 fclassname = class->cl_name;
1262 funcname = func->func_name;
1263 if (fclassname != NULL && is_stringobject(fclassname))
1264 fcname = getstringvalue(fclassname);
Guido van Rossum25831651993-05-19 14:50:45 +00001265 else
Guido van Rossum81daa321993-05-20 14:24:46 +00001266 fcname = "?";
Guido van Rossum25831651993-05-19 14:50:45 +00001267 if (funcname != NULL && is_stringobject(funcname))
1268 fname = getstringvalue(funcname);
1269 else
1270 fname = "?";
Guido van Rossum81daa321993-05-20 14:24:46 +00001271 if (self == NULL)
1272 sprintf(buf, "<unbound method %.100s.%.100s>", fcname, fname);
1273 else {
1274 iclassname = self->in_class->cl_name;
1275 if (iclassname != NULL && is_stringobject(iclassname))
1276 icname = getstringvalue(iclassname);
1277 else
1278 icname = "?";
1279 sprintf(buf, "<method %.60s.%.60s of %.60s instance at %lx>",
1280 fcname, fname, icname, (long)self);
1281 }
Guido van Rossum25831651993-05-19 14:50:45 +00001282 return newstringobject(buf);
1283}
1284
Guido van Rossum9bfef441993-03-29 10:43:31 +00001285static long
1286instancemethod_hash(a)
1287 instancemethodobject *a;
1288{
1289 long x, y;
Guido van Rossum81daa321993-05-20 14:24:46 +00001290 if (a->im_self == NULL)
1291 x = hashobject(None);
1292 else
1293 x = hashobject(a->im_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001294 if (x == -1)
1295 return -1;
1296 y = hashobject(a->im_func);
1297 if (y == -1)
1298 return -1;
1299 return x ^ y;
1300}
1301
Guido van Rossume8122f11991-05-05 20:03:07 +00001302typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001303 OB_HEAD_INIT(&Typetype)
1304 0,
Guido van Rossum569fce71991-04-16 08:38:43 +00001305 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +00001306 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001307 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +00001308 (destructor)instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001309 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001310 (getattrfunc)instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001311 0, /*tp_setattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001312 (cmpfunc)instancemethod_compare, /*tp_compare*/
1313 (reprfunc)instancemethod_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001314 0, /*tp_as_number*/
1315 0, /*tp_as_sequence*/
1316 0, /*tp_as_mapping*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001317 (hashfunc)instancemethod_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001318};