blob: d1bc681805f3161e1ceb7cca07b119bd182af96c [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 }
184 else {
185 object *func = getattr(v, "__str__");
186 object *args;
187 object *res;
188 if (func == NULL) {
189 err_clear();
190 return reprobject(v);
191 }
192 args = newtupleobject(0);
193 if (args == NULL)
194 res = NULL;
195 else {
196 res = call_object(func, args);
197 DECREF(args);
198 }
199 DECREF(func);
200 return res;
201 }
202}
203
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204int
205cmpobject(v, w)
206 object *v, *w;
207{
208 typeobject *tp;
209 if (v == w)
210 return 0;
211 if (v == NULL)
212 return -1;
213 if (w == NULL)
214 return 1;
Guido van Rossum9fb03681991-07-01 18:48:04 +0000215 if ((tp = v->ob_type) != w->ob_type) {
216 if (tp->tp_as_number != NULL &&
217 w->ob_type->tp_as_number != NULL) {
218 if (coerce(&v, &w) != 0) {
219 err_clear();
220 /* XXX Should report the error,
221 XXX but the interface isn't there... */
222 }
223 else {
224 int cmp = (*v->ob_type->tp_compare)(v, w);
225 DECREF(v);
226 DECREF(w);
227 return cmp;
228 }
229 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 return strcmp(tp->tp_name, w->ob_type->tp_name);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000231 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 if (tp->tp_compare == NULL)
233 return (v < w) ? -1 : 1;
Guido van Rossum9fb03681991-07-01 18:48:04 +0000234 return (*tp->tp_compare)(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235}
236
Guido van Rossum9bfef441993-03-29 10:43:31 +0000237long
238hashobject(v)
239 object *v;
240{
241 typeobject *tp = v->ob_type;
242 if (tp->tp_hash != NULL)
243 return (*tp->tp_hash)(v);
244 if (tp->tp_compare == NULL)
245 return (long) v; /* Use address as hash value */
246 /* If there's a cmp but no hash defined, the object can't be hashed */
247 err_setstr(TypeError, "unhashable type");
248 return -1;
249}
250
Guido van Rossum3f5da241990-12-20 15:06:42 +0000251object *
252getattr(v, name)
253 object *v;
254 char *name;
255{
256 if (v->ob_type->tp_getattr == NULL) {
257 err_setstr(TypeError, "attribute-less object");
258 return NULL;
259 }
260 else {
261 return (*v->ob_type->tp_getattr)(v, name);
262 }
263}
264
265int
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000266hasattr(v, name)
267 object *v;
268 char *name;
269{
270 object *res = getattr(v, name);
271 if (res != NULL) {
272 DECREF(res);
273 return 1;
274 }
275 err_clear();
276 return 0;
277}
278
279int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280setattr(v, name, w)
281 object *v;
282 char *name;
283 object *w;
284{
285 if (v->ob_type->tp_setattr == NULL) {
286 if (v->ob_type->tp_getattr == NULL)
Guido van Rossum3ea74121991-12-24 13:28:03 +0000287 err_setstr(TypeError,
288 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000289 else
Guido van Rossum3ea74121991-12-24 13:28:03 +0000290 err_setstr(TypeError,
291 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000292 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000293 }
294 else {
295 return (*v->ob_type->tp_setattr)(v, name, w);
296 }
297}
298
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000299/* Test a value used as condition, e.g., in a for or if statement.
300 Return -1 if an error occurred */
301
302int
303testbool(v)
304 object *v;
305{
306 int res;
307 if (v == None)
308 res = 0;
309 else if (v->ob_type->tp_as_number != NULL)
310 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
311 else if (v->ob_type->tp_as_mapping != NULL)
312 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
313 else if (v->ob_type->tp_as_sequence != NULL)
314 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
315 else
316 res = 1;
317 if (res > 0)
318 res = 1;
319 return res;
320}
321
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322
323/*
324NoObject is usable as a non-NULL undefined value, used by the macro None.
325There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327*/
328
Guido van Rossum0c182a11992-03-27 17:26:13 +0000329/* ARGSUSED */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330static object *
331none_repr(op)
332 object *op;
333{
334 return newstringobject("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335}
336
337static typeobject Notype = {
338 OB_HEAD_INIT(&Typetype)
339 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 0,
342 0,
343 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000344 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345 0, /*tp_getattr*/
346 0, /*tp_setattr*/
347 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000348 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 0, /*tp_as_number*/
350 0, /*tp_as_sequence*/
351 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000352 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353};
354
355object NoObject = {
356 OB_HEAD_INIT(&Notype)
357};
358
359
360#ifdef TRACE_REFS
361
362static object refchain = {&refchain, &refchain};
363
364NEWREF(op)
365 object *op;
366{
367 ref_total++;
368 op->ob_refcnt = 1;
369 op->_ob_next = refchain._ob_next;
370 op->_ob_prev = &refchain;
371 refchain._ob_next->_ob_prev = op;
372 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000373#ifdef COUNT_ALLOCS
374 inc_count(op->ob_type);
375#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376}
377
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378UNREF(op)
379 register object *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 register object *p;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000382 if (op->ob_refcnt < 0)
383 fatal("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000384 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000385 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
386 fatal("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000387#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
389 if (p == op)
390 break;
391 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000392 if (p == &refchain) /* Not found */
393 fatal("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000394#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 op->_ob_next->_ob_prev = op->_ob_prev;
396 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000397 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398}
399
400DELREF(op)
401 object *op;
402{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000403 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404 UNREF(op);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000405#ifdef COUNT_ALLOCS
406 op->ob_type->tp_free++;
407#endif
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000408 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000409 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410}
411
412printrefs(fp)
413 FILE *fp;
414{
415 object *op;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000416 fprintf(fp, "Remaining objects (except strings referenced once):\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000418 if (op->ob_refcnt == 1 && is_stringobject(op))
419 continue; /* Will be printed elsewhere */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossum90933611991-06-07 16:10:43 +0000421 if (printobject(op, fp, 0) != 0)
422 err_clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 putc('\n', fp);
424 }
425}
426
427#endif