blob: 968fdd0f23c6e4942702c7bb52a6680b2a239b5c [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum6f9e4331995-03-29 16:57:48 +000036#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000037DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossum3f5da241990-12-20 15:06:42 +000040/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
41 These are used by the individual routines for object creation.
42 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000044#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046extern int tuple_zero_allocs, fast_tuple_allocs;
47extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000048extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000049void
50dump_counts()
51{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000053
54 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000055 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
56 tp->tp_name, tp->tp_alloc, tp->tp_free,
57 tp->tp_maxalloc);
58 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
59 fast_tuple_allocs, tuple_zero_allocs);
60 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
61 quick_int_allocs, quick_neg_int_allocs);
62 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
63 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000064}
65
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000066PyObject *
67get_counts()
68{
69 PyTypeObject *tp;
70 PyObject *result;
71 PyObject *v;
72
73 result = PyList_New(0);
74 if (result == NULL)
75 return NULL;
76 for (tp = type_list; tp; tp = tp->tp_next) {
77 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
78 tp->tp_free, tp->tp_maxalloc);
79 if (v == NULL) {
80 Py_DECREF(result);
81 return NULL;
82 }
83 if (PyList_Append(result, v) < 0) {
84 Py_DECREF(v);
85 Py_DECREF(result);
86 return NULL;
87 }
88 Py_DECREF(v);
89 }
90 return result;
91}
92
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000093void
94inc_count(tp)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000096{
97 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000098 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000099 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000101 tp->tp_next = type_list;
102 type_list = tp;
103 }
104 tp->tp_alloc++;
105 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
106 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
107}
108#endif
109
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000110#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyObject *
112_PyObject_New(tp)
113 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000114#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
116_PyObject_New(tp,op)
117 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000118 PyObject *op;
119#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000121#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyObject *op = (PyObject *) malloc(tp->tp_basicsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000123#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return op;
129}
130
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000131#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000132PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133_PyObject_NewVar(tp, size)
134 PyTypeObject *tp;
Guido van Rossum2497ead1995-02-10 17:00:27 +0000135 int size;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000136#else
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000137PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138_PyObject_NewVar(tp, size, op)
139 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000140 int size;
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000141 PyVarObject *op;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000142#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000144#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000145 PyVarObject *op = (PyVarObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 malloc(tp->tp_basicsize + size * tp->tp_itemsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000147#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000149 return (PyVarObject *)PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 op->ob_type = tp;
151 op->ob_size = size;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000152 _Py_NewReference((PyObject *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 return op;
154}
155
Guido van Rossum90933611991-06-07 16:10:43 +0000156int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157PyObject_Print(op, fp, flags)
158 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 FILE *fp;
160 int flags;
161{
Guido van Rossum278ef591991-07-27 21:40:24 +0000162 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000164 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000165#ifdef USE_STACKCHECK
166 if (PyOS_CheckStack()) {
167 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
168 return -1;
169 }
170#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000171 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000172 if (op == NULL) {
173 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 }
Guido van Rossum90933611991-06-07 16:10:43 +0000175 else {
176 if (op->ob_refcnt <= 0)
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000177 fprintf(fp, "<refcnt %u at %lx>",
178 op->ob_refcnt, (long)op);
179 else if (op->ob_type->tp_print == NULL) {
180 if (op->ob_type->tp_repr == NULL) {
181 fprintf(fp, "<%s object at %lx>",
182 op->ob_type->tp_name, (long)op);
183 }
184 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyObject *s;
186 if (flags & Py_PRINT_RAW)
187 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000188 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000190 if (s == NULL)
191 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000192 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000193 ret = PyObject_Print(s, fp,
194 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000195 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000197 }
198 }
Guido van Rossum90933611991-06-07 16:10:43 +0000199 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000200 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000201 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000202 if (ret == 0) {
203 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000205 clearerr(fp);
206 ret = -1;
207 }
208 }
209 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210}
211
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212PyObject *
213PyObject_Repr(v)
214 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000217 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000218#ifdef USE_STACKCHECK
219 if (PyOS_CheckStack()) {
220 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
221 return NULL;
222 }
223#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000224 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000226 else if (v->ob_type->tp_repr == NULL) {
227 char buf[120];
228 sprintf(buf, "<%.80s object at %lx>",
229 v->ob_type->tp_name, (long)v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000232 else {
233 PyObject *res;
234 res = (*v->ob_type->tp_repr)(v);
235 if (res == NULL)
236 return NULL;
237 if (!PyString_Check(res)) {
238 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000239 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 res->ob_type->tp_name);
241 Py_DECREF(res);
242 return NULL;
243 }
244 return res;
245 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246}
247
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248PyObject *
249PyObject_Str(v)
250 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000251{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252 PyObject *res;
253
Guido van Rossumc6004111993-11-05 10:22:19 +0000254 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 return PyString_FromString("<NULL>");
256 else if (PyString_Check(v)) {
257 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000258 return v;
259 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000260 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000262 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 if (!PyInstance_Check(v) ||
265 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
266 PyErr_Clear();
267 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 res = PyEval_CallObject(func, (PyObject *)NULL);
270 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000271 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272 if (res == NULL)
273 return NULL;
274 if (!PyString_Check(res)) {
275 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000276 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277 res->ob_type->tp_name);
278 Py_DECREF(res);
279 return NULL;
280 }
281 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000282}
283
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000285do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000287{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000288 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000289 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
290 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 This is intentional -- it makes no sense to define cmp(x,y)
292 different than -cmp(y,x). */
293 if (PyInstance_Check(v) || PyInstance_Check(w))
294 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000295 c = PyObject_Compare(v, w);
296 if (c && PyErr_Occurred())
297 return NULL;
298 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000299}
300
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302PyObject_Compare(v, w)
303 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000305 PyTypeObject *vtp, *wtp;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000306 if (v == NULL || w == NULL) {
307 PyErr_BadInternalCall();
308 return -1;
309 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 if (v == w)
311 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 if (PyInstance_Check(v) || PyInstance_Check(w)) {
313 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000314 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 if (!PyInstance_Check(v))
316 return -PyObject_Compare(w, v);
Guido van Rossum20566841995-01-12 11:26:10 +0000317 res = do_cmp(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000318 if (res == NULL)
319 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 if (!PyInt_Check(res)) {
321 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000322 PyErr_SetString(PyExc_TypeError,
323 "comparison did not return an int");
324 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000325 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 c = PyInt_AsLong(res);
327 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000328 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
329 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000330 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
331 char *vname = vtp->tp_name;
332 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000333 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000334 int err;
335 err = PyNumber_CoerceEx(&v, &w);
336 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000337 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000338 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000339 int cmp;
340 vtp = v->ob_type;
341 if (vtp->tp_compare == NULL)
342 cmp = (v < w) ? -1 : 1;
343 else
344 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 Py_DECREF(v);
346 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000347 return cmp;
348 }
349 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000350 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
351 int result = PyUnicode_Compare(v, w);
352 if (result == -1 && PyErr_Occurred() &&
353 PyErr_ExceptionMatches(PyExc_TypeError))
354 /* TypeErrors are ignored: if Unicode coercion
355 fails due to one of the arguments not
356 having the right type, we continue as
357 defined by the coercion protocol (see
358 above). Luckily, decoding errors are
359 reported as ValueErrors and are not masked
360 by this technique. */
361 PyErr_Clear();
362 else
363 return result;
364 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000365 else if (vtp->tp_as_number != NULL)
366 vname = "";
367 else if (wtp->tp_as_number != NULL)
368 wname = "";
369 /* Numerical types compare smaller than all other types */
370 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000371 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000372 if (vtp->tp_compare == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 return (v < w) ? -1 : 1;
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000374 return (*vtp->tp_compare)(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
Guido van Rossum9bfef441993-03-29 10:43:31 +0000377long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378PyObject_Hash(v)
379 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000380{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000382 if (tp->tp_hash != NULL)
383 return (*tp->tp_hash)(v);
384 if (tp->tp_compare == NULL)
385 return (long) v; /* Use address as hash value */
386 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000388 return -1;
389}
390
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391PyObject *
392PyObject_GetAttrString(v, name)
393 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 char *name;
395{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000396 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000398 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000399 if (w == NULL)
400 return NULL;
401 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000403 return res;
404 }
405
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000407 PyErr_Format(PyExc_AttributeError,
408 "'%.50s' object has no attribute '%.400s'",
409 v->ob_type->tp_name,
410 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 return NULL;
412 }
413 else {
414 return (*v->ob_type->tp_getattr)(v, name);
415 }
416}
417
418int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419PyObject_HasAttrString(v, name)
420 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000421 char *name;
422{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000424 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000426 return 1;
427 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000429 return 0;
430}
431
432int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433PyObject_SetAttrString(v, name, w)
434 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000438 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000440 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000441 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000442 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000443 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000444 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000446 return res;
447 }
448
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449 if (v->ob_type->tp_setattr == NULL) {
450 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000452 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000453 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000455 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000456 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457 }
458 else {
459 return (*v->ob_type->tp_setattr)(v, name, w);
460 }
461}
462
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000463PyObject *
464PyObject_GetAttr(v, name)
465 PyObject *v;
466 PyObject *name;
467{
468 if (v->ob_type->tp_getattro != NULL)
469 return (*v->ob_type->tp_getattro)(v, name);
470 else
471 return PyObject_GetAttrString(v, PyString_AsString(name));
472}
473
474int
475PyObject_HasAttr(v, name)
476 PyObject *v;
477 PyObject *name;
478{
479 PyObject *res = PyObject_GetAttr(v, name);
480 if (res != NULL) {
481 Py_DECREF(res);
482 return 1;
483 }
484 PyErr_Clear();
485 return 0;
486}
487
488int
489PyObject_SetAttr(v, name, value)
490 PyObject *v;
491 PyObject *name;
492 PyObject *value;
493{
494 int err;
495 Py_INCREF(name);
496 PyString_InternInPlace(&name);
497 if (v->ob_type->tp_setattro != NULL)
498 err = (*v->ob_type->tp_setattro)(v, name, value);
499 else
500 err = PyObject_SetAttrString(
501 v, PyString_AsString(name), value);
502 Py_DECREF(name);
503 return err;
504}
505
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000506/* Test a value used as condition, e.g., in a for or if statement.
507 Return -1 if an error occurred */
508
509int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510PyObject_IsTrue(v)
511 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000512{
513 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000515 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000516 else if (v->ob_type->tp_as_number != NULL &&
517 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000518 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000519 else if (v->ob_type->tp_as_mapping != NULL &&
520 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000521 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000522 else if (v->ob_type->tp_as_sequence != NULL &&
523 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000524 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
525 else
526 res = 1;
527 if (res > 0)
528 res = 1;
529 return res;
530}
531
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000532/* equivalent of 'not v'
533 Return -1 if an error occurred */
534
535int
536PyObject_Not(v)
537 PyObject *v;
538{
539 int res;
540 res = PyObject_IsTrue(v);
541 if (res < 0)
542 return res;
543 return res == 0;
544}
545
Guido van Rossum5524a591995-01-10 15:26:20 +0000546/* Coerce two numeric types to the "larger" one.
547 Increment the reference count on each argument.
548 Return -1 and raise an exception if no coercion is possible
549 (and then no reference count is incremented).
550*/
551
552int
Guido van Rossum242c6421997-11-19 16:03:17 +0000553PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000555{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 register PyObject *v = *pv;
557 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000558 int res;
559
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
561 Py_INCREF(v);
562 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000563 return 0;
564 }
565 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
566 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
567 if (res <= 0)
568 return res;
569 }
570 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
571 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
572 if (res <= 0)
573 return res;
574 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000575 return 1;
576}
577
578int
579PyNumber_Coerce(pv, pw)
580 PyObject **pv, **pw;
581{
582 int err = PyNumber_CoerceEx(pv, pw);
583 if (err <= 0)
584 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000586 return -1;
587}
588
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000590/* Test whether an object can be called */
591
592int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593PyCallable_Check(x)
594 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000595{
596 if (x == NULL)
597 return 0;
598 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyFunction_Check(x) ||
600 PyMethod_Check(x) ||
601 PyCFunction_Check(x) ||
602 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000603 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 if (PyInstance_Check(x)) {
605 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000606 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000608 return 0;
609 }
610 /* Could test recursively but don't, for fear of endless
611 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000613 return 1;
614 }
615 return 0;
616}
617
618
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619/*
620NoObject is usable as a non-NULL undefined value, used by the macro None.
621There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000622so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623*/
624
Guido van Rossum0c182a11992-03-27 17:26:13 +0000625/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000627none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000631}
632
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633static PyTypeObject PyNothing_Type = {
634 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000636 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637 0,
638 0,
639 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000640 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000641 0, /*tp_getattr*/
642 0, /*tp_setattr*/
643 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000644 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000645 0, /*tp_as_number*/
646 0, /*tp_as_sequence*/
647 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000648 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649};
650
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651PyObject _Py_NoneStruct = {
652 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653};
654
655
Guido van Rossum84a90321996-05-22 16:34:47 +0000656#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000660void
Guido van Rossume09fb551997-08-05 02:04:34 +0000661_Py_ResetReferences()
662{
663 refchain._ob_prev = refchain._ob_next = &refchain;
664 _Py_RefTotal = 0;
665}
666
667void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668_Py_NewReference(op)
669 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000670{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672 op->ob_refcnt = 1;
673 op->_ob_next = refchain._ob_next;
674 op->_ob_prev = &refchain;
675 refchain._ob_next->_ob_prev = op;
676 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000677#ifdef COUNT_ALLOCS
678 inc_count(op->ob_type);
679#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680}
681
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000682void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683_Py_ForgetReference(op)
684 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000686#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000687 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000688#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000689 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000691 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000692 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000694#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000695 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
696 if (p == op)
697 break;
698 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000699 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000701#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702 op->_ob_next->_ob_prev = op->_ob_prev;
703 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000704 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000705#ifdef COUNT_ALLOCS
706 op->ob_type->tp_free++;
707#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000708}
709
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000710void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711_Py_Dealloc(op)
712 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000714 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 _Py_ForgetReference(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000716 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000717 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000718}
719
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000720void
Guido van Rossumded690f1996-05-24 20:48:31 +0000721_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000722 FILE *fp;
723{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000725 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
727 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 if (PyObject_Print(op, fp, 0) != 0)
729 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730 putc('\n', fp);
731 }
732}
733
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000734PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000735_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000736 PyObject *self;
737 PyObject *args;
738{
739 int i, n;
740 PyObject *t = NULL;
741 PyObject *res, *op;
742
743 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
744 return NULL;
745 op = refchain._ob_next;
746 res = PyList_New(0);
747 if (res == NULL)
748 return NULL;
749 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
750 while (op == self || op == args || op == res || op == t ||
751 t != NULL && op->ob_type != (PyTypeObject *) t) {
752 op = op->_ob_next;
753 if (op == &refchain)
754 return res;
755 }
756 if (PyList_Append(res, op) < 0) {
757 Py_DECREF(res);
758 return NULL;
759 }
760 op = op->_ob_next;
761 }
762 return res;
763}
764
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000766
767
768/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000769PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000770
771
772/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +0000774
775
776/* Malloc wrappers (see mymalloc.h) */
777
778/* The Py_{Malloc,Realloc} wrappers call PyErr_NoMemory() on failure */
779
780ANY *
781Py_Malloc(nbytes)
782 size_t nbytes;
783{
784 ANY *p;
785#if _PyMem_EXTRA > 0
786 if (nbytes == 0)
787 nbytes = _PyMem_EXTRA;
788#endif
789 p = malloc(nbytes);
790 if (p != NULL)
791 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000792 else {
793 PyErr_NoMemory();
794 return NULL;
795 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000796}
797
798ANY *
799Py_Realloc(p, nbytes)
800 ANY *p;
801 size_t nbytes;
802{
803#if _PyMem_EXTRA > 0
804 if (nbytes == 0)
805 nbytes = _PyMem_EXTRA;
806#endif
807 p = realloc(p, nbytes);
808 if (p != NULL)
809 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000810 else {
811 PyErr_NoMemory();
812 return NULL;
813 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000814}
815
816void
817Py_Free(p)
818 ANY *p;
819{
820 free(p);
821}
822
823/* The PyMem_{Malloc,Realloc} wrappers don't call anything on failure */
824
825ANY *
826PyMem_Malloc(nbytes)
827 size_t nbytes;
828{
829#if _PyMem_EXTRA > 0
830 if (nbytes == 0)
831 nbytes = _PyMem_EXTRA;
832#endif
833 return malloc(nbytes);
834}
835
836ANY *
837PyMem_Realloc(p, nbytes)
838 ANY *p;
839 size_t nbytes;
840{
841#if _PyMem_EXTRA > 0
842 if (nbytes == 0)
843 nbytes = _PyMem_EXTRA;
844#endif
845 return realloc(p, nbytes);
846}
847
848void
849PyMem_Free(p)
850 ANY *p;
851{
852 free(p);
853}
Guido van Rossum86610361998-04-10 22:32:46 +0000854
855
856/* These methods are used to control infinite recursion in repr, str, print,
857 etc. Container objects that may recursively contain themselves,
858 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
859 Py_ReprLeave() to avoid infinite recursion.
860
861 Py_ReprEnter() returns 0 the first time it is called for a particular
862 object and 1 every time thereafter. It returns -1 if an exception
863 occurred. Py_ReprLeave() has no return value.
864
865 See dictobject.c and listobject.c for examples of use.
866*/
867
868#define KEY "Py_Repr"
869
870int
871Py_ReprEnter(obj)
872 PyObject *obj;
873{
874 PyObject *dict;
875 PyObject *list;
876 int i;
877
878 dict = PyThreadState_GetDict();
879 if (dict == NULL)
880 return -1;
881 list = PyDict_GetItemString(dict, KEY);
882 if (list == NULL) {
883 list = PyList_New(0);
884 if (list == NULL)
885 return -1;
886 if (PyDict_SetItemString(dict, KEY, list) < 0)
887 return -1;
888 Py_DECREF(list);
889 }
890 i = PyList_GET_SIZE(list);
891 while (--i >= 0) {
892 if (PyList_GET_ITEM(list, i) == obj)
893 return 1;
894 }
895 PyList_Append(list, obj);
896 return 0;
897}
898
899void
900Py_ReprLeave(obj)
901 PyObject *obj;
902{
903 PyObject *dict;
904 PyObject *list;
905 int i;
906
907 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +0000908 if (dict == NULL)
909 return;
Guido van Rossum86610361998-04-10 22:32:46 +0000910 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +0000911 if (list == NULL || !PyList_Check(list))
912 return;
Guido van Rossum86610361998-04-10 22:32:46 +0000913 i = PyList_GET_SIZE(list);
914 /* Count backwards because we always expect obj to be list[-1] */
915 while (--i >= 0) {
916 if (PyList_GET_ITEM(list, i) == obj) {
917 PyList_SetSlice(list, i, i + 1, NULL);
918 break;
919 }
920 }
921}
Guido van Rossumd724b232000-03-13 16:01:29 +0000922
923/*
924 trashcan
925 CT 2k0130
926 non-recursively destroy nested objects
927
928 CT 2k0223
929 everything is now done in a macro.
930
931 CT 2k0305
932 modified to use functions, after Tim Peter's suggestion.
933
934 CT 2k0309
935 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +0000936
937 CT 2k0325
938 added better safe than sorry check for threadstate
Guido van Rossumd724b232000-03-13 16:01:29 +0000939*/
940
941int _PyTrash_delete_nesting = 0;
942PyObject * _PyTrash_delete_later = NULL;
943
944void
945_PyTrash_deposit_object(op)
946 PyObject *op;
947{
948 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +0000949
950 if (PyThreadState_GET() != NULL)
951 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumd724b232000-03-13 16:01:29 +0000952
953 if (!_PyTrash_delete_later)
954 _PyTrash_delete_later = PyList_New(0);
955 if (_PyTrash_delete_later)
956 PyList_Append(_PyTrash_delete_later, (PyObject *)op);
957
Guido van Rossum13ff8eb2000-03-25 18:39:19 +0000958 if (PyThreadState_GET() != NULL)
959 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossumd724b232000-03-13 16:01:29 +0000960}
961
962void
963_PyTrash_destroy_list()
964{
965 while (_PyTrash_delete_later) {
966 PyObject *shredder = _PyTrash_delete_later;
967 _PyTrash_delete_later = NULL;
968 ++_PyTrash_delete_nesting;
969 Py_DECREF(shredder);
970 --_PyTrash_delete_nesting;
971 }
972}