blob: 6fe05f1e8718a1d68cd6978d588bd2a14a3b34c8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Jack Jansen28fc8802000-07-11 21:47:20 +000015#ifdef macintosh
16#include "macglue.h"
17#endif
18
Fred Drake13634cf2000-06-29 19:17:04 +000019#include "mymath.h"
20
Guido van Rossume92e6102000-04-24 15:40:53 +000021/* just for trashcan: */
22#include "compile.h"
23#include "frameobject.h"
24#include "traceback.h"
25
Guido van Rossum6f9e4331995-03-29 16:57:48 +000026#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000027DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossum3f5da241990-12-20 15:06:42 +000030/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
31 These are used by the individual routines for object creation.
32 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000034#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000036extern int tuple_zero_allocs, fast_tuple_allocs;
37extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000038extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000039void
Fred Drake100814d2000-07-09 15:48:49 +000040dump_counts(void)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000041{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000043
44 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000045 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
46 tp->tp_name, tp->tp_alloc, tp->tp_free,
47 tp->tp_maxalloc);
48 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
49 fast_tuple_allocs, tuple_zero_allocs);
50 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
51 quick_int_allocs, quick_neg_int_allocs);
52 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
53 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000054}
55
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000056PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000057get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000058{
59 PyTypeObject *tp;
60 PyObject *result;
61 PyObject *v;
62
63 result = PyList_New(0);
64 if (result == NULL)
65 return NULL;
66 for (tp = type_list; tp; tp = tp->tp_next) {
67 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
68 tp->tp_free, tp->tp_maxalloc);
69 if (v == NULL) {
70 Py_DECREF(result);
71 return NULL;
72 }
73 if (PyList_Append(result, v) < 0) {
74 Py_DECREF(v);
75 Py_DECREF(result);
76 return NULL;
77 }
78 Py_DECREF(v);
79 }
80 return result;
81}
82
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000083void
Fred Drake100814d2000-07-09 15:48:49 +000084inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000085{
86 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000087 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000088 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000090 tp->tp_next = type_list;
91 type_list = tp;
92 }
93 tp->tp_alloc++;
94 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
95 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
96}
97#endif
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000100PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000102 if (op == NULL) {
103 PyErr_SetString(PyExc_SystemError,
104 "NULL object passed to PyObject_Init");
105 return op;
106 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000107#ifdef WITH_CYCLE_GC
108 if (PyType_IS_GC(tp))
109 op = (PyObject *) PyObject_FROM_GC(op);
110#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000111 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114 return op;
115}
116
Guido van Rossumb18618d2000-05-03 23:44:39 +0000117PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000118PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, int size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000119{
120 if (op == NULL) {
121 PyErr_SetString(PyExc_SystemError,
122 "NULL object passed to PyObject_InitVar");
123 return op;
124 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000125#ifdef WITH_CYCLE_GC
126 if (PyType_IS_GC(tp))
127 op = (PyVarObject *) PyObject_FROM_GC(op);
128#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000129 /* Any changes should be reflected in PyObject_INIT_VAR */
130 op->ob_size = size;
131 op->ob_type = tp;
132 _Py_NewReference((PyObject *)op);
133 return op;
134}
135
136PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000137_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000138{
139 PyObject *op;
140 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
141 if (op == NULL)
142 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000143#ifdef WITH_CYCLE_GC
144 if (PyType_IS_GC(tp))
145 op = (PyObject *) PyObject_FROM_GC(op);
146#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000147 return PyObject_INIT(op, tp);
148}
149
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000150PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000151_PyObject_NewVar(PyTypeObject *tp, int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000153 PyVarObject *op;
154 op = (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE(tp, size));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000156 return (PyVarObject *)PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000157#ifdef WITH_CYCLE_GC
158 if (PyType_IS_GC(tp))
159 op = (PyVarObject *) PyObject_FROM_GC(op);
160#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000161 return PyObject_INIT_VAR(op, tp, size);
162}
163
164void
Fred Drake100814d2000-07-09 15:48:49 +0000165_PyObject_Del(PyObject *op)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000166{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000167#ifdef WITH_CYCLE_GC
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000168 if (op && PyType_IS_GC(op->ob_type)) {
169 op = (PyObject *) PyObject_AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000170 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000171#endif
172 PyObject_FREE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173}
174
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000175#ifndef WITH_CYCLE_GC
176/* extension modules might need these */
177void _PyGC_Insert(PyObject *op) { }
178void _PyGC_Remove(PyObject *op) { }
179#endif
180
Guido van Rossum90933611991-06-07 16:10:43 +0000181int
Fred Drake100814d2000-07-09 15:48:49 +0000182PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183{
Guido van Rossum278ef591991-07-27 21:40:24 +0000184 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000186 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000187#ifdef USE_STACKCHECK
188 if (PyOS_CheckStack()) {
189 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
190 return -1;
191 }
192#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000193 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000194 if (op == NULL) {
195 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 }
Guido van Rossum90933611991-06-07 16:10:43 +0000197 else {
198 if (op->ob_refcnt <= 0)
Fred Drakea44d3532000-06-30 15:01:00 +0000199 fprintf(fp, "<refcnt %u at %p>",
200 op->ob_refcnt, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000201 else if (op->ob_type->tp_print == NULL) {
202 if (op->ob_type->tp_repr == NULL) {
Fred Drakea44d3532000-06-30 15:01:00 +0000203 fprintf(fp, "<%s object at %p>",
204 op->ob_type->tp_name, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000205 }
206 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyObject *s;
208 if (flags & Py_PRINT_RAW)
209 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000210 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000212 if (s == NULL)
213 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000214 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000215 ret = PyObject_Print(s, fp,
216 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000217 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000219 }
220 }
Guido van Rossum90933611991-06-07 16:10:43 +0000221 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000222 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000223 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000224 if (ret == 0) {
225 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000227 clearerr(fp);
228 ret = -1;
229 }
230 }
231 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232}
233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000235PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000238 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000239#ifdef USE_STACKCHECK
240 if (PyOS_CheckStack()) {
241 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
242 return NULL;
243 }
244#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000245 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000247 else if (v->ob_type->tp_repr == NULL) {
248 char buf[120];
Fred Drakea44d3532000-06-30 15:01:00 +0000249 sprintf(buf, "<%.80s object at %p>",
250 v->ob_type->tp_name, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 else {
254 PyObject *res;
255 res = (*v->ob_type->tp_repr)(v);
256 if (res == NULL)
257 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000258 if (PyUnicode_Check(res)) {
259 PyObject* str;
Fredrik Lundh2a1e0602000-07-08 17:43:32 +0000260 str = PyUnicode_AsUnicodeEscapeString(res);
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000261 Py_DECREF(res);
262 if (str)
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000263 res = str;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000264 else
265 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000266 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 if (!PyString_Check(res)) {
268 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000269 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 res->ob_type->tp_name);
271 Py_DECREF(res);
272 return NULL;
273 }
274 return res;
275 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276}
277
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000279PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000280{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000281 PyObject *res;
282
Guido van Rossumc6004111993-11-05 10:22:19 +0000283 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 return PyString_FromString("<NULL>");
285 else if (PyString_Check(v)) {
286 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000287 return v;
288 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000289 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000291 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 if (!PyInstance_Check(v) ||
294 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
295 PyErr_Clear();
296 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000297 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 res = PyEval_CallObject(func, (PyObject *)NULL);
299 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000300 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 if (res == NULL)
302 return NULL;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000303 if (PyUnicode_Check(res)) {
304 PyObject* str;
305 str = PyUnicode_AsEncodedString(res, NULL, NULL);
306 Py_DECREF(res);
307 if (str)
308 res = str;
309 else
310 return NULL;
311 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312 if (!PyString_Check(res)) {
313 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000314 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000315 res->ob_type->tp_name);
316 Py_DECREF(res);
317 return NULL;
318 }
319 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000320}
321
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000323do_cmp(PyObject *v, PyObject *w)
Guido van Rossum20566841995-01-12 11:26:10 +0000324{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000325 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000326 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
327 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 This is intentional -- it makes no sense to define cmp(x,y)
329 different than -cmp(y,x). */
330 if (PyInstance_Check(v) || PyInstance_Check(w))
331 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000332 c = PyObject_Compare(v, w);
333 if (c && PyErr_Occurred())
334 return NULL;
335 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000336}
337
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000338PyObject *_PyCompareState_Key;
339
Thomas Wouters7e474022000-07-16 12:04:32 +0000340/* _PyCompareState_nesting is incremented before calling compare (for
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000341 some types) and decremented on exit. If the count exceeds the
342 nesting limit, enable code to detect circular data structures.
343*/
344#define NESTING_LIMIT 500
345int _PyCompareState_nesting = 0;
346
347static PyObject*
Fred Drake100814d2000-07-09 15:48:49 +0000348get_inprogress_dict(void)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000349{
350 PyObject *tstate_dict, *inprogress;
351
352 tstate_dict = PyThreadState_GetDict();
353 if (tstate_dict == NULL) {
354 PyErr_BadInternalCall();
355 return NULL;
356 }
357 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
358 if (inprogress == NULL) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000359 inprogress = PyDict_New();
360 if (inprogress == NULL)
361 return NULL;
362 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
363 inprogress) == -1) {
364 Py_DECREF(inprogress);
365 return NULL;
366 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000367 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000368 }
369 return inprogress;
370}
371
372static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000373make_pair(PyObject *v, PyObject *w)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000374{
375 PyObject *pair;
376
377 pair = PyTuple_New(2);
378 if (pair == NULL) {
379 return NULL;
380 }
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000381 if (v <= w) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000382 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
383 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
384 } else {
385 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
386 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
387 }
388 return pair;
389}
390
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391int
Fred Drake100814d2000-07-09 15:48:49 +0000392PyObject_Compare(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000394 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000395 int result;
396
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000397 if (v == NULL || w == NULL) {
398 PyErr_BadInternalCall();
399 return -1;
400 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 if (v == w)
402 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 if (PyInstance_Check(v) || PyInstance_Check(w)) {
404 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000405 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 if (!PyInstance_Check(v))
407 return -PyObject_Compare(w, v);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000408 if (++_PyCompareState_nesting > NESTING_LIMIT) {
409 PyObject *inprogress, *pair;
410
411 inprogress = get_inprogress_dict();
412 if (inprogress == NULL) {
413 return -1;
414 }
415 pair = make_pair(v, w);
416 if (PyDict_GetItem(inprogress, pair)) {
417 /* already comparing these objects. assume
418 they're equal until shown otherwise */
419 Py_DECREF(pair);
420 --_PyCompareState_nesting;
421 return 0;
422 }
423 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
424 return -1;
425 }
426 res = do_cmp(v, w);
427 _PyCompareState_nesting--;
428 /* XXX DelItem shouldn't fail */
429 PyDict_DelItem(inprogress, pair);
430 Py_DECREF(pair);
431 } else {
432 res = do_cmp(v, w);
433 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000434 if (res == NULL)
435 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 if (!PyInt_Check(res)) {
437 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000438 PyErr_SetString(PyExc_TypeError,
439 "comparison did not return an int");
440 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000441 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 c = PyInt_AsLong(res);
443 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000444 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
445 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000446 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
447 char *vname = vtp->tp_name;
448 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000449 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000450 int err;
451 err = PyNumber_CoerceEx(&v, &w);
452 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000453 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000454 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000455 int cmp;
456 vtp = v->ob_type;
457 if (vtp->tp_compare == NULL)
458 cmp = (v < w) ? -1 : 1;
459 else
460 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 Py_DECREF(v);
462 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000463 return cmp;
464 }
465 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000466 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
467 int result = PyUnicode_Compare(v, w);
468 if (result == -1 && PyErr_Occurred() &&
469 PyErr_ExceptionMatches(PyExc_TypeError))
470 /* TypeErrors are ignored: if Unicode coercion
471 fails due to one of the arguments not
472 having the right type, we continue as
473 defined by the coercion protocol (see
474 above). Luckily, decoding errors are
475 reported as ValueErrors and are not masked
476 by this technique. */
477 PyErr_Clear();
478 else
479 return result;
480 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000481 else if (vtp->tp_as_number != NULL)
482 vname = "";
483 else if (wtp->tp_as_number != NULL)
484 wname = "";
485 /* Numerical types compare smaller than all other types */
486 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000487 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000488 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000490 }
491 if (++_PyCompareState_nesting > NESTING_LIMIT
492 && (vtp->tp_as_mapping
493 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
494 PyObject *inprogress, *pair;
495
496 inprogress = get_inprogress_dict();
497 if (inprogress == NULL) {
498 return -1;
499 }
500 pair = make_pair(v, w);
501 if (PyDict_GetItem(inprogress, pair)) {
502 /* already comparing these objects. assume
503 they're equal until shown otherwise */
504 _PyCompareState_nesting--;
505 Py_DECREF(pair);
506 return 0;
507 }
508 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
509 return -1;
510 }
511 result = (*vtp->tp_compare)(v, w);
512 _PyCompareState_nesting--;
513 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
514 Py_DECREF(pair);
515 } else {
516 result = (*vtp->tp_compare)(v, w);
517 }
518 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519}
520
Fred Drake13634cf2000-06-29 19:17:04 +0000521
522/* Set of hash utility functions to help maintaining the invariant that
523 iff a==b then hash(a)==hash(b)
524
525 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
526*/
527
528long
Fred Drake100814d2000-07-09 15:48:49 +0000529_Py_HashDouble(double v)
Fred Drake13634cf2000-06-29 19:17:04 +0000530{
531 /* Use frexp to get at the bits in the double.
532 * Since the VAX D double format has 56 mantissa bits, which is the
533 * most of any double format in use, each of these parts may have as
534 * many as (but no more than) 56 significant bits.
535 * So, assuming sizeof(long) >= 4, each part can be broken into two longs;
536 * frexp and multiplication are used to do that.
537 * Also, since the Cray double format has 15 exponent bits, which is the
538 * most of any double format in use, shifting the exponent field left by
539 * 15 won't overflow a long (again assuming sizeof(long) >= 4).
540 */
541 int expo;
542 long hipart;
543
544 v = frexp(v, &expo);
545 v = v * 2147483648.0; /* 2**31 */
546 hipart = (long)v; /* Take the top 32 bits */
547 v = (v - (double)hipart) * 2147483648.0; /* Get the next 32 bits */
548
549 return hipart + (long)v + (expo << 15); /* Combine everything */
550}
551
552long
Fred Drake100814d2000-07-09 15:48:49 +0000553_Py_HashPointer(void *p)
Fred Drake13634cf2000-06-29 19:17:04 +0000554{
555#if SIZEOF_LONG >= SIZEOF_VOID_P
556 return (long)p;
557#else
558 /* convert to a Python long and hash that */
559 PyObject* longobj;
560 long x;
561
562 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
563 x = -1;
564 goto finally;
565 }
566 x = PyObject_Hash(longobj);
567
568finally:
569 Py_XDECREF(longobj);
570 return x;
571#endif
572}
573
574
Guido van Rossum9bfef441993-03-29 10:43:31 +0000575long
Fred Drake100814d2000-07-09 15:48:49 +0000576PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000577{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000579 if (tp->tp_hash != NULL)
580 return (*tp->tp_hash)(v);
Fred Drake13634cf2000-06-29 19:17:04 +0000581 if (tp->tp_compare == NULL) {
582 return _Py_HashPointer(v); /* Use address as hash value */
583 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000586 return -1;
587}
588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000590PyObject_GetAttrString(PyObject *v, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000591{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000592 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000594 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000595 if (w == NULL)
596 return NULL;
597 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000599 return res;
600 }
601
Guido van Rossum3f5da241990-12-20 15:06:42 +0000602 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000603 PyErr_Format(PyExc_AttributeError,
604 "'%.50s' object has no attribute '%.400s'",
605 v->ob_type->tp_name,
606 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000607 return NULL;
608 }
609 else {
610 return (*v->ob_type->tp_getattr)(v, name);
611 }
612}
613
614int
Fred Drake100814d2000-07-09 15:48:49 +0000615PyObject_HasAttrString(PyObject *v, char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000616{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000618 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000620 return 1;
621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000623 return 0;
624}
625
626int
Fred Drake100814d2000-07-09 15:48:49 +0000627PyObject_SetAttrString(PyObject *v, char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000628{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000629 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000631 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000632 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000633 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000634 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000635 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000637 return res;
638 }
639
Guido van Rossum3f5da241990-12-20 15:06:42 +0000640 if (v->ob_type->tp_setattr == NULL) {
641 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000643 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000644 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000646 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000647 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000648 }
649 else {
650 return (*v->ob_type->tp_setattr)(v, name, w);
651 }
652}
653
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000654PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000655PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000656{
657 if (v->ob_type->tp_getattro != NULL)
658 return (*v->ob_type->tp_getattro)(v, name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000659
660 if (!PyString_Check(name)) {
661 PyErr_SetString(PyExc_TypeError,
662 "attribute name must be string");
663 return NULL;
664 }
665 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000666}
667
668int
Fred Drake100814d2000-07-09 15:48:49 +0000669PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000670{
671 PyObject *res = PyObject_GetAttr(v, name);
672 if (res != NULL) {
673 Py_DECREF(res);
674 return 1;
675 }
676 PyErr_Clear();
677 return 0;
678}
679
680int
Fred Drake100814d2000-07-09 15:48:49 +0000681PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000682{
683 int err;
684 Py_INCREF(name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000685 if (PyString_Check(name))
686 PyString_InternInPlace(&name);
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000687 if (v->ob_type->tp_setattro != NULL)
688 err = (*v->ob_type->tp_setattro)(v, name, value);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000689 else if (PyString_Check(name)) {
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000690 err = PyObject_SetAttrString(
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000691 v, PyString_AS_STRING(name), value);
692 }
693 else {
694 PyErr_SetString(PyExc_TypeError,
695 "attribute name must be string");
696 err = -1;
697 }
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000698 Py_DECREF(name);
699 return err;
700}
701
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000702/* Test a value used as condition, e.g., in a for or if statement.
703 Return -1 if an error occurred */
704
705int
Fred Drake100814d2000-07-09 15:48:49 +0000706PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000707{
708 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000710 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000711 else if (v->ob_type->tp_as_number != NULL &&
712 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000713 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000714 else if (v->ob_type->tp_as_mapping != NULL &&
715 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000716 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000717 else if (v->ob_type->tp_as_sequence != NULL &&
718 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000719 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
720 else
721 res = 1;
722 if (res > 0)
723 res = 1;
724 return res;
725}
726
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000727/* equivalent of 'not v'
728 Return -1 if an error occurred */
729
730int
Fred Drake100814d2000-07-09 15:48:49 +0000731PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000732{
733 int res;
734 res = PyObject_IsTrue(v);
735 if (res < 0)
736 return res;
737 return res == 0;
738}
739
Guido van Rossum5524a591995-01-10 15:26:20 +0000740/* Coerce two numeric types to the "larger" one.
741 Increment the reference count on each argument.
742 Return -1 and raise an exception if no coercion is possible
743 (and then no reference count is incremented).
744*/
745
746int
Fred Drake100814d2000-07-09 15:48:49 +0000747PyNumber_CoerceEx(PyObject **pv, PyObject **pw)
Guido van Rossum5524a591995-01-10 15:26:20 +0000748{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 register PyObject *v = *pv;
750 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000751 int res;
752
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
754 Py_INCREF(v);
755 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000756 return 0;
757 }
758 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
759 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
760 if (res <= 0)
761 return res;
762 }
763 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
764 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
765 if (res <= 0)
766 return res;
767 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000768 return 1;
769}
770
771int
Fred Drake100814d2000-07-09 15:48:49 +0000772PyNumber_Coerce(PyObject **pv, PyObject **pw)
Guido van Rossum242c6421997-11-19 16:03:17 +0000773{
774 int err = PyNumber_CoerceEx(pv, pw);
775 if (err <= 0)
776 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000778 return -1;
779}
780
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000782/* Test whether an object can be called */
783
784int
Fred Drake100814d2000-07-09 15:48:49 +0000785PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000786{
787 if (x == NULL)
788 return 0;
789 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 PyFunction_Check(x) ||
791 PyMethod_Check(x) ||
792 PyCFunction_Check(x) ||
793 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000794 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 if (PyInstance_Check(x)) {
796 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000797 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000799 return 0;
800 }
801 /* Could test recursively but don't, for fear of endless
802 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000804 return 1;
805 }
806 return 0;
807}
808
809
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000810/*
811NoObject is usable as a non-NULL undefined value, used by the macro None.
812There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000813so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000814*/
815
Guido van Rossum0c182a11992-03-27 17:26:13 +0000816/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000818none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000821}
822
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823static PyTypeObject PyNothing_Type = {
824 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000825 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827 0,
828 0,
829 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000830 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000831 0, /*tp_getattr*/
832 0, /*tp_setattr*/
833 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000834 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000835 0, /*tp_as_number*/
836 0, /*tp_as_sequence*/
837 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839};
840
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841PyObject _Py_NoneStruct = {
842 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000843};
844
845
Guido van Rossum84a90321996-05-22 16:34:47 +0000846#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000847
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000848static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000850void
Fred Drake100814d2000-07-09 15:48:49 +0000851_Py_ResetReferences(void)
Guido van Rossume09fb551997-08-05 02:04:34 +0000852{
853 refchain._ob_prev = refchain._ob_next = &refchain;
854 _Py_RefTotal = 0;
855}
856
857void
Fred Drake100814d2000-07-09 15:48:49 +0000858_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000859{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000861 op->ob_refcnt = 1;
862 op->_ob_next = refchain._ob_next;
863 op->_ob_prev = &refchain;
864 refchain._ob_next->_ob_prev = op;
865 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000866#ifdef COUNT_ALLOCS
867 inc_count(op->ob_type);
868#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000869}
870
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000871void
Fred Drake100814d2000-07-09 15:48:49 +0000872_Py_ForgetReference(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000873{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000874#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000875 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000876#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000877 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000879 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000880 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000882#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000883 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
884 if (p == op)
885 break;
886 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000887 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000889#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000890 op->_ob_next->_ob_prev = op->_ob_prev;
891 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000892 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000893#ifdef COUNT_ALLOCS
894 op->ob_type->tp_free++;
895#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896}
897
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000898void
Fred Drake100814d2000-07-09 15:48:49 +0000899_Py_Dealloc(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000900{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000901 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 _Py_ForgetReference(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000903#ifndef WITH_CYCLE_GC
Guido van Rossume92e6102000-04-24 15:40:53 +0000904 if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL-1)
905 op->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000906#endif
Guido van Rossum9776adf1994-09-07 14:36:45 +0000907 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000908}
909
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000910void
Fred Drake100814d2000-07-09 15:48:49 +0000911_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000912{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000914 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000915 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
916 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 if (PyObject_Print(op, fp, 0) != 0)
918 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000919 putc('\n', fp);
920 }
921}
922
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000923PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000924_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000925{
926 int i, n;
927 PyObject *t = NULL;
928 PyObject *res, *op;
929
930 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
931 return NULL;
932 op = refchain._ob_next;
933 res = PyList_New(0);
934 if (res == NULL)
935 return NULL;
936 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
937 while (op == self || op == args || op == res || op == t ||
938 t != NULL && op->ob_type != (PyTypeObject *) t) {
939 op = op->_ob_next;
940 if (op == &refchain)
941 return res;
942 }
943 if (PyList_Append(res, op) < 0) {
944 Py_DECREF(res);
945 return NULL;
946 }
947 op = op->_ob_next;
948 }
949 return res;
950}
951
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000952#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000953
954
955/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000956PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000957
958
959/* Hack to force loading of abstract.o */
Jeremy Hylton6253f832000-07-12 12:56:19 +0000960int (*_Py_abstract_hack)(PyObject *) = &PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +0000961
962
Guido van Rossumb18618d2000-05-03 23:44:39 +0000963/* Python's malloc wrappers (see mymalloc.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +0000964
Thomas Wouters334fb892000-07-25 12:56:38 +0000965void *
Fred Drake100814d2000-07-09 15:48:49 +0000966PyMem_Malloc(size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +0000967{
968#if _PyMem_EXTRA > 0
969 if (nbytes == 0)
970 nbytes = _PyMem_EXTRA;
971#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000972 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +0000973}
974
Thomas Wouters334fb892000-07-25 12:56:38 +0000975void *
976PyMem_Realloc(void *p, size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +0000977{
978#if _PyMem_EXTRA > 0
979 if (nbytes == 0)
980 nbytes = _PyMem_EXTRA;
981#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000982 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +0000983}
984
985void
Thomas Wouters334fb892000-07-25 12:56:38 +0000986PyMem_Free(void *p)
Guido van Rossume09fb551997-08-05 02:04:34 +0000987{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000988 PyMem_FREE(p);
989}
990
991
992/* Python's object malloc wrappers (see objimpl.h) */
993
Thomas Wouters334fb892000-07-25 12:56:38 +0000994void *
Fred Drake100814d2000-07-09 15:48:49 +0000995PyObject_Malloc(size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000996{
997 return PyObject_MALLOC(nbytes);
998}
999
Thomas Wouters334fb892000-07-25 12:56:38 +00001000void *
1001PyObject_Realloc(void *p, size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001002{
1003 return PyObject_REALLOC(p, nbytes);
1004}
1005
1006void
Thomas Wouters334fb892000-07-25 12:56:38 +00001007PyObject_Free(void *p)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001008{
1009 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001010}
Guido van Rossum86610361998-04-10 22:32:46 +00001011
1012
1013/* These methods are used to control infinite recursion in repr, str, print,
1014 etc. Container objects that may recursively contain themselves,
1015 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1016 Py_ReprLeave() to avoid infinite recursion.
1017
1018 Py_ReprEnter() returns 0 the first time it is called for a particular
1019 object and 1 every time thereafter. It returns -1 if an exception
1020 occurred. Py_ReprLeave() has no return value.
1021
1022 See dictobject.c and listobject.c for examples of use.
1023*/
1024
1025#define KEY "Py_Repr"
1026
1027int
Fred Drake100814d2000-07-09 15:48:49 +00001028Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001029{
1030 PyObject *dict;
1031 PyObject *list;
1032 int i;
1033
1034 dict = PyThreadState_GetDict();
1035 if (dict == NULL)
1036 return -1;
1037 list = PyDict_GetItemString(dict, KEY);
1038 if (list == NULL) {
1039 list = PyList_New(0);
1040 if (list == NULL)
1041 return -1;
1042 if (PyDict_SetItemString(dict, KEY, list) < 0)
1043 return -1;
1044 Py_DECREF(list);
1045 }
1046 i = PyList_GET_SIZE(list);
1047 while (--i >= 0) {
1048 if (PyList_GET_ITEM(list, i) == obj)
1049 return 1;
1050 }
1051 PyList_Append(list, obj);
1052 return 0;
1053}
1054
1055void
Fred Drake100814d2000-07-09 15:48:49 +00001056Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001057{
1058 PyObject *dict;
1059 PyObject *list;
1060 int i;
1061
1062 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001063 if (dict == NULL)
1064 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001065 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001066 if (list == NULL || !PyList_Check(list))
1067 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001068 i = PyList_GET_SIZE(list);
1069 /* Count backwards because we always expect obj to be list[-1] */
1070 while (--i >= 0) {
1071 if (PyList_GET_ITEM(list, i) == obj) {
1072 PyList_SetSlice(list, i, i + 1, NULL);
1073 break;
1074 }
1075 }
1076}
Guido van Rossumd724b232000-03-13 16:01:29 +00001077
1078/*
1079 trashcan
1080 CT 2k0130
1081 non-recursively destroy nested objects
1082
1083 CT 2k0223
1084 everything is now done in a macro.
1085
1086 CT 2k0305
1087 modified to use functions, after Tim Peter's suggestion.
1088
1089 CT 2k0309
1090 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001091
1092 CT 2k0325
1093 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001094
1095 CT 2k0422
1096 complete rewrite. We now build a chain via ob_type
1097 and save the limited number of types in ob_refcnt.
1098 This is perfect since we don't need any memory.
1099 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001100*/
1101
Guido van Rossume92e6102000-04-24 15:40:53 +00001102#define Py_TRASHCAN_TUPLE 1
1103#define Py_TRASHCAN_LIST 2
1104#define Py_TRASHCAN_DICT 3
1105#define Py_TRASHCAN_FRAME 4
1106#define Py_TRASHCAN_TRACEBACK 5
1107/* extend here if other objects want protection */
1108
Guido van Rossumd724b232000-03-13 16:01:29 +00001109int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001110
Guido van Rossumd724b232000-03-13 16:01:29 +00001111PyObject * _PyTrash_delete_later = NULL;
1112
1113void
Fred Drake100814d2000-07-09 15:48:49 +00001114_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00001115{
Guido van Rossume92e6102000-04-24 15:40:53 +00001116 int typecode;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001117
Guido van Rossume92e6102000-04-24 15:40:53 +00001118 if (PyTuple_Check(op))
1119 typecode = Py_TRASHCAN_TUPLE;
1120 else if (PyList_Check(op))
1121 typecode = Py_TRASHCAN_LIST;
1122 else if (PyDict_Check(op))
1123 typecode = Py_TRASHCAN_DICT;
1124 else if (PyFrame_Check(op))
1125 typecode = Py_TRASHCAN_FRAME;
1126 else if (PyTraceBack_Check(op))
1127 typecode = Py_TRASHCAN_TRACEBACK;
1128 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001129
Guido van Rossume92e6102000-04-24 15:40:53 +00001130 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1131 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001132}
1133
1134void
Fred Drake100814d2000-07-09 15:48:49 +00001135_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00001136{
1137 while (_PyTrash_delete_later) {
1138 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001139 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1140
1141 switch (shredder->ob_refcnt) {
1142 case Py_TRASHCAN_TUPLE:
1143 shredder->ob_type = &PyTuple_Type;
1144 break;
1145 case Py_TRASHCAN_LIST:
1146 shredder->ob_type = &PyList_Type;
1147 break;
1148 case Py_TRASHCAN_DICT:
1149 shredder->ob_type = &PyDict_Type;
1150 break;
1151 case Py_TRASHCAN_FRAME:
1152 shredder->ob_type = &PyFrame_Type;
1153 break;
1154 case Py_TRASHCAN_TRACEBACK:
1155 shredder->ob_type = &PyTraceBack_Type;
1156 break;
1157 }
1158 _Py_NewReference(shredder);
1159
Guido van Rossumd724b232000-03-13 16:01:29 +00001160 ++_PyTrash_delete_nesting;
1161 Py_DECREF(shredder);
1162 --_PyTrash_delete_nesting;
1163 }
1164}