blob: bd1d17fb727ec6bd26e6144699e8f5a4302b7a2e [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
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000301PyObject *_PyCompareState_Key;
302
303/* _PyCompareState_nesting is incremented beforing call compare (for
304 some types) and decremented on exit. If the count exceeds the
305 nesting limit, enable code to detect circular data structures.
306*/
307#define NESTING_LIMIT 500
308int _PyCompareState_nesting = 0;
309
310static PyObject*
311get_inprogress_dict()
312{
313 PyObject *tstate_dict, *inprogress;
314
315 tstate_dict = PyThreadState_GetDict();
316 if (tstate_dict == NULL) {
317 PyErr_BadInternalCall();
318 return NULL;
319 }
320 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
321 if (inprogress == NULL) {
322 PyErr_Clear();
323 inprogress = PyDict_New();
324 if (inprogress == NULL)
325 return NULL;
326 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
327 inprogress) == -1) {
328 Py_DECREF(inprogress);
329 return NULL;
330 }
331 }
332 return inprogress;
333}
334
335static PyObject *
336make_pair(v, w)
337 PyObject *v, *w;
338{
339 PyObject *pair;
340
341 pair = PyTuple_New(2);
342 if (pair == NULL) {
343 return NULL;
344 }
345 if ((long)v <= (long)w) {
346 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
347 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
348 } else {
349 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
350 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
351 }
352 return pair;
353}
354
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356PyObject_Compare(v, w)
357 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000359 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000360 int result;
361
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000362 if (v == NULL || w == NULL) {
363 PyErr_BadInternalCall();
364 return -1;
365 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 if (v == w)
367 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 if (PyInstance_Check(v) || PyInstance_Check(w)) {
369 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000370 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 if (!PyInstance_Check(v))
372 return -PyObject_Compare(w, v);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000373 if (++_PyCompareState_nesting > NESTING_LIMIT) {
374 PyObject *inprogress, *pair;
375
376 inprogress = get_inprogress_dict();
377 if (inprogress == NULL) {
378 return -1;
379 }
380 pair = make_pair(v, w);
381 if (PyDict_GetItem(inprogress, pair)) {
382 /* already comparing these objects. assume
383 they're equal until shown otherwise */
384 Py_DECREF(pair);
385 --_PyCompareState_nesting;
386 return 0;
387 }
388 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
389 return -1;
390 }
391 res = do_cmp(v, w);
392 _PyCompareState_nesting--;
393 /* XXX DelItem shouldn't fail */
394 PyDict_DelItem(inprogress, pair);
395 Py_DECREF(pair);
396 } else {
397 res = do_cmp(v, w);
398 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000399 if (res == NULL)
400 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 if (!PyInt_Check(res)) {
402 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000403 PyErr_SetString(PyExc_TypeError,
404 "comparison did not return an int");
405 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000406 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 c = PyInt_AsLong(res);
408 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000409 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
410 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000411 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
412 char *vname = vtp->tp_name;
413 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000414 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000415 int err;
416 err = PyNumber_CoerceEx(&v, &w);
417 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000418 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000419 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000420 int cmp;
421 vtp = v->ob_type;
422 if (vtp->tp_compare == NULL)
423 cmp = (v < w) ? -1 : 1;
424 else
425 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 Py_DECREF(v);
427 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000428 return cmp;
429 }
430 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000431 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
432 int result = PyUnicode_Compare(v, w);
433 if (result == -1 && PyErr_Occurred() &&
434 PyErr_ExceptionMatches(PyExc_TypeError))
435 /* TypeErrors are ignored: if Unicode coercion
436 fails due to one of the arguments not
437 having the right type, we continue as
438 defined by the coercion protocol (see
439 above). Luckily, decoding errors are
440 reported as ValueErrors and are not masked
441 by this technique. */
442 PyErr_Clear();
443 else
444 return result;
445 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000446 else if (vtp->tp_as_number != NULL)
447 vname = "";
448 else if (wtp->tp_as_number != NULL)
449 wname = "";
450 /* Numerical types compare smaller than all other types */
451 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000452 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000453 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000455 }
456 if (++_PyCompareState_nesting > NESTING_LIMIT
457 && (vtp->tp_as_mapping
458 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
459 PyObject *inprogress, *pair;
460
461 inprogress = get_inprogress_dict();
462 if (inprogress == NULL) {
463 return -1;
464 }
465 pair = make_pair(v, w);
466 if (PyDict_GetItem(inprogress, pair)) {
467 /* already comparing these objects. assume
468 they're equal until shown otherwise */
469 _PyCompareState_nesting--;
470 Py_DECREF(pair);
471 return 0;
472 }
473 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
474 return -1;
475 }
476 result = (*vtp->tp_compare)(v, w);
477 _PyCompareState_nesting--;
478 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
479 Py_DECREF(pair);
480 } else {
481 result = (*vtp->tp_compare)(v, w);
482 }
483 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
485
Guido van Rossum9bfef441993-03-29 10:43:31 +0000486long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487PyObject_Hash(v)
488 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000491 if (tp->tp_hash != NULL)
492 return (*tp->tp_hash)(v);
493 if (tp->tp_compare == NULL)
494 return (long) v; /* Use address as hash value */
495 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000497 return -1;
498}
499
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500PyObject *
501PyObject_GetAttrString(v, name)
502 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 char *name;
504{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000505 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000507 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000508 if (w == NULL)
509 return NULL;
510 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000512 return res;
513 }
514
Guido van Rossum3f5da241990-12-20 15:06:42 +0000515 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000516 PyErr_Format(PyExc_AttributeError,
517 "'%.50s' object has no attribute '%.400s'",
518 v->ob_type->tp_name,
519 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000520 return NULL;
521 }
522 else {
523 return (*v->ob_type->tp_getattr)(v, name);
524 }
525}
526
527int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528PyObject_HasAttrString(v, name)
529 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000530 char *name;
531{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000533 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000535 return 1;
536 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000538 return 0;
539}
540
541int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542PyObject_SetAttrString(v, name, w)
543 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000544 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000546{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000547 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000549 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000550 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000551 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000552 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000553 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000555 return res;
556 }
557
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 if (v->ob_type->tp_setattr == NULL) {
559 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000561 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000564 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000565 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 }
567 else {
568 return (*v->ob_type->tp_setattr)(v, name, w);
569 }
570}
571
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000572PyObject *
573PyObject_GetAttr(v, name)
574 PyObject *v;
575 PyObject *name;
576{
577 if (v->ob_type->tp_getattro != NULL)
578 return (*v->ob_type->tp_getattro)(v, name);
579 else
580 return PyObject_GetAttrString(v, PyString_AsString(name));
581}
582
583int
584PyObject_HasAttr(v, name)
585 PyObject *v;
586 PyObject *name;
587{
588 PyObject *res = PyObject_GetAttr(v, name);
589 if (res != NULL) {
590 Py_DECREF(res);
591 return 1;
592 }
593 PyErr_Clear();
594 return 0;
595}
596
597int
598PyObject_SetAttr(v, name, value)
599 PyObject *v;
600 PyObject *name;
601 PyObject *value;
602{
603 int err;
604 Py_INCREF(name);
605 PyString_InternInPlace(&name);
606 if (v->ob_type->tp_setattro != NULL)
607 err = (*v->ob_type->tp_setattro)(v, name, value);
608 else
609 err = PyObject_SetAttrString(
610 v, PyString_AsString(name), value);
611 Py_DECREF(name);
612 return err;
613}
614
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000615/* Test a value used as condition, e.g., in a for or if statement.
616 Return -1 if an error occurred */
617
618int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619PyObject_IsTrue(v)
620 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000621{
622 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000624 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000625 else if (v->ob_type->tp_as_number != NULL &&
626 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000627 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000628 else if (v->ob_type->tp_as_mapping != NULL &&
629 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000630 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000631 else if (v->ob_type->tp_as_sequence != NULL &&
632 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000633 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
634 else
635 res = 1;
636 if (res > 0)
637 res = 1;
638 return res;
639}
640
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000641/* equivalent of 'not v'
642 Return -1 if an error occurred */
643
644int
645PyObject_Not(v)
646 PyObject *v;
647{
648 int res;
649 res = PyObject_IsTrue(v);
650 if (res < 0)
651 return res;
652 return res == 0;
653}
654
Guido van Rossum5524a591995-01-10 15:26:20 +0000655/* Coerce two numeric types to the "larger" one.
656 Increment the reference count on each argument.
657 Return -1 and raise an exception if no coercion is possible
658 (and then no reference count is incremented).
659*/
660
661int
Guido van Rossum242c6421997-11-19 16:03:17 +0000662PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000664{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 register PyObject *v = *pv;
666 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000667 int res;
668
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
670 Py_INCREF(v);
671 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000672 return 0;
673 }
674 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
675 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
676 if (res <= 0)
677 return res;
678 }
679 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
680 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
681 if (res <= 0)
682 return res;
683 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000684 return 1;
685}
686
687int
688PyNumber_Coerce(pv, pw)
689 PyObject **pv, **pw;
690{
691 int err = PyNumber_CoerceEx(pv, pw);
692 if (err <= 0)
693 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000695 return -1;
696}
697
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000699/* Test whether an object can be called */
700
701int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702PyCallable_Check(x)
703 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000704{
705 if (x == NULL)
706 return 0;
707 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 PyFunction_Check(x) ||
709 PyMethod_Check(x) ||
710 PyCFunction_Check(x) ||
711 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000712 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 if (PyInstance_Check(x)) {
714 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000715 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000717 return 0;
718 }
719 /* Could test recursively but don't, for fear of endless
720 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000722 return 1;
723 }
724 return 0;
725}
726
727
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000728/*
729NoObject is usable as a non-NULL undefined value, used by the macro None.
730There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000731so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000732*/
733
Guido van Rossum0c182a11992-03-27 17:26:13 +0000734/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000738{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000740}
741
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742static PyTypeObject PyNothing_Type = {
743 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000744 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000745 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000746 0,
747 0,
748 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000749 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000750 0, /*tp_getattr*/
751 0, /*tp_setattr*/
752 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000753 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000754 0, /*tp_as_number*/
755 0, /*tp_as_sequence*/
756 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000757 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758};
759
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760PyObject _Py_NoneStruct = {
761 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000762};
763
764
Guido van Rossum84a90321996-05-22 16:34:47 +0000765#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000769void
Guido van Rossume09fb551997-08-05 02:04:34 +0000770_Py_ResetReferences()
771{
772 refchain._ob_prev = refchain._ob_next = &refchain;
773 _Py_RefTotal = 0;
774}
775
776void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777_Py_NewReference(op)
778 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781 op->ob_refcnt = 1;
782 op->_ob_next = refchain._ob_next;
783 op->_ob_prev = &refchain;
784 refchain._ob_next->_ob_prev = op;
785 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000786#ifdef COUNT_ALLOCS
787 inc_count(op->ob_type);
788#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000789}
790
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000791void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792_Py_ForgetReference(op)
793 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000794{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000795#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000796 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000797#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000798 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000800 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000801 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000803#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
805 if (p == op)
806 break;
807 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000808 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000810#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000811 op->_ob_next->_ob_prev = op->_ob_prev;
812 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000813 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000814#ifdef COUNT_ALLOCS
815 op->ob_type->tp_free++;
816#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817}
818
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000819void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820_Py_Dealloc(op)
821 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000823 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 _Py_ForgetReference(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000825 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000826 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827}
828
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000829void
Guido van Rossumded690f1996-05-24 20:48:31 +0000830_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000831 FILE *fp;
832{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000834 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
836 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 if (PyObject_Print(op, fp, 0) != 0)
838 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839 putc('\n', fp);
840 }
841}
842
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000843PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000844_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000845 PyObject *self;
846 PyObject *args;
847{
848 int i, n;
849 PyObject *t = NULL;
850 PyObject *res, *op;
851
852 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
853 return NULL;
854 op = refchain._ob_next;
855 res = PyList_New(0);
856 if (res == NULL)
857 return NULL;
858 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
859 while (op == self || op == args || op == res || op == t ||
860 t != NULL && op->ob_type != (PyTypeObject *) t) {
861 op = op->_ob_next;
862 if (op == &refchain)
863 return res;
864 }
865 if (PyList_Append(res, op) < 0) {
866 Py_DECREF(res);
867 return NULL;
868 }
869 op = op->_ob_next;
870 }
871 return res;
872}
873
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000874#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000875
876
877/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000878PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000879
880
881/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +0000883
884
885/* Malloc wrappers (see mymalloc.h) */
886
887/* The Py_{Malloc,Realloc} wrappers call PyErr_NoMemory() on failure */
888
889ANY *
890Py_Malloc(nbytes)
891 size_t nbytes;
892{
893 ANY *p;
894#if _PyMem_EXTRA > 0
895 if (nbytes == 0)
896 nbytes = _PyMem_EXTRA;
897#endif
898 p = malloc(nbytes);
899 if (p != NULL)
900 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000901 else {
902 PyErr_NoMemory();
903 return NULL;
904 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000905}
906
907ANY *
908Py_Realloc(p, nbytes)
909 ANY *p;
910 size_t nbytes;
911{
912#if _PyMem_EXTRA > 0
913 if (nbytes == 0)
914 nbytes = _PyMem_EXTRA;
915#endif
916 p = realloc(p, nbytes);
917 if (p != NULL)
918 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000919 else {
920 PyErr_NoMemory();
921 return NULL;
922 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000923}
924
925void
926Py_Free(p)
927 ANY *p;
928{
929 free(p);
930}
931
932/* The PyMem_{Malloc,Realloc} wrappers don't call anything on failure */
933
934ANY *
935PyMem_Malloc(nbytes)
936 size_t nbytes;
937{
938#if _PyMem_EXTRA > 0
939 if (nbytes == 0)
940 nbytes = _PyMem_EXTRA;
941#endif
942 return malloc(nbytes);
943}
944
945ANY *
946PyMem_Realloc(p, nbytes)
947 ANY *p;
948 size_t nbytes;
949{
950#if _PyMem_EXTRA > 0
951 if (nbytes == 0)
952 nbytes = _PyMem_EXTRA;
953#endif
954 return realloc(p, nbytes);
955}
956
957void
958PyMem_Free(p)
959 ANY *p;
960{
961 free(p);
962}
Guido van Rossum86610361998-04-10 22:32:46 +0000963
964
965/* These methods are used to control infinite recursion in repr, str, print,
966 etc. Container objects that may recursively contain themselves,
967 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
968 Py_ReprLeave() to avoid infinite recursion.
969
970 Py_ReprEnter() returns 0 the first time it is called for a particular
971 object and 1 every time thereafter. It returns -1 if an exception
972 occurred. Py_ReprLeave() has no return value.
973
974 See dictobject.c and listobject.c for examples of use.
975*/
976
977#define KEY "Py_Repr"
978
979int
980Py_ReprEnter(obj)
981 PyObject *obj;
982{
983 PyObject *dict;
984 PyObject *list;
985 int i;
986
987 dict = PyThreadState_GetDict();
988 if (dict == NULL)
989 return -1;
990 list = PyDict_GetItemString(dict, KEY);
991 if (list == NULL) {
992 list = PyList_New(0);
993 if (list == NULL)
994 return -1;
995 if (PyDict_SetItemString(dict, KEY, list) < 0)
996 return -1;
997 Py_DECREF(list);
998 }
999 i = PyList_GET_SIZE(list);
1000 while (--i >= 0) {
1001 if (PyList_GET_ITEM(list, i) == obj)
1002 return 1;
1003 }
1004 PyList_Append(list, obj);
1005 return 0;
1006}
1007
1008void
1009Py_ReprLeave(obj)
1010 PyObject *obj;
1011{
1012 PyObject *dict;
1013 PyObject *list;
1014 int i;
1015
1016 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001017 if (dict == NULL)
1018 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001019 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001020 if (list == NULL || !PyList_Check(list))
1021 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001022 i = PyList_GET_SIZE(list);
1023 /* Count backwards because we always expect obj to be list[-1] */
1024 while (--i >= 0) {
1025 if (PyList_GET_ITEM(list, i) == obj) {
1026 PyList_SetSlice(list, i, i + 1, NULL);
1027 break;
1028 }
1029 }
1030}
Guido van Rossumd724b232000-03-13 16:01:29 +00001031
1032/*
1033 trashcan
1034 CT 2k0130
1035 non-recursively destroy nested objects
1036
1037 CT 2k0223
1038 everything is now done in a macro.
1039
1040 CT 2k0305
1041 modified to use functions, after Tim Peter's suggestion.
1042
1043 CT 2k0309
1044 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001045
1046 CT 2k0325
1047 added better safe than sorry check for threadstate
Guido van Rossumd724b232000-03-13 16:01:29 +00001048*/
1049
1050int _PyTrash_delete_nesting = 0;
1051PyObject * _PyTrash_delete_later = NULL;
1052
1053void
1054_PyTrash_deposit_object(op)
1055 PyObject *op;
1056{
1057 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001058
1059 if (PyThreadState_GET() != NULL)
1060 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumd724b232000-03-13 16:01:29 +00001061
1062 if (!_PyTrash_delete_later)
1063 _PyTrash_delete_later = PyList_New(0);
1064 if (_PyTrash_delete_later)
1065 PyList_Append(_PyTrash_delete_later, (PyObject *)op);
1066
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001067 if (PyThreadState_GET() != NULL)
1068 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossumd724b232000-03-13 16:01:29 +00001069}
1070
1071void
1072_PyTrash_destroy_list()
1073{
1074 while (_PyTrash_delete_later) {
1075 PyObject *shredder = _PyTrash_delete_later;
1076 _PyTrash_delete_later = NULL;
1077 ++_PyTrash_delete_nesting;
1078 Py_DECREF(shredder);
1079 --_PyTrash_delete_nesting;
1080 }
1081}