blob: 3052d38174c162a7dabe945b26e704567086848f [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;
268 if (!PyString_Check(res)) {
269 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000270 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271 res->ob_type->tp_name);
272 Py_DECREF(res);
273 return NULL;
274 }
275 return res;
276 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277}
278
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279PyObject *
280PyObject_Str(v)
281 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000282{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283 PyObject *res;
284
Guido van Rossumc6004111993-11-05 10:22:19 +0000285 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 return PyString_FromString("<NULL>");
287 else if (PyString_Check(v)) {
288 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000289 return v;
290 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000291 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000293 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 if (!PyInstance_Check(v) ||
296 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
297 PyErr_Clear();
298 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000299 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 res = PyEval_CallObject(func, (PyObject *)NULL);
301 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000302 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000303 if (res == NULL)
304 return NULL;
305 if (!PyString_Check(res)) {
306 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000307 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000308 res->ob_type->tp_name);
309 Py_DECREF(res);
310 return NULL;
311 }
312 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000316do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000318{
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000319 long c;
Guido van Rossum20566841995-01-12 11:26:10 +0000320 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
321 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 This is intentional -- it makes no sense to define cmp(x,y)
323 different than -cmp(y,x). */
324 if (PyInstance_Check(v) || PyInstance_Check(w))
325 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000326 c = PyObject_Compare(v, w);
327 if (c && PyErr_Occurred())
328 return NULL;
329 return PyInt_FromLong(c);
Guido van Rossum20566841995-01-12 11:26:10 +0000330}
331
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000332PyObject *_PyCompareState_Key;
333
334/* _PyCompareState_nesting is incremented beforing call compare (for
335 some types) and decremented on exit. If the count exceeds the
336 nesting limit, enable code to detect circular data structures.
337*/
338#define NESTING_LIMIT 500
339int _PyCompareState_nesting = 0;
340
341static PyObject*
342get_inprogress_dict()
343{
344 PyObject *tstate_dict, *inprogress;
345
346 tstate_dict = PyThreadState_GetDict();
347 if (tstate_dict == NULL) {
348 PyErr_BadInternalCall();
349 return NULL;
350 }
351 inprogress = PyDict_GetItem(tstate_dict, _PyCompareState_Key);
352 if (inprogress == NULL) {
353 PyErr_Clear();
354 inprogress = PyDict_New();
355 if (inprogress == NULL)
356 return NULL;
357 if (PyDict_SetItem(tstate_dict, _PyCompareState_Key,
358 inprogress) == -1) {
359 Py_DECREF(inprogress);
360 return NULL;
361 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000362 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000363 }
364 return inprogress;
365}
366
367static PyObject *
368make_pair(v, w)
369 PyObject *v, *w;
370{
371 PyObject *pair;
372
373 pair = PyTuple_New(2);
374 if (pair == NULL) {
375 return NULL;
376 }
Guido van Rossumad89bbc2000-06-28 21:57:18 +0000377 if (v <= w) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000378 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)v));
379 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)w));
380 } else {
381 PyTuple_SET_ITEM(pair, 0, PyLong_FromVoidPtr((void *)w));
382 PyTuple_SET_ITEM(pair, 1, PyLong_FromVoidPtr((void *)v));
383 }
384 return pair;
385}
386
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388PyObject_Compare(v, w)
389 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390{
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000391 PyTypeObject *vtp, *wtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000392 int result;
393
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000394 if (v == NULL || w == NULL) {
395 PyErr_BadInternalCall();
396 return -1;
397 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 if (v == w)
399 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 if (PyInstance_Check(v) || PyInstance_Check(w)) {
401 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000402 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 if (!PyInstance_Check(v))
404 return -PyObject_Compare(w, v);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000405 if (++_PyCompareState_nesting > NESTING_LIMIT) {
406 PyObject *inprogress, *pair;
407
408 inprogress = get_inprogress_dict();
409 if (inprogress == NULL) {
410 return -1;
411 }
412 pair = make_pair(v, w);
413 if (PyDict_GetItem(inprogress, pair)) {
414 /* already comparing these objects. assume
415 they're equal until shown otherwise */
416 Py_DECREF(pair);
417 --_PyCompareState_nesting;
418 return 0;
419 }
420 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
421 return -1;
422 }
423 res = do_cmp(v, w);
424 _PyCompareState_nesting--;
425 /* XXX DelItem shouldn't fail */
426 PyDict_DelItem(inprogress, pair);
427 Py_DECREF(pair);
428 } else {
429 res = do_cmp(v, w);
430 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000431 if (res == NULL)
432 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 if (!PyInt_Check(res)) {
434 Py_DECREF(res);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000435 PyErr_SetString(PyExc_TypeError,
436 "comparison did not return an int");
437 return -1;
Guido van Rossum20566841995-01-12 11:26:10 +0000438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 c = PyInt_AsLong(res);
440 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000441 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
442 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000443 if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
444 char *vname = vtp->tp_name;
445 char *wname = wtp->tp_name;
Guido van Rossumb4db1941998-07-21 21:56:41 +0000446 if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
Guido van Rossum242c6421997-11-19 16:03:17 +0000447 int err;
448 err = PyNumber_CoerceEx(&v, &w);
449 if (err < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000450 return -1;
Guido van Rossum242c6421997-11-19 16:03:17 +0000451 else if (err == 0) {
Guido van Rossumb4db1941998-07-21 21:56:41 +0000452 int cmp;
453 vtp = v->ob_type;
454 if (vtp->tp_compare == NULL)
455 cmp = (v < w) ? -1 : 1;
456 else
457 cmp = (*vtp->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 Py_DECREF(v);
459 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000460 return cmp;
461 }
462 }
Guido van Rossumb244f692000-04-10 13:42:33 +0000463 else if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
464 int result = PyUnicode_Compare(v, w);
465 if (result == -1 && PyErr_Occurred() &&
466 PyErr_ExceptionMatches(PyExc_TypeError))
467 /* TypeErrors are ignored: if Unicode coercion
468 fails due to one of the arguments not
469 having the right type, we continue as
470 defined by the coercion protocol (see
471 above). Luckily, decoding errors are
472 reported as ValueErrors and are not masked
473 by this technique. */
474 PyErr_Clear();
475 else
476 return result;
477 }
Guido van Rossumcd5a5f61998-06-09 18:58:44 +0000478 else if (vtp->tp_as_number != NULL)
479 vname = "";
480 else if (wtp->tp_as_number != NULL)
481 wname = "";
482 /* Numerical types compare smaller than all other types */
483 return strcmp(vname, wname);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000484 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000485 if (vtp->tp_compare == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 return (v < w) ? -1 : 1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000487 }
488 if (++_PyCompareState_nesting > NESTING_LIMIT
489 && (vtp->tp_as_mapping
490 || (vtp->tp_as_sequence && !PyString_Check(v)))) {
491 PyObject *inprogress, *pair;
492
493 inprogress = get_inprogress_dict();
494 if (inprogress == NULL) {
495 return -1;
496 }
497 pair = make_pair(v, w);
498 if (PyDict_GetItem(inprogress, pair)) {
499 /* already comparing these objects. assume
500 they're equal until shown otherwise */
501 _PyCompareState_nesting--;
502 Py_DECREF(pair);
503 return 0;
504 }
505 if (PyDict_SetItem(inprogress, pair, pair) == -1) {
506 return -1;
507 }
508 result = (*vtp->tp_compare)(v, w);
509 _PyCompareState_nesting--;
510 PyDict_DelItem(inprogress, pair); /* XXX shouldn't fail */
511 Py_DECREF(pair);
512 } else {
513 result = (*vtp->tp_compare)(v, w);
514 }
515 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516}
517
Fred Drake13634cf2000-06-29 19:17:04 +0000518
519/* Set of hash utility functions to help maintaining the invariant that
520 iff a==b then hash(a)==hash(b)
521
522 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
523*/
524
525long
526_Py_HashDouble(v)
527 double v;
528{
529 /* Use frexp to get at the bits in the double.
530 * Since the VAX D double format has 56 mantissa bits, which is the
531 * most of any double format in use, each of these parts may have as
532 * many as (but no more than) 56 significant bits.
533 * So, assuming sizeof(long) >= 4, each part can be broken into two longs;
534 * frexp and multiplication are used to do that.
535 * Also, since the Cray double format has 15 exponent bits, which is the
536 * most of any double format in use, shifting the exponent field left by
537 * 15 won't overflow a long (again assuming sizeof(long) >= 4).
538 */
539 int expo;
540 long hipart;
541
542 v = frexp(v, &expo);
543 v = v * 2147483648.0; /* 2**31 */
544 hipart = (long)v; /* Take the top 32 bits */
545 v = (v - (double)hipart) * 2147483648.0; /* Get the next 32 bits */
546
547 return hipart + (long)v + (expo << 15); /* Combine everything */
548}
549
550long
551_Py_HashPointer(p)
552 void *p;
553{
554#if SIZEOF_LONG >= SIZEOF_VOID_P
555 return (long)p;
556#else
557 /* convert to a Python long and hash that */
558 PyObject* longobj;
559 long x;
560
561 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
562 x = -1;
563 goto finally;
564 }
565 x = PyObject_Hash(longobj);
566
567finally:
568 Py_XDECREF(longobj);
569 return x;
570#endif
571}
572
573
Guido van Rossum9bfef441993-03-29 10:43:31 +0000574long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575PyObject_Hash(v)
576 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 *
590PyObject_GetAttrString(v, name)
591 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000592 char *name;
593{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000594 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000596 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000597 if (w == NULL)
598 return NULL;
599 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000601 return res;
602 }
603
Guido van Rossum3f5da241990-12-20 15:06:42 +0000604 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000605 PyErr_Format(PyExc_AttributeError,
606 "'%.50s' object has no attribute '%.400s'",
607 v->ob_type->tp_name,
608 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000609 return NULL;
610 }
611 else {
612 return (*v->ob_type->tp_getattr)(v, name);
613 }
614}
615
616int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617PyObject_HasAttrString(v, name)
618 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000619 char *name;
620{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000622 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000624 return 1;
625 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000627 return 0;
628}
629
630int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631PyObject_SetAttrString(v, name, w)
632 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000633 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000635{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000636 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000638 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000639 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000640 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000641 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000642 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000644 return res;
645 }
646
Guido van Rossum3f5da241990-12-20 15:06:42 +0000647 if (v->ob_type->tp_setattr == NULL) {
648 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000650 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000653 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000654 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655 }
656 else {
657 return (*v->ob_type->tp_setattr)(v, name, w);
658 }
659}
660
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000661PyObject *
662PyObject_GetAttr(v, name)
663 PyObject *v;
664 PyObject *name;
665{
666 if (v->ob_type->tp_getattro != NULL)
667 return (*v->ob_type->tp_getattro)(v, name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000668
669 if (!PyString_Check(name)) {
670 PyErr_SetString(PyExc_TypeError,
671 "attribute name must be string");
672 return NULL;
673 }
674 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000675}
676
677int
678PyObject_HasAttr(v, name)
679 PyObject *v;
680 PyObject *name;
681{
682 PyObject *res = PyObject_GetAttr(v, name);
683 if (res != NULL) {
684 Py_DECREF(res);
685 return 1;
686 }
687 PyErr_Clear();
688 return 0;
689}
690
691int
692PyObject_SetAttr(v, name, value)
693 PyObject *v;
694 PyObject *name;
695 PyObject *value;
696{
697 int err;
698 Py_INCREF(name);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000699 if (PyString_Check(name))
700 PyString_InternInPlace(&name);
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000701 if (v->ob_type->tp_setattro != NULL)
702 err = (*v->ob_type->tp_setattro)(v, name, value);
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000703 else if (PyString_Check(name)) {
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000704 err = PyObject_SetAttrString(
Jeremy Hylton99a8f902000-06-23 14:36:32 +0000705 v, PyString_AS_STRING(name), value);
706 }
707 else {
708 PyErr_SetString(PyExc_TypeError,
709 "attribute name must be string");
710 err = -1;
711 }
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000712 Py_DECREF(name);
713 return err;
714}
715
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000716/* Test a value used as condition, e.g., in a for or if statement.
717 Return -1 if an error occurred */
718
719int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720PyObject_IsTrue(v)
721 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000722{
723 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000725 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000726 else if (v->ob_type->tp_as_number != NULL &&
727 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000728 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000729 else if (v->ob_type->tp_as_mapping != NULL &&
730 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000731 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +0000732 else if (v->ob_type->tp_as_sequence != NULL &&
733 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000734 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
735 else
736 res = 1;
737 if (res > 0)
738 res = 1;
739 return res;
740}
741
Guido van Rossumc3d3f961998-04-09 17:53:59 +0000742/* equivalent of 'not v'
743 Return -1 if an error occurred */
744
745int
746PyObject_Not(v)
747 PyObject *v;
748{
749 int res;
750 res = PyObject_IsTrue(v);
751 if (res < 0)
752 return res;
753 return res == 0;
754}
755
Guido van Rossum5524a591995-01-10 15:26:20 +0000756/* Coerce two numeric types to the "larger" one.
757 Increment the reference count on each argument.
758 Return -1 and raise an exception if no coercion is possible
759 (and then no reference count is incremented).
760*/
761
762int
Guido van Rossum242c6421997-11-19 16:03:17 +0000763PyNumber_CoerceEx(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000765{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 register PyObject *v = *pv;
767 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000768 int res;
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
771 Py_INCREF(v);
772 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000773 return 0;
774 }
775 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
776 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
777 if (res <= 0)
778 return res;
779 }
780 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
781 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
782 if (res <= 0)
783 return res;
784 }
Guido van Rossum242c6421997-11-19 16:03:17 +0000785 return 1;
786}
787
788int
789PyNumber_Coerce(pv, pw)
790 PyObject **pv, **pw;
791{
792 int err = PyNumber_CoerceEx(pv, pw);
793 if (err <= 0)
794 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000796 return -1;
797}
798
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000800/* Test whether an object can be called */
801
802int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803PyCallable_Check(x)
804 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000805{
806 if (x == NULL)
807 return 0;
808 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 PyFunction_Check(x) ||
810 PyMethod_Check(x) ||
811 PyCFunction_Check(x) ||
812 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000813 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 if (PyInstance_Check(x)) {
815 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000816 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000818 return 0;
819 }
820 /* Could test recursively but don't, for fear of endless
821 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000823 return 1;
824 }
825 return 0;
826}
827
828
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000829/*
830NoObject is usable as a non-NULL undefined value, used by the macro None.
831There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000833*/
834
Guido van Rossum0c182a11992-03-27 17:26:13 +0000835/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000841}
842
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843static PyTypeObject PyNothing_Type = {
844 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000847 0,
848 0,
849 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000850 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000851 0, /*tp_getattr*/
852 0, /*tp_setattr*/
853 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000854 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855 0, /*tp_as_number*/
856 0, /*tp_as_sequence*/
857 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000858 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000859};
860
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861PyObject _Py_NoneStruct = {
862 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000863};
864
865
Guido van Rossum84a90321996-05-22 16:34:47 +0000866#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000867
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000869
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000870void
Guido van Rossume09fb551997-08-05 02:04:34 +0000871_Py_ResetReferences()
872{
873 refchain._ob_prev = refchain._ob_next = &refchain;
874 _Py_RefTotal = 0;
875}
876
877void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878_Py_NewReference(op)
879 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000880{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000882 op->ob_refcnt = 1;
883 op->_ob_next = refchain._ob_next;
884 op->_ob_prev = &refchain;
885 refchain._ob_next->_ob_prev = op;
886 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000887#ifdef COUNT_ALLOCS
888 inc_count(op->ob_type);
889#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000890}
891
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000892void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893_Py_ForgetReference(op)
894 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000895{
Guido van Rossumbffd6832000-01-20 22:32:56 +0000896#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +0000897 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000898#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +0000899 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000901 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000902 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000904#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000905 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
906 if (p == op)
907 break;
908 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000909 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000911#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000912 op->_ob_next->_ob_prev = op->_ob_prev;
913 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000914 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000915#ifdef COUNT_ALLOCS
916 op->ob_type->tp_free++;
917#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000918}
919
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000920void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921_Py_Dealloc(op)
922 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000923{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000924 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 _Py_ForgetReference(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000926#ifndef WITH_CYCLE_GC
Guido van Rossume92e6102000-04-24 15:40:53 +0000927 if (_PyTrash_delete_nesting < PyTrash_UNWIND_LEVEL-1)
928 op->ob_type = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000929#endif
Guido van Rossum9776adf1994-09-07 14:36:45 +0000930 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000931}
932
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000933void
Guido van Rossumded690f1996-05-24 20:48:31 +0000934_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000935 FILE *fp;
936{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +0000938 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000939 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
940 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 if (PyObject_Print(op, fp, 0) != 0)
942 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000943 putc('\n', fp);
944 }
945}
946
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000947PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000948_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000949 PyObject *self;
950 PyObject *args;
951{
952 int i, n;
953 PyObject *t = NULL;
954 PyObject *res, *op;
955
956 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
957 return NULL;
958 op = refchain._ob_next;
959 res = PyList_New(0);
960 if (res == NULL)
961 return NULL;
962 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
963 while (op == self || op == args || op == res || op == t ||
964 t != NULL && op->ob_type != (PyTypeObject *) t) {
965 op = op->_ob_next;
966 if (op == &refchain)
967 return res;
968 }
969 if (PyList_Append(res, op) < 0) {
970 Py_DECREF(res);
971 return NULL;
972 }
973 op = op->_ob_next;
974 }
975 return res;
976}
977
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000978#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000979
980
981/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000982PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000983
984
985/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
Guido van Rossume09fb551997-08-05 02:04:34 +0000987
988
Guido van Rossumb18618d2000-05-03 23:44:39 +0000989/* Python's malloc wrappers (see mymalloc.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +0000990
991ANY *
992PyMem_Malloc(nbytes)
993 size_t nbytes;
994{
995#if _PyMem_EXTRA > 0
996 if (nbytes == 0)
997 nbytes = _PyMem_EXTRA;
998#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000999 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001000}
1001
1002ANY *
1003PyMem_Realloc(p, nbytes)
1004 ANY *p;
1005 size_t nbytes;
1006{
1007#if _PyMem_EXTRA > 0
1008 if (nbytes == 0)
1009 nbytes = _PyMem_EXTRA;
1010#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001011 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001012}
1013
1014void
1015PyMem_Free(p)
1016 ANY *p;
1017{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001018 PyMem_FREE(p);
1019}
1020
1021
1022/* Python's object malloc wrappers (see objimpl.h) */
1023
1024ANY *
1025PyObject_Malloc(nbytes)
1026 size_t nbytes;
1027{
1028 return PyObject_MALLOC(nbytes);
1029}
1030
1031ANY *
1032PyObject_Realloc(p, nbytes)
1033 ANY *p;
1034 size_t nbytes;
1035{
1036 return PyObject_REALLOC(p, nbytes);
1037}
1038
1039void
1040PyObject_Free(p)
1041 ANY *p;
1042{
1043 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001044}
Guido van Rossum86610361998-04-10 22:32:46 +00001045
1046
1047/* These methods are used to control infinite recursion in repr, str, print,
1048 etc. Container objects that may recursively contain themselves,
1049 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1050 Py_ReprLeave() to avoid infinite recursion.
1051
1052 Py_ReprEnter() returns 0 the first time it is called for a particular
1053 object and 1 every time thereafter. It returns -1 if an exception
1054 occurred. Py_ReprLeave() has no return value.
1055
1056 See dictobject.c and listobject.c for examples of use.
1057*/
1058
1059#define KEY "Py_Repr"
1060
1061int
1062Py_ReprEnter(obj)
1063 PyObject *obj;
1064{
1065 PyObject *dict;
1066 PyObject *list;
1067 int i;
1068
1069 dict = PyThreadState_GetDict();
1070 if (dict == NULL)
1071 return -1;
1072 list = PyDict_GetItemString(dict, KEY);
1073 if (list == NULL) {
1074 list = PyList_New(0);
1075 if (list == NULL)
1076 return -1;
1077 if (PyDict_SetItemString(dict, KEY, list) < 0)
1078 return -1;
1079 Py_DECREF(list);
1080 }
1081 i = PyList_GET_SIZE(list);
1082 while (--i >= 0) {
1083 if (PyList_GET_ITEM(list, i) == obj)
1084 return 1;
1085 }
1086 PyList_Append(list, obj);
1087 return 0;
1088}
1089
1090void
1091Py_ReprLeave(obj)
1092 PyObject *obj;
1093{
1094 PyObject *dict;
1095 PyObject *list;
1096 int i;
1097
1098 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001099 if (dict == NULL)
1100 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001101 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001102 if (list == NULL || !PyList_Check(list))
1103 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001104 i = PyList_GET_SIZE(list);
1105 /* Count backwards because we always expect obj to be list[-1] */
1106 while (--i >= 0) {
1107 if (PyList_GET_ITEM(list, i) == obj) {
1108 PyList_SetSlice(list, i, i + 1, NULL);
1109 break;
1110 }
1111 }
1112}
Guido van Rossumd724b232000-03-13 16:01:29 +00001113
1114/*
1115 trashcan
1116 CT 2k0130
1117 non-recursively destroy nested objects
1118
1119 CT 2k0223
1120 everything is now done in a macro.
1121
1122 CT 2k0305
1123 modified to use functions, after Tim Peter's suggestion.
1124
1125 CT 2k0309
1126 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001127
1128 CT 2k0325
1129 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001130
1131 CT 2k0422
1132 complete rewrite. We now build a chain via ob_type
1133 and save the limited number of types in ob_refcnt.
1134 This is perfect since we don't need any memory.
1135 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001136*/
1137
Guido van Rossume92e6102000-04-24 15:40:53 +00001138#define Py_TRASHCAN_TUPLE 1
1139#define Py_TRASHCAN_LIST 2
1140#define Py_TRASHCAN_DICT 3
1141#define Py_TRASHCAN_FRAME 4
1142#define Py_TRASHCAN_TRACEBACK 5
1143/* extend here if other objects want protection */
1144
Guido van Rossumd724b232000-03-13 16:01:29 +00001145int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001146
Guido van Rossumd724b232000-03-13 16:01:29 +00001147PyObject * _PyTrash_delete_later = NULL;
1148
1149void
1150_PyTrash_deposit_object(op)
1151 PyObject *op;
1152{
Guido van Rossume92e6102000-04-24 15:40:53 +00001153 int typecode;
1154 PyObject *hold = _PyTrash_delete_later;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001155
Guido van Rossume92e6102000-04-24 15:40:53 +00001156 if (PyTuple_Check(op))
1157 typecode = Py_TRASHCAN_TUPLE;
1158 else if (PyList_Check(op))
1159 typecode = Py_TRASHCAN_LIST;
1160 else if (PyDict_Check(op))
1161 typecode = Py_TRASHCAN_DICT;
1162 else if (PyFrame_Check(op))
1163 typecode = Py_TRASHCAN_FRAME;
1164 else if (PyTraceBack_Check(op))
1165 typecode = Py_TRASHCAN_TRACEBACK;
1166 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001167
Guido van Rossume92e6102000-04-24 15:40:53 +00001168 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1169 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001170}
1171
1172void
Guido van Rossume92e6102000-04-24 15:40:53 +00001173_PyTrash_destroy_chain()
Guido van Rossumd724b232000-03-13 16:01:29 +00001174{
1175 while (_PyTrash_delete_later) {
1176 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001177 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1178
1179 switch (shredder->ob_refcnt) {
1180 case Py_TRASHCAN_TUPLE:
1181 shredder->ob_type = &PyTuple_Type;
1182 break;
1183 case Py_TRASHCAN_LIST:
1184 shredder->ob_type = &PyList_Type;
1185 break;
1186 case Py_TRASHCAN_DICT:
1187 shredder->ob_type = &PyDict_Type;
1188 break;
1189 case Py_TRASHCAN_FRAME:
1190 shredder->ob_type = &PyFrame_Type;
1191 break;
1192 case Py_TRASHCAN_TRACEBACK:
1193 shredder->ob_type = &PyTraceBack_Type;
1194 break;
1195 }
1196 _Py_NewReference(shredder);
1197
Guido van Rossumd724b232000-03-13 16:01:29 +00001198 ++_PyTrash_delete_nesting;
1199 Py_DECREF(shredder);
1200 --_PyTrash_delete_nesting;
1201 }
1202}
Guido van Rossume92e6102000-04-24 15:40:53 +00001203