blob: ed0e6f4cc7a64e12f1388d4d6072fb6c0771fc92 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum8dd79cf1992-04-05 14:24:32 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
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 Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossum3f5da241990-12-20 15:06:42 +000029#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
31typedef struct {
32 OB_HEAD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 object *cl_bases; /* A tuple */
34 object *cl_methods; /* A dictionary */
Guido van Rossum94308391991-10-20 20:11:48 +000035 object *cl_name; /* A string */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036} classobject;
37
38object *
Guido van Rossum94308391991-10-20 20:11:48 +000039newclassobject(bases, methods, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040 object *bases; /* NULL or tuple of classobjects! */
41 object *methods;
Guido van Rossum94308391991-10-20 20:11:48 +000042 object *name; /* String; NULL if unknown */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043{
44 classobject *op;
Guido van Rossume2966a61991-12-10 13:53:23 +000045 if (bases == NULL) {
46 bases = newtupleobject(0);
47 if (bases == NULL)
48 return err_nomem();
49 }
50 else
51 INCREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 op = NEWOBJ(classobject, &Classtype);
Guido van Rossume2966a61991-12-10 13:53:23 +000053 if (op == NULL) {
54 DECREF(bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 return NULL;
Guido van Rossume2966a61991-12-10 13:53:23 +000056 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 op->cl_bases = bases;
58 INCREF(methods);
59 op->cl_methods = methods;
Guido van Rossum94308391991-10-20 20:11:48 +000060 XINCREF(name);
61 op->cl_name = name;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 return (object *) op;
63}
64
65/* Class methods */
66
67static void
68class_dealloc(op)
69 classobject *op;
70{
Guido van Rossume2966a61991-12-10 13:53:23 +000071 DECREF(op->cl_bases);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 DECREF(op->cl_methods);
Guido van Rossum94308391991-10-20 20:11:48 +000073 XDECREF(op->cl_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 free((ANY *)op);
75}
76
77static object *
78class_getattr(op, name)
79 register classobject *op;
80 register char *name;
81{
82 register object *v;
Guido van Rossum94308391991-10-20 20:11:48 +000083 if (strcmp(name, "__dict__") == 0) {
84 INCREF(op->cl_methods);
85 return op->cl_methods;
86 }
87 if (strcmp(name, "__bases__") == 0) {
Guido van Rossum94308391991-10-20 20:11:48 +000088 INCREF(op->cl_bases);
89 return op->cl_bases;
90 }
91 if (strcmp(name, "__name__") == 0) {
92 if (op->cl_name == NULL)
93 v = None;
94 else
95 v = op->cl_name;
96 INCREF(v);
97 return v;
98 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 v = dictlookup(op->cl_methods, name);
100 if (v != NULL) {
101 INCREF(v);
102 return v;
103 }
Guido van Rossume2966a61991-12-10 13:53:23 +0000104 {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105 int n = gettuplesize(op->cl_bases);
106 int i;
107 for (i = 0; i < n; i++) {
Guido van Rossum85998fa1992-03-27 17:23:48 +0000108 v = class_getattr((classobject *)
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000109 gettupleitem(op->cl_bases, i), name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110 if (v != NULL)
111 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000112 err_clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 }
114 }
Guido van Rossume2966a61991-12-10 13:53:23 +0000115 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
117}
118
Guido van Rossum94308391991-10-20 20:11:48 +0000119static int
120class_setattr(op, name, v)
121 classobject *op;
122 char *name;
123 object *v;
124{
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000125 if (name[0] == '_' && name[1] == '_') {
126 int n = strlen(name);
127 if (name[n-1] == '_' && name[n-2] == '_') {
128 err_setstr(TypeError, "read-only special attribute");
129 return -1;
130 }
131 }
Guido van Rossum94308391991-10-20 20:11:48 +0000132 if (v == NULL)
133 return dictremove(op->cl_methods, name);
134 else
135 return dictinsert(op->cl_methods, name, v);
136}
137
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138typeobject Classtype = {
139 OB_HEAD_INIT(&Typetype)
140 0,
141 "class",
142 sizeof(classobject),
143 0,
144 class_dealloc, /*tp_dealloc*/
145 0, /*tp_print*/
146 class_getattr, /*tp_getattr*/
Guido van Rossum94308391991-10-20 20:11:48 +0000147 class_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 0, /*tp_compare*/
149 0, /*tp_repr*/
150 0, /*tp_as_number*/
151 0, /*tp_as_sequence*/
152 0, /*tp_as_mapping*/
153};
154
155
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000156/* We're not done yet: next, we define instance objects... */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157
158typedef struct {
159 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000160 classobject *in_class; /* The class object */
161 object *in_attr; /* A dictionary */
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000162} instanceobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163
164object *
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000165newinstanceobject(class)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 register object *class;
167{
Guido van Rossume8122f11991-05-05 20:03:07 +0000168 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 if (!is_classobject(class)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000170 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171 return NULL;
172 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000173 inst = NEWOBJ(instanceobject, &Instancetype);
174 if (inst == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 return NULL;
176 INCREF(class);
Guido van Rossume8122f11991-05-05 20:03:07 +0000177 inst->in_class = (classobject *)class;
178 inst->in_attr = newdictobject();
179 if (inst->in_attr == NULL) {
180 DECREF(inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 return NULL;
182 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000183 return (object *)inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184}
185
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000186/* Instance methods */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187
188static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000189instance_dealloc(inst)
190 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Guido van Rossume8122f11991-05-05 20:03:07 +0000192 DECREF(inst->in_class);
193 if (inst->in_attr != NULL)
194 DECREF(inst->in_attr);
195 free((ANY *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
198static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000199instance_getattr(inst, name)
200 register instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 register char *name;
202{
Guido van Rossum94308391991-10-20 20:11:48 +0000203 register object *v;
204 if (strcmp(name, "__dict__") == 0) {
205 INCREF(inst->in_attr);
206 return inst->in_attr;
207 }
208 if (strcmp(name, "__class__") == 0) {
209 INCREF(inst->in_class);
210 return (object *)inst->in_class;
211 }
212 v = dictlookup(inst->in_attr, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 if (v != NULL) {
214 INCREF(v);
215 return v;
216 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000217 v = class_getattr(inst->in_class, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 if (v == NULL)
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000219 return v; /* class_getattr() has set the error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 if (is_funcobject(v)) {
Guido van Rossume8122f11991-05-05 20:03:07 +0000221 object *w = newinstancemethodobject(v, (object *)inst);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 DECREF(v);
223 return w;
224 }
225 DECREF(v);
Guido van Rossume2966a61991-12-10 13:53:23 +0000226 err_setstr(AttributeError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 return NULL;
228}
229
230static int
Guido van Rossume8122f11991-05-05 20:03:07 +0000231instance_setattr(inst, name, v)
232 instanceobject *inst;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 char *name;
234 object *v;
235{
Guido van Rossum8dd79cf1992-04-05 14:24:32 +0000236 if (name[0] == '_' && name[1] == '_') {
237 int n = strlen(name);
238 if (name[n-1] == '_' && name[n-2] == '_') {
239 err_setstr(TypeError, "read-only special attribute");
240 return -1;
241 }
242 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 if (v == NULL)
Guido van Rossume8122f11991-05-05 20:03:07 +0000244 return dictremove(inst->in_attr, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 else
Guido van Rossume8122f11991-05-05 20:03:07 +0000246 return dictinsert(inst->in_attr, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
248
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000249typeobject Instancetype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 OB_HEAD_INIT(&Typetype)
251 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000252 "instance",
253 sizeof(instanceobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 0,
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000255 instance_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 0, /*tp_print*/
Guido van Rossum21ed88c1991-04-04 10:42:10 +0000257 instance_getattr, /*tp_getattr*/
258 instance_setattr, /*tp_setattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 0, /*tp_compare*/
260 0, /*tp_repr*/
261 0, /*tp_as_number*/
262 0, /*tp_as_sequence*/
263 0, /*tp_as_mapping*/
264};
265
266
Guido van Rossum94308391991-10-20 20:11:48 +0000267/* And finally, here are instance method objects */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268
269typedef struct {
270 OB_HEAD
Guido van Rossume8122f11991-05-05 20:03:07 +0000271 object *im_func; /* The method function */
272 object *im_self; /* The object to which this applies */
273} instancemethodobject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274
275object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000276newinstancemethodobject(func, self)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 object *func;
278 object *self;
279{
Guido van Rossume8122f11991-05-05 20:03:07 +0000280 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 if (!is_funcobject(func)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000282 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000285 im = NEWOBJ(instancemethodobject, &Instancemethodtype);
286 if (im == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return NULL;
288 INCREF(func);
Guido van Rossume8122f11991-05-05 20:03:07 +0000289 im->im_func = func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 INCREF(self);
Guido van Rossume8122f11991-05-05 20:03:07 +0000291 im->im_self = self;
292 return (object *)im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293}
294
295object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000296instancemethodgetfunc(im)
297 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298{
Guido van Rossume8122f11991-05-05 20:03:07 +0000299 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000300 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301 return NULL;
302 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000303 return ((instancemethodobject *)im)->im_func;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304}
305
306object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000307instancemethodgetself(im)
308 register object *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309{
Guido van Rossume8122f11991-05-05 20:03:07 +0000310 if (!is_instancemethodobject(im)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000311 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 return NULL;
313 }
Guido van Rossume8122f11991-05-05 20:03:07 +0000314 return ((instancemethodobject *)im)->im_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
317/* Class method methods */
318
Guido van Rossume8122f11991-05-05 20:03:07 +0000319#define OFF(x) offsetof(instancemethodobject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320
Guido van Rossume8122f11991-05-05 20:03:07 +0000321static struct memberlist instancemethod_memberlist[] = {
322 {"im_func", T_OBJECT, OFF(im_func)},
323 {"im_self", T_OBJECT, OFF(im_self)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324 {NULL} /* Sentinel */
325};
326
327static object *
Guido van Rossume8122f11991-05-05 20:03:07 +0000328instancemethod_getattr(im, name)
329 register instancemethodobject *im;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330 char *name;
331{
Guido van Rossume8122f11991-05-05 20:03:07 +0000332 return getmember((char *)im, instancemethod_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333}
334
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335static void
Guido van Rossume8122f11991-05-05 20:03:07 +0000336instancemethod_dealloc(im)
337 register instancemethodobject *im;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338{
Guido van Rossume8122f11991-05-05 20:03:07 +0000339 DECREF(im->im_func);
340 DECREF(im->im_self);
341 free((ANY *)im);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342}
343
Guido van Rossume8122f11991-05-05 20:03:07 +0000344typeobject Instancemethodtype = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 OB_HEAD_INIT(&Typetype)
346 0,
Guido van Rossum569fce71991-04-16 08:38:43 +0000347 "instance method",
Guido van Rossume8122f11991-05-05 20:03:07 +0000348 sizeof(instancemethodobject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 0,
Guido van Rossume8122f11991-05-05 20:03:07 +0000350 instancemethod_dealloc, /*tp_dealloc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351 0, /*tp_print*/
Guido van Rossume8122f11991-05-05 20:03:07 +0000352 instancemethod_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 0, /*tp_setattr*/
354 0, /*tp_compare*/
355 0, /*tp_repr*/
356 0, /*tp_as_number*/
357 0, /*tp_as_sequence*/
358 0, /*tp_as_mapping*/
359};