blob: 7f38dff6e29ea4840be96fcb3f269d1799f3a8db [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
Fred Drake13634cf2000-06-29 19:17:04 +000015#include "mymath.h"
16
Guido van Rossume92e6102000-04-24 15:40:53 +000017/* just for trashcan: */
18#include "compile.h"
19#include "frameobject.h"
20#include "traceback.h"
21
Guido van Rossum6f9e4331995-03-29 16:57:48 +000022#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000023DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000024#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025
Guido van Rossum3f5da241990-12-20 15:06:42 +000026/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
27 These are used by the individual routines for object creation.
28 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000030#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000032extern int tuple_zero_allocs, fast_tuple_allocs;
33extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000034extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000035void
36dump_counts()
37{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000039
40 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000041 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
42 tp->tp_name, tp->tp_alloc, tp->tp_free,
43 tp->tp_maxalloc);
44 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
45 fast_tuple_allocs, tuple_zero_allocs);
46 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
47 quick_int_allocs, quick_neg_int_allocs);
48 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
49 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000050}
51
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000052PyObject *
53get_counts()
54{
55 PyTypeObject *tp;
56 PyObject *result;
57 PyObject *v;
58
59 result = PyList_New(0);
60 if (result == NULL)
61 return NULL;
62 for (tp = type_list; tp; tp = tp->tp_next) {
63 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
64 tp->tp_free, tp->tp_maxalloc);
65 if (v == NULL) {
66 Py_DECREF(result);
67 return NULL;
68 }
69 if (PyList_Append(result, v) < 0) {
70 Py_DECREF(v);
71 Py_DECREF(result);
72 return NULL;
73 }
74 Py_DECREF(v);
75 }
76 return result;
77}
78
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000079void
80inc_count(tp)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000082{
83 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000084 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000085 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000087 tp->tp_next = type_list;
88 type_list = tp;
89 }
90 tp->tp_alloc++;
91 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
92 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
93}
94#endif
95
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096PyObject *
Guido van Rossumb18618d2000-05-03 23:44:39 +000097PyObject_Init(op, tp)
Guido van Rossumf5030ab1996-07-21 02:30:39 +000098 PyObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +000099 PyTypeObject *tp;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000101 if (op == NULL) {
102 PyErr_SetString(PyExc_SystemError,
103 "NULL object passed to PyObject_Init");
104 return op;
105 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000106#ifdef WITH_CYCLE_GC
107 if (PyType_IS_GC(tp))
108 op = (PyObject *) PyObject_FROM_GC(op);
109#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 return op;
114}
115
Guido van Rossumb18618d2000-05-03 23:44:39 +0000116PyVarObject *
117PyObject_InitVar(op, tp, size)
118 PyVarObject *op;
119 PyTypeObject *tp;
120 int size;
121{
122 if (op == NULL) {
123 PyErr_SetString(PyExc_SystemError,
124 "NULL object passed to PyObject_InitVar");
125 return op;
126 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000127#ifdef WITH_CYCLE_GC
128 if (PyType_IS_GC(tp))
129 op = (PyVarObject *) PyObject_FROM_GC(op);
130#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000131 /* Any changes should be reflected in PyObject_INIT_VAR */
132 op->ob_size = size;
133 op->ob_type = tp;
134 _Py_NewReference((PyObject *)op);
135 return op;
136}
137
138PyObject *
139_PyObject_New(tp)
140 PyTypeObject *tp;
141{
142 PyObject *op;
143 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
144 if (op == NULL)
145 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000146#ifdef WITH_CYCLE_GC
147 if (PyType_IS_GC(tp))
148 op = (PyObject *) PyObject_FROM_GC(op);
149#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000150 return PyObject_INIT(op, tp);
151}
152
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000153PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154_PyObject_NewVar(tp, size)
155 PyTypeObject *tp;
Guido van Rossum2497ead1995-02-10 17:00:27 +0000156 int size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000158 PyVarObject *op;
159 op = (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE(tp, size));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000161 return (PyVarObject *)PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000162#ifdef WITH_CYCLE_GC
163 if (PyType_IS_GC(tp))
164 op = (PyVarObject *) PyObject_FROM_GC(op);
165#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000166 return PyObject_INIT_VAR(op, tp, size);
167}
168
169void
170_PyObject_Del(op)
171 PyObject *op;
172{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000173#ifdef WITH_CYCLE_GC
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000174 if (op && PyType_IS_GC(op->ob_type)) {
175 op = (PyObject *) PyObject_AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000176 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000177#endif
178 PyObject_FREE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179}
180
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000181#ifndef WITH_CYCLE_GC
182/* extension modules might need these */
183void _PyGC_Insert(PyObject *op) { }
184void _PyGC_Remove(PyObject *op) { }
185#endif
186
Guido van Rossum90933611991-06-07 16:10:43 +0000187int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188PyObject_Print(op, fp, flags)
189 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190 FILE *fp;
191 int flags;
192{
Guido van Rossum278ef591991-07-27 21:40:24 +0000193 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000195 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000196#ifdef USE_STACKCHECK
197 if (PyOS_CheckStack()) {
198 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
199 return -1;
200 }
201#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000202 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000203 if (op == NULL) {
204 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 }
Guido van Rossum90933611991-06-07 16:10:43 +0000206 else {
207 if (op->ob_refcnt <= 0)
Fred Drakea44d3532000-06-30 15:01:00 +0000208 fprintf(fp, "<refcnt %u at %p>",
209 op->ob_refcnt, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000210 else if (op->ob_type->tp_print == NULL) {
211 if (op->ob_type->tp_repr == NULL) {
Fred Drakea44d3532000-06-30 15:01:00 +0000212 fprintf(fp, "<%s object at %p>",
213 op->ob_type->tp_name, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000214 }
215 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 PyObject *s;
217 if (flags & Py_PRINT_RAW)
218 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000219 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000221 if (s == NULL)
222 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000223 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000224 ret = PyObject_Print(s, fp,
225 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000226 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000228 }
229 }
Guido van Rossum90933611991-06-07 16:10:43 +0000230 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000231 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000232 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000233 if (ret == 0) {
234 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000236 clearerr(fp);
237 ret = -1;
238 }
239 }
240 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241}
242
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243PyObject *
244PyObject_Repr(v)
245 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000248 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000249#ifdef USE_STACKCHECK
250 if (PyOS_CheckStack()) {
251 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
252 return NULL;
253 }
254#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000255 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000257 else if (v->ob_type->tp_repr == NULL) {
258 char buf[120];
Fred Drakea44d3532000-06-30 15:01:00 +0000259 sprintf(buf, "<%.80s object at %p>",
260 v->ob_type->tp_name, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 else {
264 PyObject *res;
265 res = (*v->ob_type->tp_repr)(v);
266 if (res == NULL)
267 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000268 if (PyUnicode_Check(res)) {
269 PyObject* str;
270 str = PyUnicode_AsEncodedString(res, NULL, NULL);
271 if (str) {
272 Py_DECREF(res);
273 res = str;
274 }
275 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000276 if (!PyString_Check(res)) {
277 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000278 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 res->ob_type->tp_name);
280 Py_DECREF(res);
281 return NULL;
282 }
283 return res;
284 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285}
286
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287PyObject *
288PyObject_Str(v)
289 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000290{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291 PyObject *res;
292
Guido van Rossumc6004111993-11-05 10:22:19 +0000293 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 return PyString_FromString("<NULL>");
295 else if (PyString_Check(v)) {
296 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000297 return v;
298 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000299 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000301 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 if (!PyInstance_Check(v) ||
304 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
305 PyErr_Clear();
306 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000307 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 res = PyEval_CallObject(func, (PyObject *)NULL);
309 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000310 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (res == NULL)
312 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000313 if (PyUnicode_Check(res)) {
314 PyObject* str;
315 str = PyUnicode_AsEncodedString(res, NULL, NULL);
316 if (str) {
317 Py_DECREF(res);
318 res = str;
319 }
320 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 if (!PyString_Check(res)) {
322 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000323 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000324 res->ob_type->tp_name);
325 Py_DECREF(res);
326 return NULL;
327 }
328 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000329}
330
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000332do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000334{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000335 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000336 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
337 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 This is intentional -- it makes no sense to define cmp(x,y)
339 different than -cmp(y,x). */
340 if (PyInstance_Check(v) || PyInstance_Check(w))
341 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000342 c = PyObject_Compare(v, w);
343 if (c && PyErr_Occurred())
344 return NULL;
345 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000346}
347
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000348PyObject *_PyCompareState_Key;
349
350/* _PyCompareState_nesting is incremented beforing call compare (for
351 some types) and decremented on exit. If the count exceeds the
352 nesting limit, enable code to detect circular data structures.
353*/
354#define NESTING_LIMIT 500
355int _PyCompareState_nesting = 0;
356
357static PyObject*
358get_inprogress_dict()
359{
360 PyObject *tstate_dict, *inprogress;
361
362 tstate_dict = PyThreadState_GetDict();
363 if (tstate_dict == NULL) {
364 PyErr_BadInternalCall();
365 return NULL;
366 }
367 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
368 if (inprogress == NULL) {
369 PyErr_Clear();
370 inprogress = PyDict_New();
371 if (inprogress == NULL)
372 return NULL;
373 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
374 inprogress) == -1) {
375 Py_DECREF(inprogress);
376 return NULL;
377 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000378 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000379 }
380 return inprogress;
381}
382
383static PyObject *
384make_pair(v, w)
385 PyObject *v, *w;
386{
387 PyObject *pair;
388
389 pair = PyTuple_New(2);
390 if (pair == NULL) {
391 return NULL;
392 }
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000393 if (v <= w) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000394 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
395 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
396 } else {
397 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
398 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
399 }
400 return pair;
401}
402
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404PyObject_Compare(v, w)
405 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000407 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000408 int result;
409
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000410 if (v == NULL || w == NULL) {
411 PyErr_BadInternalCall();
412 return -1;
413 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 if (v == w)
415 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 if (PyInstance_Check(v) || PyInstance_Check(w)) {
417 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000418 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 if (!PyInstance_Check(v))
420 return -PyObject_Compare(w, v);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000421 if (++_PyCompareState_nesting > NESTING_LIMIT) {
422 PyObject *inprogress, *pair;
423
424 inprogress = get_inprogress_dict();
425 if (inprogress == NULL) {
426 return -1;
427 }
428 pair = make_pair(v, w);
429 if (PyDict_GetItem(inprogress, pair)) {
430 /* already comparing these objects. assume
431 they're equal until shown otherwise */
432 Py_DECREF(pair);
433 --_PyCompareState_nesting;
434 return 0;
435 }
436 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
437 return -1;
438 }
439 res = do_cmp(v, w);
440 _PyCompareState_nesting--;
441 /* XXX DelItem shouldn't fail */
442 PyDict_DelItem(inprogress, pair);
443 Py_DECREF(pair);
444 } else {
445 res = do_cmp(v, w);
446 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000447 if (res == NULL)
448 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 if (!PyInt_Check(res)) {
450 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000451 PyErr_SetString(PyExc_TypeError,
452 "comparison did not return an int");
453 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000454 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 c = PyInt_AsLong(res);
456 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000457 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
458 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000459 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
460 char *vname = vtp->tp_name;
461 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000462 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000463 int err;
464 err = PyNumber_CoerceEx(&v, &w);
465 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000466 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000467 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000468 int cmp;
469 vtp = v->ob_type;
470 if (vtp->tp_compare == NULL)
471 cmp = (v < w) ? -1 : 1;
472 else
473 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 Py_DECREF(v);
475 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000476 return cmp;
477 }
478 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000479 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
480 int result = PyUnicode_Compare(v, w);
481 if (result == -1 && PyErr_Occurred() &&
482 PyErr_ExceptionMatches(PyExc_TypeError))
483 /* TypeErrors are ignored: if Unicode coercion
484 fails due to one of the arguments not
485 having the right type, we continue as
486 defined by the coercion protocol (see
487 above). Luckily, decoding errors are
488 reported as ValueErrors and are not masked
489 by this technique. */
490 PyErr_Clear();
491 else
492 return result;
493 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000494 else if (vtp->tp_as_number != NULL)
495 vname = "";
496 else if (wtp->tp_as_number != NULL)
497 wname = "";
498 /* Numerical types compare smaller than all other types */
499 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000500 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000501 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000503 }
504 if (++_PyCompareState_nesting > NESTING_LIMIT
505 && (vtp->tp_as_mapping
506 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
507 PyObject *inprogress, *pair;
508
509 inprogress = get_inprogress_dict();
510 if (inprogress == NULL) {
511 return -1;
512 }
513 pair = make_pair(v, w);
514 if (PyDict_GetItem(inprogress, pair)) {
515 /* already comparing these objects. assume
516 they're equal until shown otherwise */
517 _PyCompareState_nesting--;
518 Py_DECREF(pair);
519 return 0;
520 }
521 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
522 return -1;
523 }
524 result = (*vtp->tp_compare)(v, w);
525 _PyCompareState_nesting--;
526 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
527 Py_DECREF(pair);
528 } else {
529 result = (*vtp->tp_compare)(v, w);
530 }
531 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532}
533
Fred Drake13634cf2000-06-29 19:17:04 +0000534
535/* Set of hash utility functions to help maintaining the invariant that
536 iff a==b then hash(a)==hash(b)
537
538 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
539*/
540
541long
542_Py_HashDouble(v)
543 double v;
544{
545 /* Use frexp to get at the bits in the double.
546 * Since the VAX D double format has 56 mantissa bits, which is the
547 * most of any double format in use, each of these parts may have as
548 * many as (but no more than) 56 significant bits.
549 * So, assuming sizeof(long) >= 4, each part can be broken into two longs;
550 * frexp and multiplication are used to do that.
551 * Also, since the Cray double format has 15 exponent bits, which is the
552 * most of any double format in use, shifting the exponent field left by
553 * 15 won't overflow a long (again assuming sizeof(long) >= 4).
554 */
555 int expo;
556 long hipart;
557
558 v = frexp(v, &expo);
559 v = v * 2147483648.0; /* 2**31 */
560 hipart = (long)v; /* Take the top 32 bits */
561 v = (v - (double)hipart) * 2147483648.0; /* Get the next 32 bits */
562
563 return hipart + (long)v + (expo << 15); /* Combine everything */
564}
565
566long
567_Py_HashPointer(p)
568 void *p;
569{
570#if SIZEOF_LONG >= SIZEOF_VOID_P
571 return (long)p;
572#else
573 /* convert to a Python long and hash that */
574 PyObject* longobj;
575 long x;
576
577 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
578 x = -1;
579 goto finally;
580 }
581 x = PyObject_Hash(longobj);
582
583finally:
584 Py_XDECREF(longobj);
585 return x;
586#endif
587}
588
589
Guido van Rossum9bfef441993-03-29 10:43:31 +0000590long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591PyObject_Hash(v)
592 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000593{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000595 if (tp->tp_hash != NULL)
596 return (*tp->tp_hash)(v);
Fred Drake13634cf2000-06-29 19:17:04 +0000597 if (tp->tp_compare == NULL) {
598 return _Py_HashPointer(v); /* Use address as hash value */
599 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000600 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000602 return -1;
603}
604
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605PyObject *
606PyObject_GetAttrString(v, name)
607 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000608 char *name;
609{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000610 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000612 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000613 if (w == NULL)
614 return NULL;
615 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000617 return res;
618 }
619
Guido van Rossum3f5da241990-12-20 15:06:42 +0000620 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000621 PyErr_Format(PyExc_AttributeError,
622 "'%.50s' object has no attribute '%.400s'",
623 v->ob_type->tp_name,
624 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000625 return NULL;
626 }
627 else {
628 return (*v->ob_type->tp_getattr)(v, name);
629 }
630}
631
632int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633PyObject_HasAttrString(v, name)
634 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000635 char *name;
636{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000638 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000640 return 1;
641 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000643 return 0;
644}
645
646int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647PyObject_SetAttrString(v, name, w)
648 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000649 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000652 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000654 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000655 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000656 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000657 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000658 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000660 return res;
661 }
662
Guido van Rossum3f5da241990-12-20 15:06:42 +0000663 if (v->ob_type->tp_setattr == NULL) {
664 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000666 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000667 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000669 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000670 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000671 }
672 else {
673 return (*v->ob_type->tp_setattr)(v, name, w);
674 }
675}
676
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000677PyObject *
678PyObject_GetAttr(v, name)
679 PyObject *v;
680 PyObject *name;
681{
682 if (v->ob_type->tp_getattro != NULL)
683 return (*v->ob_type->tp_getattro)(v, name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000684
685 if (!PyString_Check(name)) {
686 PyErr_SetString(PyExc_TypeError,
687 "attribute name must be string");
688 return NULL;
689 }
690 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000691}
692
693int
694PyObject_HasAttr(v, name)
695 PyObject *v;
696 PyObject *name;
697{
698 PyObject *res = PyObject_GetAttr(v, name);
699 if (res != NULL) {
700 Py_DECREF(res);
701 return 1;
702 }
703 PyErr_Clear();
704 return 0;
705}
706
707int
708PyObject_SetAttr(v, name, value)
709 PyObject *v;
710 PyObject *name;
711 PyObject *value;
712{
713 int err;
714 Py_INCREF(name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000715 if (PyString_Check(name))
716 PyString_InternInPlace(&name);
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000717 if (v->ob_type->tp_setattro != NULL)
718 err = (*v->ob_type->tp_setattro)(v, name, value);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000719 else if (PyString_Check(name)) {
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000720 err = PyObject_SetAttrString(
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000721 v, PyString_AS_STRING(name), value);
722 }
723 else {
724 PyErr_SetString(PyExc_TypeError,
725 "attribute name must be string");
726 err = -1;
727 }
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000728 Py_DECREF(name);
729 return err;
730}
731
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000732/* Test a value used as condition, e.g., in a for or if statement.
733 Return -1 if an error occurred */
734
735int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736PyObject_IsTrue(v)
737 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000738{
739 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000741 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000742 else if (v->ob_type->tp_as_number != NULL &&
743 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000744 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000745 else if (v->ob_type->tp_as_mapping != NULL &&
746 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000747 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000748 else if (v->ob_type->tp_as_sequence != NULL &&
749 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000750 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
751 else
752 res = 1;
753 if (res > 0)
754 res = 1;
755 return res;
756}
757
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000758/* equivalent of 'not v'
759 Return -1 if an error occurred */
760
761int
762PyObject_Not(v)
763 PyObject *v;
764{
765 int res;
766 res = PyObject_IsTrue(v);
767 if (res < 0)
768 return res;
769 return res == 0;
770}
771
Guido van Rossum5524a591995-01-10 15:26:20 +0000772/* Coerce two numeric types to the "larger" one.
773 Increment the reference count on each argument.
774 Return -1 and raise an exception if no coercion is possible
775 (and then no reference count is incremented).
776*/
777
778int
Guido van Rossum242c6421997-11-19 16:03:17 +0000779PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 register PyObject *v = *pv;
783 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000784 int res;
785
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
787 Py_INCREF(v);
788 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000789 return 0;
790 }
791 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
792 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
793 if (res <= 0)
794 return res;
795 }
796 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
797 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
798 if (res <= 0)
799 return res;
800 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000801 return 1;
802}
803
804int
805PyNumber_Coerce(pv, pw)
806 PyObject **pv, **pw;
807{
808 int err = PyNumber_CoerceEx(pv, pw);
809 if (err <= 0)
810 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000812 return -1;
813}
814
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000815
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000816/* Test whether an object can be called */
817
818int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819PyCallable_Check(x)
820 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000821{
822 if (x == NULL)
823 return 0;
824 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 PyFunction_Check(x) ||
826 PyMethod_Check(x) ||
827 PyCFunction_Check(x) ||
828 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000829 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 if (PyInstance_Check(x)) {
831 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000832 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000834 return 0;
835 }
836 /* Could test recursively but don't, for fear of endless
837 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000839 return 1;
840 }
841 return 0;
842}
843
844
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845/*
846NoObject is usable as a non-NULL undefined value, used by the macro None.
847There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849*/
850
Guido van Rossum0c182a11992-03-27 17:26:13 +0000851/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000853none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000857}
858
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859static PyTypeObject PyNothing_Type = {
860 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000861 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000863 0,
864 0,
865 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000866 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 0, /*tp_getattr*/
868 0, /*tp_setattr*/
869 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000870 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 0, /*tp_as_number*/
872 0, /*tp_as_sequence*/
873 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000874 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000875};
876
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877PyObject _Py_NoneStruct = {
878 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000879};
880
881
Guido van Rossum84a90321996-05-22 16:34:47 +0000882#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000883
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000885
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000886void
Guido van Rossume09fb551997-08-05 02:04:34 +0000887_Py_ResetReferences()
888{
889 refchain._ob_prev = refchain._ob_next = &refchain;
890 _Py_RefTotal = 0;
891}
892
893void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894_Py_NewReference(op)
895 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000896{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000898 op->ob_refcnt = 1;
899 op->_ob_next = refchain._ob_next;
900 op->_ob_prev = &refchain;
901 refchain._ob_next->_ob_prev = op;
902 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000903#ifdef COUNT_ALLOCS
904 inc_count(op->ob_type);
905#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000906}
907
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000908void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909_Py_ForgetReference(op)
910 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000911{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000912#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000913 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000914#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000915 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000917 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000918 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000920#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000921 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
922 if (p == op)
923 break;
924 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000925 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000927#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000928 op->_ob_next->_ob_prev = op->_ob_prev;
929 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000930 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000931#ifdef COUNT_ALLOCS
932 op->ob_type->tp_free++;
933#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934}
935
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000936void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937_Py_Dealloc(op)
938 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000939{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000940 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 _Py_ForgetReference(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000942#ifndef WITH_CYCLE_GC
Guido van Rossume92e6102000-04-24 15:40:53 +0000943 if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL-1)
944 op->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000945#endif
Guido van Rossum9776adf1994-09-07 14:36:45 +0000946 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000947}
948
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000949void
Guido van Rossumded690f1996-05-24 20:48:31 +0000950_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000951 FILE *fp;
952{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000954 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000955 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
956 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 if (PyObject_Print(op, fp, 0) != 0)
958 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000959 putc('\n', fp);
960 }
961}
962
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000963PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000964_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000965 PyObject *self;
966 PyObject *args;
967{
968 int i, n;
969 PyObject *t = NULL;
970 PyObject *res, *op;
971
972 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
973 return NULL;
974 op = refchain._ob_next;
975 res = PyList_New(0);
976 if (res == NULL)
977 return NULL;
978 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
979 while (op == self || op == args || op == res || op == t ||
980 t != NULL && op->ob_type != (PyTypeObject *) t) {
981 op = op->_ob_next;
982 if (op == &refchain)
983 return res;
984 }
985 if (PyList_Append(res, op) < 0) {
986 Py_DECREF(res);
987 return NULL;
988 }
989 op = op->_ob_next;
990 }
991 return res;
992}
993
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000994#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000995
996
997/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000998PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000999
1000
1001/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +00001003
1004
Guido van Rossumb18618d2000-05-03 23:44:39 +00001005/* Python's malloc wrappers (see mymalloc.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +00001006
1007ANY *
1008PyMem_Malloc(nbytes)
1009 size_t nbytes;
1010{
1011#if _PyMem_EXTRA > 0
1012 if (nbytes == 0)
1013 nbytes = _PyMem_EXTRA;
1014#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001015 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001016}
1017
1018ANY *
1019PyMem_Realloc(p, nbytes)
1020 ANY *p;
1021 size_t nbytes;
1022{
1023#if _PyMem_EXTRA > 0
1024 if (nbytes == 0)
1025 nbytes = _PyMem_EXTRA;
1026#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001027 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001028}
1029
1030void
1031PyMem_Free(p)
1032 ANY *p;
1033{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001034 PyMem_FREE(p);
1035}
1036
1037
1038/* Python's object malloc wrappers (see objimpl.h) */
1039
1040ANY *
1041PyObject_Malloc(nbytes)
1042 size_t nbytes;
1043{
1044 return PyObject_MALLOC(nbytes);
1045}
1046
1047ANY *
1048PyObject_Realloc(p, nbytes)
1049 ANY *p;
1050 size_t nbytes;
1051{
1052 return PyObject_REALLOC(p, nbytes);
1053}
1054
1055void
1056PyObject_Free(p)
1057 ANY *p;
1058{
1059 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001060}
Guido van Rossum86610361998-04-10 22:32:46 +00001061
1062
1063/* These methods are used to control infinite recursion in repr, str, print,
1064 etc. Container objects that may recursively contain themselves,
1065 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1066 Py_ReprLeave() to avoid infinite recursion.
1067
1068 Py_ReprEnter() returns 0 the first time it is called for a particular
1069 object and 1 every time thereafter. It returns -1 if an exception
1070 occurred. Py_ReprLeave() has no return value.
1071
1072 See dictobject.c and listobject.c for examples of use.
1073*/
1074
1075#define KEY "Py_Repr"
1076
1077int
1078Py_ReprEnter(obj)
1079 PyObject *obj;
1080{
1081 PyObject *dict;
1082 PyObject *list;
1083 int i;
1084
1085 dict = PyThreadState_GetDict();
1086 if (dict == NULL)
1087 return -1;
1088 list = PyDict_GetItemString(dict, KEY);
1089 if (list == NULL) {
1090 list = PyList_New(0);
1091 if (list == NULL)
1092 return -1;
1093 if (PyDict_SetItemString(dict, KEY, list) < 0)
1094 return -1;
1095 Py_DECREF(list);
1096 }
1097 i = PyList_GET_SIZE(list);
1098 while (--i >= 0) {
1099 if (PyList_GET_ITEM(list, i) == obj)
1100 return 1;
1101 }
1102 PyList_Append(list, obj);
1103 return 0;
1104}
1105
1106void
1107Py_ReprLeave(obj)
1108 PyObject *obj;
1109{
1110 PyObject *dict;
1111 PyObject *list;
1112 int i;
1113
1114 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001115 if (dict == NULL)
1116 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001117 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001118 if (list == NULL || !PyList_Check(list))
1119 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001120 i = PyList_GET_SIZE(list);
1121 /* Count backwards because we always expect obj to be list[-1] */
1122 while (--i >= 0) {
1123 if (PyList_GET_ITEM(list, i) == obj) {
1124 PyList_SetSlice(list, i, i + 1, NULL);
1125 break;
1126 }
1127 }
1128}
Guido van Rossumd724b232000-03-13 16:01:29 +00001129
1130/*
1131 trashcan
1132 CT 2k0130
1133 non-recursively destroy nested objects
1134
1135 CT 2k0223
1136 everything is now done in a macro.
1137
1138 CT 2k0305
1139 modified to use functions, after Tim Peter's suggestion.
1140
1141 CT 2k0309
1142 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001143
1144 CT 2k0325
1145 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001146
1147 CT 2k0422
1148 complete rewrite. We now build a chain via ob_type
1149 and save the limited number of types in ob_refcnt.
1150 This is perfect since we don't need any memory.
1151 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001152*/
1153
Guido van Rossume92e6102000-04-24 15:40:53 +00001154#define Py_TRASHCAN_TUPLE 1
1155#define Py_TRASHCAN_LIST 2
1156#define Py_TRASHCAN_DICT 3
1157#define Py_TRASHCAN_FRAME 4
1158#define Py_TRASHCAN_TRACEBACK 5
1159/* extend here if other objects want protection */
1160
Guido van Rossumd724b232000-03-13 16:01:29 +00001161int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001162
Guido van Rossumd724b232000-03-13 16:01:29 +00001163PyObject * _PyTrash_delete_later = NULL;
1164
1165void
1166_PyTrash_deposit_object(op)
1167 PyObject *op;
1168{
Guido van Rossume92e6102000-04-24 15:40:53 +00001169 int typecode;
1170 PyObject *hold = _PyTrash_delete_later;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001171
Guido van Rossume92e6102000-04-24 15:40:53 +00001172 if (PyTuple_Check(op))
1173 typecode = Py_TRASHCAN_TUPLE;
1174 else if (PyList_Check(op))
1175 typecode = Py_TRASHCAN_LIST;
1176 else if (PyDict_Check(op))
1177 typecode = Py_TRASHCAN_DICT;
1178 else if (PyFrame_Check(op))
1179 typecode = Py_TRASHCAN_FRAME;
1180 else if (PyTraceBack_Check(op))
1181 typecode = Py_TRASHCAN_TRACEBACK;
1182 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001183
Guido van Rossume92e6102000-04-24 15:40:53 +00001184 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1185 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001186}
1187
1188void
Guido van Rossume92e6102000-04-24 15:40:53 +00001189_PyTrash_destroy_chain()
Guido van Rossumd724b232000-03-13 16:01:29 +00001190{
1191 while (_PyTrash_delete_later) {
1192 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001193 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1194
1195 switch (shredder->ob_refcnt) {
1196 case Py_TRASHCAN_TUPLE:
1197 shredder->ob_type = &PyTuple_Type;
1198 break;
1199 case Py_TRASHCAN_LIST:
1200 shredder->ob_type = &PyList_Type;
1201 break;
1202 case Py_TRASHCAN_DICT:
1203 shredder->ob_type = &PyDict_Type;
1204 break;
1205 case Py_TRASHCAN_FRAME:
1206 shredder->ob_type = &PyFrame_Type;
1207 break;
1208 case Py_TRASHCAN_TRACEBACK:
1209 shredder->ob_type = &PyTraceBack_Type;
1210 break;
1211 }
1212 _Py_NewReference(shredder);
1213
Guido van Rossumd724b232000-03-13 16:01:29 +00001214 ++_PyTrash_delete_nesting;
1215 Py_DECREF(shredder);
1216 --_PyTrash_delete_nesting;
1217 }
1218}
Guido van Rossume92e6102000-04-24 15:40:53 +00001219