blob: 63c55ce2ad726e55de5ef00f871e8502a26375c7 [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 Rossum3f5da241990-12-20 15:06:42 +000025/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026
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#ifdef REF_DEBUG
30long ref_total;
31#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032
Guido van Rossum3f5da241990-12-20 15:06:42 +000033/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
34 These are used by the individual routines for object creation.
35 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000037#ifdef COUNT_ALLOCS
38static typeobject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000039extern int tuple_zero_allocs, fast_tuple_allocs;
40extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000041extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000042void
43dump_counts()
44{
45 typeobject *tp;
46
47 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000048 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
49 tp->tp_name, tp->tp_alloc, tp->tp_free,
50 tp->tp_maxalloc);
51 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
52 fast_tuple_allocs, tuple_zero_allocs);
53 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
54 quick_int_allocs, quick_neg_int_allocs);
55 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
56 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000057}
58
59void
60inc_count(tp)
61 typeobject *tp;
62{
63 if (tp->tp_alloc == 0) {
64 /* first time; hang in linked list */
65 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumd7047b31995-01-02 19:07:15 +000066 fatal("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000067 tp->tp_next = type_list;
68 type_list = tp;
69 }
70 tp->tp_alloc++;
71 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
72 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
73}
74#endif
75
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076object *
77newobject(tp)
78 typeobject *tp;
79{
80 object *op = (object *) malloc(tp->tp_basicsize);
81 if (op == NULL)
82 return err_nomem();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 op->ob_type = tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000084 NEWREF(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 return op;
86}
87
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088varobject *
89newvarobject(tp, size)
90 typeobject *tp;
91 unsigned int size;
92{
93 varobject *op = (varobject *)
94 malloc(tp->tp_basicsize + size * tp->tp_itemsize);
95 if (op == NULL)
Guido van Rossum05ab1111991-05-05 20:10:41 +000096 return (varobject *)err_nomem();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 op->ob_type = tp;
98 op->ob_size = size;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000099 NEWREF(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return op;
101}
102
Guido van Rossum90933611991-06-07 16:10:43 +0000103int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104printobject(op, fp, flags)
105 object *op;
106 FILE *fp;
107 int flags;
108{
Guido van Rossum278ef591991-07-27 21:40:24 +0000109 int ret = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000110 if (sigcheck())
Guido van Rossum90933611991-06-07 16:10:43 +0000111 return -1;
Guido van Rossum90933611991-06-07 16:10:43 +0000112 if (op == NULL) {
113 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114 }
Guido van Rossum90933611991-06-07 16:10:43 +0000115 else {
116 if (op->ob_refcnt <= 0)
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000117 fprintf(fp, "<refcnt %u at %lx>",
118 op->ob_refcnt, (long)op);
119 else if (op->ob_type->tp_print == NULL) {
120 if (op->ob_type->tp_repr == NULL) {
121 fprintf(fp, "<%s object at %lx>",
122 op->ob_type->tp_name, (long)op);
123 }
124 else {
Guido van Rossumc6004111993-11-05 10:22:19 +0000125 object *s;
126 if (flags & PRINT_RAW)
127 s = strobject(op);
128 else
129 s = reprobject(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000130 if (s == NULL)
131 ret = -1;
132 else if (!is_stringobject(s)) {
133 err_setstr(TypeError,
134 "repr not string");
135 ret = -1;
136 }
137 else {
138 fprintf(fp, "%s", getstringvalue(s));
139 }
140 XDECREF(s);
141 }
142 }
Guido van Rossum90933611991-06-07 16:10:43 +0000143 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000144 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000145 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000146 if (ret == 0) {
147 if (ferror(fp)) {
Guido van Rossum2912f221991-12-10 13:59:09 +0000148 err_errno(IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000149 clearerr(fp);
150 ret = -1;
151 }
152 }
153 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154}
155
156object *
157reprobject(v)
158 object *v;
159{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000160 if (sigcheck())
Guido van Rossum90933611991-06-07 16:10:43 +0000161 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +0000162 if (v == NULL)
163 return newstringobject("<NULL>");
164 else if (v->ob_type->tp_repr == NULL) {
165 char buf[120];
166 sprintf(buf, "<%.80s object at %lx>",
167 v->ob_type->tp_name, (long)v);
168 return newstringobject(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169 }
Guido van Rossum90933611991-06-07 16:10:43 +0000170 else
171 return (*v->ob_type->tp_repr)(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172}
173
Guido van Rossumc6004111993-11-05 10:22:19 +0000174object *
175strobject(v)
176 object *v;
177{
178 if (v == NULL)
179 return newstringobject("<NULL>");
180 if (is_stringobject(v)) {
181 INCREF(v);
182 return v;
183 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000184 else if (v->ob_type->tp_str != NULL)
185 return (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000186 else {
Guido van Rossum32b582b1995-01-17 16:35:13 +0000187 object *func;
Guido van Rossumc6004111993-11-05 10:22:19 +0000188 object *args;
189 object *res;
Guido van Rossum32b582b1995-01-17 16:35:13 +0000190 if (!is_instanceobject(v) || (func = getattr(v, "__str__")) == NULL) {
Guido van Rossumc6004111993-11-05 10:22:19 +0000191 err_clear();
192 return reprobject(v);
193 }
194 args = newtupleobject(0);
195 if (args == NULL)
196 res = NULL;
197 else {
198 res = call_object(func, args);
199 DECREF(args);
200 }
201 DECREF(func);
202 return res;
203 }
204}
205
Guido van Rossum20566841995-01-12 11:26:10 +0000206static object *
207do_cmp(v, w)
208 object *v, *w;
209{
210 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
211 because the check in cmpobject() reverses the objects first.
212 This is intentional -- it makes no sense to define cmp(x,y) different
213 than -cmp(y,x). */
214 if (is_instanceobject(v) || is_instanceobject(w))
215 return instancebinop(v, w, "__cmp__", "__rcmp__", do_cmp);
216 return newintobject((long)cmpobject(v, w));
217}
218
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219int
220cmpobject(v, w)
221 object *v, *w;
222{
223 typeobject *tp;
224 if (v == w)
225 return 0;
226 if (v == NULL)
227 return -1;
228 if (w == NULL)
229 return 1;
Guido van Rossum20566841995-01-12 11:26:10 +0000230 if (is_instanceobject(v) || is_instanceobject(w)) {
231 object *res;
232 int c;
233 if (!is_instanceobject(v))
234 return -cmpobject(w, v);
235 res = do_cmp(v, w);
236 if (res == NULL) {
237 err_clear();
238 return (v < w) ? -1 : 1;
239 }
240 if (!is_intobject(res)) {
241 DECREF(res);
242 return (v < w) ? -1 : 1;
243 }
244 c = getintvalue(res);
245 DECREF(res);
246 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
247 }
Guido van Rossum9fb03681991-07-01 18:48:04 +0000248 if ((tp = v->ob_type) != w->ob_type) {
249 if (tp->tp_as_number != NULL &&
250 w->ob_type->tp_as_number != NULL) {
251 if (coerce(&v, &w) != 0) {
252 err_clear();
253 /* XXX Should report the error,
254 XXX but the interface isn't there... */
255 }
256 else {
257 int cmp = (*v->ob_type->tp_compare)(v, w);
258 DECREF(v);
259 DECREF(w);
260 return cmp;
261 }
262 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263 return strcmp(tp->tp_name, w->ob_type->tp_name);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000264 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 if (tp->tp_compare == NULL)
266 return (v < w) ? -1 : 1;
Guido van Rossum9fb03681991-07-01 18:48:04 +0000267 return (*tp->tp_compare)(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270long
271hashobject(v)
272 object *v;
273{
274 typeobject *tp = v->ob_type;
275 if (tp->tp_hash != NULL)
276 return (*tp->tp_hash)(v);
277 if (tp->tp_compare == NULL)
278 return (long) v; /* Use address as hash value */
279 /* If there's a cmp but no hash defined, the object can't be hashed */
280 err_setstr(TypeError, "unhashable type");
281 return -1;
282}
283
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284object *
285getattr(v, name)
286 object *v;
287 char *name;
288{
289 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossum016564a1995-01-07 11:54:44 +0000290 err_setstr(AttributeError, "attribute-less object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 return NULL;
292 }
293 else {
294 return (*v->ob_type->tp_getattr)(v, name);
295 }
296}
297
298int
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000299hasattr(v, name)
300 object *v;
301 char *name;
302{
303 object *res = getattr(v, name);
304 if (res != NULL) {
305 DECREF(res);
306 return 1;
307 }
308 err_clear();
309 return 0;
310}
311
312int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313setattr(v, name, w)
314 object *v;
315 char *name;
316 object *w;
317{
318 if (v->ob_type->tp_setattr == NULL) {
319 if (v->ob_type->tp_getattr == NULL)
Guido van Rossum3ea74121991-12-24 13:28:03 +0000320 err_setstr(TypeError,
321 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 else
Guido van Rossum3ea74121991-12-24 13:28:03 +0000323 err_setstr(TypeError,
324 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000325 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326 }
327 else {
328 return (*v->ob_type->tp_setattr)(v, name, w);
329 }
330}
331
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000332/* Test a value used as condition, e.g., in a for or if statement.
333 Return -1 if an error occurred */
334
335int
336testbool(v)
337 object *v;
338{
339 int res;
340 if (v == None)
341 res = 0;
342 else if (v->ob_type->tp_as_number != NULL)
343 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
344 else if (v->ob_type->tp_as_mapping != NULL)
345 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
346 else if (v->ob_type->tp_as_sequence != NULL)
347 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
348 else
349 res = 1;
350 if (res > 0)
351 res = 1;
352 return res;
353}
354
Guido van Rossum5524a591995-01-10 15:26:20 +0000355/* Coerce two numeric types to the "larger" one.
356 Increment the reference count on each argument.
357 Return -1 and raise an exception if no coercion is possible
358 (and then no reference count is incremented).
359*/
360
361int
362coerce(pv, pw)
363 object **pv, **pw;
364{
365 register object *v = *pv;
366 register object *w = *pw;
367 int res;
368
369 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
370 INCREF(v);
371 INCREF(w);
372 return 0;
373 }
374 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
375 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
376 if (res <= 0)
377 return res;
378 }
379 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
380 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
381 if (res <= 0)
382 return res;
383 }
384 err_setstr(TypeError, "number coercion failed");
385 return -1;
386}
387
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388
389/*
390NoObject is usable as a non-NULL undefined value, used by the macro None.
391There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393*/
394
Guido van Rossum0c182a11992-03-27 17:26:13 +0000395/* ARGSUSED */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396static object *
397none_repr(op)
398 object *op;
399{
400 return newstringobject("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401}
402
403static typeobject Notype = {
404 OB_HEAD_INIT(&Typetype)
405 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407 0,
408 0,
409 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000410 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 0, /*tp_getattr*/
412 0, /*tp_setattr*/
413 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000414 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415 0, /*tp_as_number*/
416 0, /*tp_as_sequence*/
417 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000418 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419};
420
421object NoObject = {
422 OB_HEAD_INIT(&Notype)
423};
424
425
426#ifdef TRACE_REFS
427
428static object refchain = {&refchain, &refchain};
429
430NEWREF(op)
431 object *op;
432{
433 ref_total++;
434 op->ob_refcnt = 1;
435 op->_ob_next = refchain._ob_next;
436 op->_ob_prev = &refchain;
437 refchain._ob_next->_ob_prev = op;
438 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000439#ifdef COUNT_ALLOCS
440 inc_count(op->ob_type);
441#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442}
443
Guido van Rossum3f5da241990-12-20 15:06:42 +0000444UNREF(op)
445 register object *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447 register object *p;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000448 if (op->ob_refcnt < 0)
449 fatal("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000450 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000451 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
452 fatal("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000453#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
455 if (p == op)
456 break;
457 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000458 if (p == &refchain) /* Not found */
459 fatal("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000460#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 op->_ob_next->_ob_prev = op->_ob_prev;
462 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000463 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464}
465
466DELREF(op)
467 object *op;
468{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000469 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 UNREF(op);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000471#ifdef COUNT_ALLOCS
472 op->ob_type->tp_free++;
473#endif
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000474 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000475 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476}
477
478printrefs(fp)
479 FILE *fp;
480{
481 object *op;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000482 fprintf(fp, "Remaining objects (except strings referenced once):\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000484 if (op->ob_refcnt == 1 && is_stringobject(op))
485 continue; /* Will be printed elsewhere */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossum90933611991-06-07 16:10:43 +0000487 if (printobject(op, fp, 0) != 0)
488 err_clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 putc('\n', fp);
490 }
491}
492
493#endif