blob: ed276e27ed400fed234f815ef0fe36345ee20c37 [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 Rossume92e6102000-04-24 15:40:53 +000036/* just for trashcan: */
37#include "compile.h"
38#include "frameobject.h"
39#include "traceback.h"
40
Guido van Rossum6f9e4331995-03-29 16:57:48 +000041#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000042DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044
Guido van Rossum3f5da241990-12-20 15:06:42 +000045/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
46 These are used by the individual routines for object creation.
47 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000049#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000051extern int tuple_zero_allocs, fast_tuple_allocs;
52extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000053extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000054void
55dump_counts()
56{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000058
59 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000060 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
61 tp->tp_name, tp->tp_alloc, tp->tp_free,
62 tp->tp_maxalloc);
63 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
64 fast_tuple_allocs, tuple_zero_allocs);
65 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
66 quick_int_allocs, quick_neg_int_allocs);
67 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
68 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000069}
70
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000071PyObject *
72get_counts()
73{
74 PyTypeObject *tp;
75 PyObject *result;
76 PyObject *v;
77
78 result = PyList_New(0);
79 if (result == NULL)
80 return NULL;
81 for (tp = type_list; tp; tp = tp->tp_next) {
82 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
83 tp->tp_free, tp->tp_maxalloc);
84 if (v == NULL) {
85 Py_DECREF(result);
86 return NULL;
87 }
88 if (PyList_Append(result, v) < 0) {
89 Py_DECREF(v);
90 Py_DECREF(result);
91 return NULL;
92 }
93 Py_DECREF(v);
94 }
95 return result;
96}
97
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000098void
99inc_count(tp)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000101{
102 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000103 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000104 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000106 tp->tp_next = type_list;
107 type_list = tp;
108 }
109 tp->tp_alloc++;
110 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
111 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
112}
113#endif
114
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000115#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116PyObject *
117_PyObject_New(tp)
118 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000119#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120PyObject *
121_PyObject_New(tp,op)
122 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000123 PyObject *op;
124#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000126#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 PyObject *op = (PyObject *) malloc(tp->tp_basicsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000128#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 return op;
134}
135
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000136#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000137PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138_PyObject_NewVar(tp, size)
139 PyTypeObject *tp;
Guido van Rossum2497ead1995-02-10 17:00:27 +0000140 int size;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000141#else
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000142PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143_PyObject_NewVar(tp, size, op)
144 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000145 int size;
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000146 PyVarObject *op;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000147#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000149#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000150 PyVarObject *op = (PyVarObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 malloc(tp->tp_basicsize + size * tp->tp_itemsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000152#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000154 return (PyVarObject *)PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 op->ob_type = tp;
156 op->ob_size = size;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000157 _Py_NewReference((PyObject *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 return op;
159}
160
Guido van Rossum90933611991-06-07 16:10:43 +0000161int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162PyObject_Print(op, fp, flags)
163 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164 FILE *fp;
165 int flags;
166{
Guido van Rossum278ef591991-07-27 21:40:24 +0000167 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000169 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000170#ifdef USE_STACKCHECK
171 if (PyOS_CheckStack()) {
172 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
173 return -1;
174 }
175#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000176 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000177 if (op == NULL) {
178 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179 }
Guido van Rossum90933611991-06-07 16:10:43 +0000180 else {
181 if (op->ob_refcnt <= 0)
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000182 fprintf(fp, "<refcnt %u at %lx>",
183 op->ob_refcnt, (long)op);
184 else if (op->ob_type->tp_print == NULL) {
185 if (op->ob_type->tp_repr == NULL) {
186 fprintf(fp, "<%s object at %lx>",
187 op->ob_type->tp_name, (long)op);
188 }
189 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 PyObject *s;
191 if (flags & Py_PRINT_RAW)
192 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000193 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000195 if (s == NULL)
196 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000197 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000198 ret = PyObject_Print(s, fp,
199 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000200 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000202 }
203 }
Guido van Rossum90933611991-06-07 16:10:43 +0000204 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000205 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000206 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000207 if (ret == 0) {
208 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000210 clearerr(fp);
211 ret = -1;
212 }
213 }
214 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215}
216
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217PyObject *
218PyObject_Repr(v)
219 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000222 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000223#ifdef USE_STACKCHECK
224 if (PyOS_CheckStack()) {
225 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
226 return NULL;
227 }
228#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000229 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000231 else if (v->ob_type->tp_repr == NULL) {
232 char buf[120];
233 sprintf(buf, "<%.80s object at %lx>",
234 v->ob_type->tp_name, (long)v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 else {
238 PyObject *res;
239 res = (*v->ob_type->tp_repr)(v);
240 if (res == NULL)
241 return NULL;
242 if (!PyString_Check(res)) {
243 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000244 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245 res->ob_type->tp_name);
246 Py_DECREF(res);
247 return NULL;
248 }
249 return res;
250 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251}
252
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000253PyObject *
254PyObject_Str(v)
255 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000256{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000257 PyObject *res;
258
Guido van Rossumc6004111993-11-05 10:22:19 +0000259 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 return PyString_FromString("<NULL>");
261 else if (PyString_Check(v)) {
262 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000263 return v;
264 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000265 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000266 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000267 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 if (!PyInstance_Check(v) ||
270 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
271 PyErr_Clear();
272 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000273 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 res = PyEval_CallObject(func, (PyObject *)NULL);
275 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000276 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277 if (res == NULL)
278 return NULL;
279 if (!PyString_Check(res)) {
280 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000281 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282 res->ob_type->tp_name);
283 Py_DECREF(res);
284 return NULL;
285 }
286 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000287}
288
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000290do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000292{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000293 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000294 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
295 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 This is intentional -- it makes no sense to define cmp(x,y)
297 different than -cmp(y,x). */
298 if (PyInstance_Check(v) || PyInstance_Check(w))
299 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000300 c = PyObject_Compare(v, w);
301 if (c && PyErr_Occurred())
302 return NULL;
303 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000304}
305
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000306PyObject *_PyCompareState_Key;
307
308/* _PyCompareState_nesting is incremented beforing call compare (for
309 some types) and decremented on exit. If the count exceeds the
310 nesting limit, enable code to detect circular data structures.
311*/
312#define NESTING_LIMIT 500
313int _PyCompareState_nesting = 0;
314
315static PyObject*
316get_inprogress_dict()
317{
318 PyObject *tstate_dict, *inprogress;
319
320 tstate_dict = PyThreadState_GetDict();
321 if (tstate_dict == NULL) {
322 PyErr_BadInternalCall();
323 return NULL;
324 }
325 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
326 if (inprogress == NULL) {
327 PyErr_Clear();
328 inprogress = PyDict_New();
329 if (inprogress == NULL)
330 return NULL;
331 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
332 inprogress) == -1) {
333 Py_DECREF(inprogress);
334 return NULL;
335 }
336 }
337 return inprogress;
338}
339
340static PyObject *
341make_pair(v, w)
342 PyObject *v, *w;
343{
344 PyObject *pair;
345
346 pair = PyTuple_New(2);
347 if (pair == NULL) {
348 return NULL;
349 }
350 if ((long)v <= (long)w) {
351 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
352 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
353 } else {
354 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
355 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
356 }
357 return pair;
358}
359
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361PyObject_Compare(v, w)
362 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000364 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000365 int result;
366
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000367 if (v == NULL || w == NULL) {
368 PyErr_BadInternalCall();
369 return -1;
370 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 if (v == w)
372 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 if (PyInstance_Check(v) || PyInstance_Check(w)) {
374 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000375 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 if (!PyInstance_Check(v))
377 return -PyObject_Compare(w, v);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000378 if (++_PyCompareState_nesting > NESTING_LIMIT) {
379 PyObject *inprogress, *pair;
380
381 inprogress = get_inprogress_dict();
382 if (inprogress == NULL) {
383 return -1;
384 }
385 pair = make_pair(v, w);
386 if (PyDict_GetItem(inprogress, pair)) {
387 /* already comparing these objects. assume
388 they're equal until shown otherwise */
389 Py_DECREF(pair);
390 --_PyCompareState_nesting;
391 return 0;
392 }
393 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
394 return -1;
395 }
396 res = do_cmp(v, w);
397 _PyCompareState_nesting--;
398 /* XXX DelItem shouldn't fail */
399 PyDict_DelItem(inprogress, pair);
400 Py_DECREF(pair);
401 } else {
402 res = do_cmp(v, w);
403 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000404 if (res == NULL)
405 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 if (!PyInt_Check(res)) {
407 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000408 PyErr_SetString(PyExc_TypeError,
409 "comparison did not return an int");
410 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000411 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 c = PyInt_AsLong(res);
413 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000414 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
415 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000416 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
417 char *vname = vtp->tp_name;
418 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000419 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000420 int err;
421 err = PyNumber_CoerceEx(&v, &w);
422 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000423 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000424 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000425 int cmp;
426 vtp = v->ob_type;
427 if (vtp->tp_compare == NULL)
428 cmp = (v < w) ? -1 : 1;
429 else
430 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 Py_DECREF(v);
432 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000433 return cmp;
434 }
435 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000436 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
437 int result = PyUnicode_Compare(v, w);
438 if (result == -1 && PyErr_Occurred() &&
439 PyErr_ExceptionMatches(PyExc_TypeError))
440 /* TypeErrors are ignored: if Unicode coercion
441 fails due to one of the arguments not
442 having the right type, we continue as
443 defined by the coercion protocol (see
444 above). Luckily, decoding errors are
445 reported as ValueErrors and are not masked
446 by this technique. */
447 PyErr_Clear();
448 else
449 return result;
450 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000451 else if (vtp->tp_as_number != NULL)
452 vname = "";
453 else if (wtp->tp_as_number != NULL)
454 wname = "";
455 /* Numerical types compare smaller than all other types */
456 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000457 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000458 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000460 }
461 if (++_PyCompareState_nesting > NESTING_LIMIT
462 && (vtp->tp_as_mapping
463 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
464 PyObject *inprogress, *pair;
465
466 inprogress = get_inprogress_dict();
467 if (inprogress == NULL) {
468 return -1;
469 }
470 pair = make_pair(v, w);
471 if (PyDict_GetItem(inprogress, pair)) {
472 /* already comparing these objects. assume
473 they're equal until shown otherwise */
474 _PyCompareState_nesting--;
475 Py_DECREF(pair);
476 return 0;
477 }
478 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
479 return -1;
480 }
481 result = (*vtp->tp_compare)(v, w);
482 _PyCompareState_nesting--;
483 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
484 Py_DECREF(pair);
485 } else {
486 result = (*vtp->tp_compare)(v, w);
487 }
488 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489}
490
Guido van Rossum9bfef441993-03-29 10:43:31 +0000491long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492PyObject_Hash(v)
493 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000494{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000496 if (tp->tp_hash != NULL)
497 return (*tp->tp_hash)(v);
498 if (tp->tp_compare == NULL)
499 return (long) v; /* Use address as hash value */
500 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000502 return -1;
503}
504
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505PyObject *
506PyObject_GetAttrString(v, name)
507 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000508 char *name;
509{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000510 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000512 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000513 if (w == NULL)
514 return NULL;
515 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000517 return res;
518 }
519
Guido van Rossum3f5da241990-12-20 15:06:42 +0000520 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000521 PyErr_Format(PyExc_AttributeError,
522 "'%.50s' object has no attribute '%.400s'",
523 v->ob_type->tp_name,
524 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000525 return NULL;
526 }
527 else {
528 return (*v->ob_type->tp_getattr)(v, name);
529 }
530}
531
532int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533PyObject_HasAttrString(v, name)
534 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000535 char *name;
536{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000538 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000540 return 1;
541 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000543 return 0;
544}
545
546int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547PyObject_SetAttrString(v, name, w)
548 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000549 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000551{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000552 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000554 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000555 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000556 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000557 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000558 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000560 return res;
561 }
562
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 if (v->ob_type->tp_setattr == NULL) {
564 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000566 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000569 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000570 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000571 }
572 else {
573 return (*v->ob_type->tp_setattr)(v, name, w);
574 }
575}
576
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000577PyObject *
578PyObject_GetAttr(v, name)
579 PyObject *v;
580 PyObject *name;
581{
582 if (v->ob_type->tp_getattro != NULL)
583 return (*v->ob_type->tp_getattro)(v, name);
584 else
585 return PyObject_GetAttrString(v, PyString_AsString(name));
586}
587
588int
589PyObject_HasAttr(v, name)
590 PyObject *v;
591 PyObject *name;
592{
593 PyObject *res = PyObject_GetAttr(v, name);
594 if (res != NULL) {
595 Py_DECREF(res);
596 return 1;
597 }
598 PyErr_Clear();
599 return 0;
600}
601
602int
603PyObject_SetAttr(v, name, value)
604 PyObject *v;
605 PyObject *name;
606 PyObject *value;
607{
608 int err;
609 Py_INCREF(name);
610 PyString_InternInPlace(&name);
611 if (v->ob_type->tp_setattro != NULL)
612 err = (*v->ob_type->tp_setattro)(v, name, value);
613 else
614 err = PyObject_SetAttrString(
615 v, PyString_AsString(name), value);
616 Py_DECREF(name);
617 return err;
618}
619
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000620/* Test a value used as condition, e.g., in a for or if statement.
621 Return -1 if an error occurred */
622
623int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624PyObject_IsTrue(v)
625 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000626{
627 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000629 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000630 else if (v->ob_type->tp_as_number != NULL &&
631 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000632 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000633 else if (v->ob_type->tp_as_mapping != NULL &&
634 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000635 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000636 else if (v->ob_type->tp_as_sequence != NULL &&
637 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000638 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
639 else
640 res = 1;
641 if (res > 0)
642 res = 1;
643 return res;
644}
645
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000646/* equivalent of 'not v'
647 Return -1 if an error occurred */
648
649int
650PyObject_Not(v)
651 PyObject *v;
652{
653 int res;
654 res = PyObject_IsTrue(v);
655 if (res < 0)
656 return res;
657 return res == 0;
658}
659
Guido van Rossum5524a591995-01-10 15:26:20 +0000660/* Coerce two numeric types to the "larger" one.
661 Increment the reference count on each argument.
662 Return -1 and raise an exception if no coercion is possible
663 (and then no reference count is incremented).
664*/
665
666int
Guido van Rossum242c6421997-11-19 16:03:17 +0000667PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000669{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 register PyObject *v = *pv;
671 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000672 int res;
673
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
675 Py_INCREF(v);
676 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000677 return 0;
678 }
679 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
680 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
681 if (res <= 0)
682 return res;
683 }
684 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
685 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
686 if (res <= 0)
687 return res;
688 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000689 return 1;
690}
691
692int
693PyNumber_Coerce(pv, pw)
694 PyObject **pv, **pw;
695{
696 int err = PyNumber_CoerceEx(pv, pw);
697 if (err <= 0)
698 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000700 return -1;
701}
702
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000704/* Test whether an object can be called */
705
706int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707PyCallable_Check(x)
708 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000709{
710 if (x == NULL)
711 return 0;
712 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 PyFunction_Check(x) ||
714 PyMethod_Check(x) ||
715 PyCFunction_Check(x) ||
716 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000717 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 if (PyInstance_Check(x)) {
719 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000720 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000722 return 0;
723 }
724 /* Could test recursively but don't, for fear of endless
725 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000727 return 1;
728 }
729 return 0;
730}
731
732
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733/*
734NoObject is usable as a non-NULL undefined value, used by the macro None.
735There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000737*/
738
Guido van Rossum0c182a11992-03-27 17:26:13 +0000739/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000741none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000743{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745}
746
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747static PyTypeObject PyNothing_Type = {
748 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000749 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000750 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751 0,
752 0,
753 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000754 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000755 0, /*tp_getattr*/
756 0, /*tp_setattr*/
757 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000758 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000759 0, /*tp_as_number*/
760 0, /*tp_as_sequence*/
761 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000762 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763};
764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765PyObject _Py_NoneStruct = {
766 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767};
768
769
Guido van Rossum84a90321996-05-22 16:34:47 +0000770#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000774void
Guido van Rossume09fb551997-08-05 02:04:34 +0000775_Py_ResetReferences()
776{
777 refchain._ob_prev = refchain._ob_next = &refchain;
778 _Py_RefTotal = 0;
779}
780
781void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782_Py_NewReference(op)
783 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000786 op->ob_refcnt = 1;
787 op->_ob_next = refchain._ob_next;
788 op->_ob_prev = &refchain;
789 refchain._ob_next->_ob_prev = op;
790 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000791#ifdef COUNT_ALLOCS
792 inc_count(op->ob_type);
793#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000794}
795
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000796void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797_Py_ForgetReference(op)
798 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000800#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000801 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000802#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000803 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000805 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000806 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000808#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
810 if (p == op)
811 break;
812 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000813 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000815#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000816 op->_ob_next->_ob_prev = op->_ob_prev;
817 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000818 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000819#ifdef COUNT_ALLOCS
820 op->ob_type->tp_free++;
821#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822}
823
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000824void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825_Py_Dealloc(op)
826 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000828 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 _Py_ForgetReference(op);
Guido van Rossume92e6102000-04-24 15:40:53 +0000830 if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL-1)
831 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000832 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000833}
834
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000835void
Guido van Rossumded690f1996-05-24 20:48:31 +0000836_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837 FILE *fp;
838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000840 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000841 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
842 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 if (PyObject_Print(op, fp, 0) != 0)
844 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845 putc('\n', fp);
846 }
847}
848
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000849PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000850_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000851 PyObject *self;
852 PyObject *args;
853{
854 int i, n;
855 PyObject *t = NULL;
856 PyObject *res, *op;
857
858 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
859 return NULL;
860 op = refchain._ob_next;
861 res = PyList_New(0);
862 if (res == NULL)
863 return NULL;
864 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
865 while (op == self || op == args || op == res || op == t ||
866 t != NULL && op->ob_type != (PyTypeObject *) t) {
867 op = op->_ob_next;
868 if (op == &refchain)
869 return res;
870 }
871 if (PyList_Append(res, op) < 0) {
872 Py_DECREF(res);
873 return NULL;
874 }
875 op = op->_ob_next;
876 }
877 return res;
878}
879
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000880#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000881
882
883/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000884PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000885
886
887/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +0000889
890
891/* Malloc wrappers (see mymalloc.h) */
892
893/* The Py_{Malloc,Realloc} wrappers call PyErr_NoMemory() on failure */
894
895ANY *
896Py_Malloc(nbytes)
897 size_t nbytes;
898{
899 ANY *p;
900#if _PyMem_EXTRA > 0
901 if (nbytes == 0)
902 nbytes = _PyMem_EXTRA;
903#endif
904 p = malloc(nbytes);
905 if (p != NULL)
906 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000907 else {
908 PyErr_NoMemory();
909 return NULL;
910 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000911}
912
913ANY *
914Py_Realloc(p, nbytes)
915 ANY *p;
916 size_t nbytes;
917{
918#if _PyMem_EXTRA > 0
919 if (nbytes == 0)
920 nbytes = _PyMem_EXTRA;
921#endif
922 p = realloc(p, nbytes);
923 if (p != NULL)
924 return p;
Guido van Rossumea46e4d1997-08-12 14:54:54 +0000925 else {
926 PyErr_NoMemory();
927 return NULL;
928 }
Guido van Rossume09fb551997-08-05 02:04:34 +0000929}
930
931void
932Py_Free(p)
933 ANY *p;
934{
935 free(p);
936}
937
938/* The PyMem_{Malloc,Realloc} wrappers don't call anything on failure */
939
940ANY *
941PyMem_Malloc(nbytes)
942 size_t nbytes;
943{
944#if _PyMem_EXTRA > 0
945 if (nbytes == 0)
946 nbytes = _PyMem_EXTRA;
947#endif
948 return malloc(nbytes);
949}
950
951ANY *
952PyMem_Realloc(p, nbytes)
953 ANY *p;
954 size_t nbytes;
955{
956#if _PyMem_EXTRA > 0
957 if (nbytes == 0)
958 nbytes = _PyMem_EXTRA;
959#endif
960 return realloc(p, nbytes);
961}
962
963void
964PyMem_Free(p)
965 ANY *p;
966{
967 free(p);
968}
Guido van Rossum86610361998-04-10 22:32:46 +0000969
970
971/* These methods are used to control infinite recursion in repr, str, print,
972 etc. Container objects that may recursively contain themselves,
973 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
974 Py_ReprLeave() to avoid infinite recursion.
975
976 Py_ReprEnter() returns 0 the first time it is called for a particular
977 object and 1 every time thereafter. It returns -1 if an exception
978 occurred. Py_ReprLeave() has no return value.
979
980 See dictobject.c and listobject.c for examples of use.
981*/
982
983#define KEY "Py_Repr"
984
985int
986Py_ReprEnter(obj)
987 PyObject *obj;
988{
989 PyObject *dict;
990 PyObject *list;
991 int i;
992
993 dict = PyThreadState_GetDict();
994 if (dict == NULL)
995 return -1;
996 list = PyDict_GetItemString(dict, KEY);
997 if (list == NULL) {
998 list = PyList_New(0);
999 if (list == NULL)
1000 return -1;
1001 if (PyDict_SetItemString(dict, KEY, list) < 0)
1002 return -1;
1003 Py_DECREF(list);
1004 }
1005 i = PyList_GET_SIZE(list);
1006 while (--i >= 0) {
1007 if (PyList_GET_ITEM(list, i) == obj)
1008 return 1;
1009 }
1010 PyList_Append(list, obj);
1011 return 0;
1012}
1013
1014void
1015Py_ReprLeave(obj)
1016 PyObject *obj;
1017{
1018 PyObject *dict;
1019 PyObject *list;
1020 int i;
1021
1022 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001023 if (dict == NULL)
1024 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001025 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001026 if (list == NULL || !PyList_Check(list))
1027 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001028 i = PyList_GET_SIZE(list);
1029 /* Count backwards because we always expect obj to be list[-1] */
1030 while (--i >= 0) {
1031 if (PyList_GET_ITEM(list, i) == obj) {
1032 PyList_SetSlice(list, i, i + 1, NULL);
1033 break;
1034 }
1035 }
1036}
Guido van Rossumd724b232000-03-13 16:01:29 +00001037
1038/*
1039 trashcan
1040 CT 2k0130
1041 non-recursively destroy nested objects
1042
1043 CT 2k0223
1044 everything is now done in a macro.
1045
1046 CT 2k0305
1047 modified to use functions, after Tim Peter's suggestion.
1048
1049 CT 2k0309
1050 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001051
1052 CT 2k0325
1053 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001054
1055 CT 2k0422
1056 complete rewrite. We now build a chain via ob_type
1057 and save the limited number of types in ob_refcnt.
1058 This is perfect since we don't need any memory.
1059 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001060*/
1061
Guido van Rossume92e6102000-04-24 15:40:53 +00001062#define Py_TRASHCAN_TUPLE 1
1063#define Py_TRASHCAN_LIST 2
1064#define Py_TRASHCAN_DICT 3
1065#define Py_TRASHCAN_FRAME 4
1066#define Py_TRASHCAN_TRACEBACK 5
1067/* extend here if other objects want protection */
1068
Guido van Rossumd724b232000-03-13 16:01:29 +00001069int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001070
Guido van Rossumd724b232000-03-13 16:01:29 +00001071PyObject * _PyTrash_delete_later = NULL;
1072
1073void
1074_PyTrash_deposit_object(op)
1075 PyObject *op;
1076{
Guido van Rossume92e6102000-04-24 15:40:53 +00001077 int typecode;
1078 PyObject *hold = _PyTrash_delete_later;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001079
Guido van Rossume92e6102000-04-24 15:40:53 +00001080 if (PyTuple_Check(op))
1081 typecode = Py_TRASHCAN_TUPLE;
1082 else if (PyList_Check(op))
1083 typecode = Py_TRASHCAN_LIST;
1084 else if (PyDict_Check(op))
1085 typecode = Py_TRASHCAN_DICT;
1086 else if (PyFrame_Check(op))
1087 typecode = Py_TRASHCAN_FRAME;
1088 else if (PyTraceBack_Check(op))
1089 typecode = Py_TRASHCAN_TRACEBACK;
1090 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001091
Guido van Rossume92e6102000-04-24 15:40:53 +00001092 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1093 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001094}
1095
1096void
Guido van Rossume92e6102000-04-24 15:40:53 +00001097_PyTrash_destroy_chain()
Guido van Rossumd724b232000-03-13 16:01:29 +00001098{
1099 while (_PyTrash_delete_later) {
1100 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001101 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1102
1103 switch (shredder->ob_refcnt) {
1104 case Py_TRASHCAN_TUPLE:
1105 shredder->ob_type = &PyTuple_Type;
1106 break;
1107 case Py_TRASHCAN_LIST:
1108 shredder->ob_type = &PyList_Type;
1109 break;
1110 case Py_TRASHCAN_DICT:
1111 shredder->ob_type = &PyDict_Type;
1112 break;
1113 case Py_TRASHCAN_FRAME:
1114 shredder->ob_type = &PyFrame_Type;
1115 break;
1116 case Py_TRASHCAN_TRACEBACK:
1117 shredder->ob_type = &PyTraceBack_Type;
1118 break;
1119 }
1120 _Py_NewReference(shredder);
1121
Guido van Rossumd724b232000-03-13 16:01:29 +00001122 ++_PyTrash_delete_nesting;
1123 Py_DECREF(shredder);
1124 --_PyTrash_delete_nesting;
1125 }
1126}
Guido van Rossume92e6102000-04-24 15:40:53 +00001127