blob: c1a1303fb0cb06eccbe1929995c26d0cdc42ac43 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Jack Jansen28fc8802000-07-11 21:47:20 +00006#ifdef macintosh
7#include "macglue.h"
8#endif
9
Guido van Rossume92e6102000-04-24 15:40:53 +000010/* just for trashcan: */
11#include "compile.h"
12#include "frameobject.h"
13#include "traceback.h"
14
Guido van Rossum6f9e4331995-03-29 16:57:48 +000015#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumbffd6832000-01-20 22:32:56 +000016DL_IMPORT(long) _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000017#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Guido van Rossum3f5da241990-12-20 15:06:42 +000019/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
20 These are used by the individual routines for object creation.
21 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000023#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000025extern int tuple_zero_allocs, fast_tuple_allocs;
26extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000027extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000028void
Fred Drake100814d2000-07-09 15:48:49 +000029dump_counts(void)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000030{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000032
33 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000034 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
35 tp->tp_name, tp->tp_alloc, tp->tp_free,
36 tp->tp_maxalloc);
37 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
38 fast_tuple_allocs, tuple_zero_allocs);
39 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
40 quick_int_allocs, quick_neg_int_allocs);
41 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
42 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000043}
44
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000045PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000046get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000047{
48 PyTypeObject *tp;
49 PyObject *result;
50 PyObject *v;
51
52 result = PyList_New(0);
53 if (result == NULL)
54 return NULL;
55 for (tp = type_list; tp; tp = tp->tp_next) {
56 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
57 tp->tp_free, tp->tp_maxalloc);
58 if (v == NULL) {
59 Py_DECREF(result);
60 return NULL;
61 }
62 if (PyList_Append(result, v) < 0) {
63 Py_DECREF(v);
64 Py_DECREF(result);
65 return NULL;
66 }
67 Py_DECREF(v);
68 }
69 return result;
70}
71
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000072void
Fred Drake100814d2000-07-09 15:48:49 +000073inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000074{
75 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000076 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000077 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000079 tp->tp_next = type_list;
80 type_list = tp;
81 }
82 tp->tp_alloc++;
83 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
84 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
85}
86#endif
87
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088PyObject *
Fred Drake100814d2000-07-09 15:48:49 +000089PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Guido van Rossumb18618d2000-05-03 23:44:39 +000091 if (op == NULL) {
92 PyErr_SetString(PyExc_SystemError,
93 "NULL object passed to PyObject_Init");
94 return op;
95 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000096#ifdef WITH_CYCLE_GC
97 if (PyType_IS_GC(tp))
98 op = (PyObject *) PyObject_FROM_GC(op);
99#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return op;
104}
105
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000107PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, int size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000108{
109 if (op == NULL) {
110 PyErr_SetString(PyExc_SystemError,
111 "NULL object passed to PyObject_InitVar");
112 return op;
113 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000114#ifdef WITH_CYCLE_GC
115 if (PyType_IS_GC(tp))
116 op = (PyVarObject *) PyObject_FROM_GC(op);
117#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000118 /* Any changes should be reflected in PyObject_INIT_VAR */
119 op->ob_size = size;
120 op->ob_type = tp;
121 _Py_NewReference((PyObject *)op);
122 return op;
123}
124
125PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000126_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127{
128 PyObject *op;
129 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
130 if (op == NULL)
131 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000132#ifdef WITH_CYCLE_GC
133 if (PyType_IS_GC(tp))
134 op = (PyObject *) PyObject_FROM_GC(op);
135#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000136 return PyObject_INIT(op, tp);
137}
138
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000139PyVarObject *
Fred Drake100814d2000-07-09 15:48:49 +0000140_PyObject_NewVar(PyTypeObject *tp, int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000142 PyVarObject *op;
143 op = (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE(tp, size));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000145 return (PyVarObject *)PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000146#ifdef WITH_CYCLE_GC
147 if (PyType_IS_GC(tp))
148 op = (PyVarObject *) PyObject_FROM_GC(op);
149#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000150 return PyObject_INIT_VAR(op, tp, size);
151}
152
153void
Fred Drake100814d2000-07-09 15:48:49 +0000154_PyObject_Del(PyObject *op)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000155{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000156#ifdef WITH_CYCLE_GC
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000157 if (op && PyType_IS_GC(op->ob_type)) {
158 op = (PyObject *) PyObject_AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000159 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000160#endif
161 PyObject_FREE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162}
163
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000164#ifndef WITH_CYCLE_GC
165/* extension modules might need these */
166void _PyGC_Insert(PyObject *op) { }
167void _PyGC_Remove(PyObject *op) { }
168#endif
169
Guido van Rossum90933611991-06-07 16:10:43 +0000170int
Fred Drake100814d2000-07-09 15:48:49 +0000171PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172{
Guido van Rossum278ef591991-07-27 21:40:24 +0000173 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000175 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000176#ifdef USE_STACKCHECK
177 if (PyOS_CheckStack()) {
Fred Drake661ea262000-10-24 19:57:45 +0000178 PyErr_SetString(PyExc_MemoryError, "stack overflow");
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000179 return -1;
180 }
181#endif
Guido van Rossum687ef6e2000-01-12 16:28:58 +0000182 clearerr(fp); /* Clear any previous error condition */
Guido van Rossum90933611991-06-07 16:10:43 +0000183 if (op == NULL) {
184 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185 }
Guido van Rossum90933611991-06-07 16:10:43 +0000186 else {
187 if (op->ob_refcnt <= 0)
Fred Drakea44d3532000-06-30 15:01:00 +0000188 fprintf(fp, "<refcnt %u at %p>",
189 op->ob_refcnt, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000190 else if (op->ob_type->tp_print == NULL) {
191 if (op->ob_type->tp_repr == NULL) {
Fred Drakea44d3532000-06-30 15:01:00 +0000192 fprintf(fp, "<%s object at %p>",
193 op->ob_type->tp_name, op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000194 }
195 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyObject *s;
197 if (flags & Py_PRINT_RAW)
198 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000199 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000201 if (s == NULL)
202 ret = -1;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000203 else {
Guido van Rossum565798d1998-04-21 22:25:01 +0000204 ret = PyObject_Print(s, fp,
205 Py_PRINT_RAW);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000208 }
209 }
Guido van Rossum90933611991-06-07 16:10:43 +0000210 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000211 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000212 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000213 if (ret == 0) {
214 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000216 clearerr(fp);
217 ret = -1;
218 }
219 }
220 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221}
222
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000224PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000227 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000228#ifdef USE_STACKCHECK
229 if (PyOS_CheckStack()) {
Fred Drake661ea262000-10-24 19:57:45 +0000230 PyErr_SetString(PyExc_MemoryError, "stack overflow");
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000231 return NULL;
232 }
233#endif
Guido van Rossum90933611991-06-07 16:10:43 +0000234 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000236 else if (v->ob_type->tp_repr == NULL) {
237 char buf[120];
Fred Drakea44d3532000-06-30 15:01:00 +0000238 sprintf(buf, "<%.80s object at %p>",
239 v->ob_type->tp_name, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 else {
243 PyObject *res;
244 res = (*v->ob_type->tp_repr)(v);
245 if (res == NULL)
246 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000247 if (PyUnicode_Check(res)) {
248 PyObject* str;
Fredrik Lundh2a1e0602000-07-08 17:43:32 +0000249 str = PyUnicode_AsUnicodeEscapeString(res);
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000250 Py_DECREF(res);
251 if (str)
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000252 res = str;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000253 else
254 return NULL;
Fredrik Lundhefecc7d2000-07-01 14:31:09 +0000255 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 if (!PyString_Check(res)) {
257 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000258 "__repr__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259 res->ob_type->tp_name);
260 Py_DECREF(res);
261 return NULL;
262 }
263 return res;
264 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000268PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000269{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 PyObject *res;
271
Guido van Rossumc6004111993-11-05 10:22:19 +0000272 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 return PyString_FromString("<NULL>");
274 else if (PyString_Check(v)) {
275 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000276 return v;
277 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000278 else if (v->ob_type->tp_str != NULL)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 res = (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000280 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 PyObject *func;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 if (!PyInstance_Check(v) ||
283 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
284 PyErr_Clear();
285 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000286 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 res = PyEval_CallObject(func, (PyObject *)NULL);
288 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000289 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 if (res == NULL)
291 return NULL;
Marc-André Lemburg891bc652000-07-03 09:57:53 +0000292 if (PyUnicode_Check(res)) {
293 PyObject* str;
294 str = PyUnicode_AsEncodedString(res, NULL, NULL);
295 Py_DECREF(res);
296 if (str)
297 res = str;
298 else
299 return NULL;
300 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 if (!PyString_Check(res)) {
302 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +0000303 "__str__ returned non-string (type %.200s)",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 res->ob_type->tp_name);
305 Py_DECREF(res);
306 return NULL;
307 }
308 return res;
Guido van Rossumc6004111993-11-05 10:22:19 +0000309}
310
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000311PyObject *
312PyObject_Unicode(PyObject *v)
313{
314 PyObject *res;
315
316 if (v == NULL)
317 res = PyString_FromString("<NULL>");
318 else if (PyUnicode_Check(v)) {
319 Py_INCREF(v);
320 return v;
321 }
322 else if (PyString_Check(v))
323 res = v;
324 else if (v->ob_type->tp_str != NULL)
325 res = (*v->ob_type->tp_str)(v);
326 else {
327 PyObject *func;
328 static PyObject *strstr;
329 if (strstr == NULL) {
330 strstr= PyString_InternFromString("__str__");
331 if (strstr == NULL)
332 return NULL;
333 }
334 if (!PyInstance_Check(v) ||
335 (func = PyObject_GetAttr(v, strstr)) == NULL) {
336 PyErr_Clear();
337 res = PyObject_Repr(v);
338 }
339 else {
340 res = PyEval_CallObject(func, (PyObject *)NULL);
341 Py_DECREF(func);
342 }
343 }
344 if (res == NULL)
345 return NULL;
346 if (!PyUnicode_Check(res)) {
347 PyObject* str;
348 str = PyUnicode_FromObject(res);
349 Py_DECREF(res);
350 if (str)
351 res = str;
352 else
353 return NULL;
354 }
355 return res;
356}
357
358
Guido van Rossume797ec12001-01-17 15:24:28 +0000359/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
360static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000361
Guido van Rossume797ec12001-01-17 15:24:28 +0000362/* Try a genuine rich comparison, returning an object. Return:
363 NULL for exception;
364 NotImplemented if this particular rich comparison is not implemented or
365 undefined;
366 some object not equal to NotImplemented if it is implemented
367 (this latter object may not be a Boolean).
368*/
369static PyObject *
370try_rich_compare(PyObject *v, PyObject *w, int op)
371{
372 richcmpfunc f;
373 PyObject *res;
374
375 if ((f = v->ob_type->tp_richcompare) != NULL) {
376 res = (*f)(v, w, op);
377 if (res != Py_NotImplemented)
378 return res;
379 Py_DECREF(res);
380 }
381 if ((f = w->ob_type->tp_richcompare) != NULL) {
382 return (*f)(w, v, swapped_op[op]);
383 }
384 res = Py_NotImplemented;
385 Py_INCREF(res);
386 return res;
387}
388
389/* Try a genuine rich comparison, returning an int. Return:
390 -1 for exception (including the case where try_rich_compare() returns an
391 object that's not a Boolean);
392 0 if the outcome is false;
393 1 if the outcome is true;
394 2 if this particular rich comparison is not implemented or undefined.
395*/
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000396static int
Guido van Rossume797ec12001-01-17 15:24:28 +0000397try_rich_compare_bool(PyObject *v, PyObject *w, int op)
398{
399 PyObject *res;
400 int ok;
401
402 if (v->ob_type->tp_richcompare == NULL &&
403 w->ob_type->tp_richcompare == NULL)
404 return 2; /* Shortcut, avoid INCREF+DECREF */
405 res = try_rich_compare(v, w, op);
406 if (res == NULL)
407 return -1;
408 if (res == Py_NotImplemented) {
409 Py_DECREF(res);
410 return 2;
411 }
412 ok = PyObject_IsTrue(res);
413 Py_DECREF(res);
414 return ok;
415}
416
417/* Try rich comparisons to determine a 3-way comparison. Return:
418 -2 for an exception;
419 -1 if v < w;
420 0 if v == w;
421 1 if v > w;
422 2 if this particular rich comparison is not implemented or undefined.
423*/
424static int
425try_rich_to_3way_compare(PyObject *v, PyObject *w)
426{
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000427 static struct { int op; int outcome; } tries[3] = {
428 /* Try this operator, and if it is true, use this outcome: */
429 {Py_EQ, 0},
430 {Py_LT, -1},
431 {Py_GT, 1},
432 };
433 int i;
434
Guido van Rossume797ec12001-01-17 15:24:28 +0000435 if (v->ob_type->tp_richcompare == NULL &&
436 w->ob_type->tp_richcompare == NULL)
437 return 2; /* Shortcut */
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000438
439 for (i = 0; i < 3; i++) {
440 switch (try_rich_compare_bool(v, w, tries[i].op)) {
441 case -1:
442 return -1;
443 case 1:
444 return tries[i].outcome;
445 }
Guido van Rossume797ec12001-01-17 15:24:28 +0000446 }
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000447
448 return 2;
Guido van Rossume797ec12001-01-17 15:24:28 +0000449}
450
451/* Try a 3-way comparison, returning an int. Return:
452 -2 for an exception;
453 -1 if v < w;
454 0 if v == w;
455 1 if v > w;
456 2 if this particular 3-way comparison is not implemented or undefined.
457*/
458static int
459try_3way_compare(PyObject *v, PyObject *w)
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000460{
461 int c;
Guido van Rossume797ec12001-01-17 15:24:28 +0000462 cmpfunc f;
463
464 /* Comparisons involving instances are given to instance_compare,
465 which has the same return conventions as this function. */
466
467 if (PyInstance_Check(v))
468 return (*v->ob_type->tp_compare)(v, w);
469 if (PyInstance_Check(w))
470 return (*w->ob_type->tp_compare)(v, w);
471
472 /* If the types are equal, don't bother with coercions etc. */
473 if (v->ob_type == w->ob_type) {
474 if ((f = v->ob_type->tp_compare) == NULL)
475 return 2;
476 c = (*f)(v, w);
477 if (PyErr_Occurred())
478 return -2;
479 return c < 0 ? -1 : c > 0 ? 1 : 0;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000480 }
Guido van Rossume797ec12001-01-17 15:24:28 +0000481
482 /* Try coercion; if it fails, give up */
483 c = PyNumber_CoerceEx(&v, &w);
484 if (c < 0)
485 return -2;
486 if (c > 0)
487 return 2;
488
489 /* Try v's comparison, if defined */
490 if ((f = v->ob_type->tp_compare) != NULL) {
491 c = (*f)(v, w);
492 Py_DECREF(v);
493 Py_DECREF(w);
494 if (PyErr_Occurred())
495 return -2;
496 return c < 0 ? -1 : c > 0 ? 1 : 0;
497 }
498
499 /* Try w's comparison, if defined */
500 if ((f = w->ob_type->tp_compare) != NULL) {
501 c = (*f)(w, v); /* swapped! */
502 Py_DECREF(v);
503 Py_DECREF(w);
504 if (PyErr_Occurred())
505 return -2;
506 return c < 0 ? 1 : c > 0 ? -1 : 0; /* negated! */
507 }
508
509 /* No comparison defined */
510 Py_DECREF(v);
511 Py_DECREF(w);
512 return 2;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000513}
514
Guido van Rossume797ec12001-01-17 15:24:28 +0000515/* Final fallback 3-way comparison, returning an int. Return:
516 -2 if an error occurred;
517 -1 if v < w;
518 0 if v == w;
519 1 if v > w.
520*/
521static int
522default_3way_compare(PyObject *v, PyObject *w)
523{
524 int c;
Guido van Rossum8f9143d2001-01-22 15:59:32 +0000525 char *vname, *wname;
Guido van Rossume797ec12001-01-17 15:24:28 +0000526
527 if (v->ob_type == w->ob_type) {
Barry Warsawb0e754d2001-01-20 06:24:55 +0000528 /* When comparing these pointers, they must be cast to
529 * integer types (i.e. Py_uintptr_t, our spelling of C9X's
530 * uintptr_t). ANSI specifies that pointer compares other
531 * than == and != to non-related structures are undefined.
532 */
Barry Warsaw71ff8d52001-01-20 06:08:10 +0000533 Py_uintptr_t vv = (Py_uintptr_t)v;
534 Py_uintptr_t ww = (Py_uintptr_t)w;
Guido van Rossume797ec12001-01-17 15:24:28 +0000535 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
536 }
537
538 /* Special case for Unicode */
539 if (PyUnicode_Check(v) || PyUnicode_Check(w)) {
540 c = PyUnicode_Compare(v, w);
541 if (!PyErr_Occurred())
542 return c;
543 /* TypeErrors are ignored: if Unicode coercion fails due
544 to one of the arguments not having the right type, we
545 continue as defined by the coercion protocol (see
546 above). Luckily, decoding errors are reported as
547 ValueErrors and are not masked by this technique. */
548 if (!PyErr_ExceptionMatches(PyExc_TypeError))
549 return -2;
550 PyErr_Clear();
551 }
552
Guido van Rossum0871e932001-01-22 19:28:09 +0000553 /* None is smaller than anything */
554 if (v == Py_None)
555 return -1;
556 if (w == Py_None)
557 return 1;
558
Guido van Rossume797ec12001-01-17 15:24:28 +0000559 /* different type: compare type names */
Guido van Rossum8f9143d2001-01-22 15:59:32 +0000560 if (v->ob_type->tp_as_number)
561 vname = "";
562 else
563 vname = v->ob_type->tp_name;
564 if (w->ob_type->tp_as_number)
565 wname = "";
566 else
567 wname = w->ob_type->tp_name;
568 c = strcmp(vname, wname);
569 if (c < 0)
570 return -1;
571 if (c > 0)
572 return 1;
573 /* Same type name, or (more likely) incomparable numeric types */
574 return ((Py_uintptr_t)(v->ob_type) < (
575 Py_uintptr_t)(w->ob_type)) ? -1 : 1;
Guido van Rossume797ec12001-01-17 15:24:28 +0000576}
577
578#define CHECK_TYPES(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_CHECKTYPES)
579
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000580static int
Fred Drake100814d2000-07-09 15:48:49 +0000581do_cmp(PyObject *v, PyObject *w)
Guido van Rossum20566841995-01-12 11:26:10 +0000582{
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000583 int c;
584
Guido van Rossume797ec12001-01-17 15:24:28 +0000585 c = try_rich_to_3way_compare(v, w);
586 if (c < 2)
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000587 return c;
Guido van Rossume797ec12001-01-17 15:24:28 +0000588 c = try_3way_compare(v, w);
589 if (c < 2)
590 return c;
591 return default_3way_compare(v, w);
Guido van Rossum20566841995-01-12 11:26:10 +0000592}
593
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000594/* compare_nesting is incremented before calling compare (for
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000595 some types) and decremented on exit. If the count exceeds the
596 nesting limit, enable code to detect circular data structures.
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000597
598 This is a tunable parameter that should only affect the performance
599 of comparisons, nothing else. Setting it high makes comparing deeply
600 nested non-cyclical data structures faster, but makes comparing cyclical
601 data structures slower.
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000602*/
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000603#define NESTING_LIMIT 20
604
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000605static int compare_nesting = 0;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000606
607static PyObject*
Fred Drake100814d2000-07-09 15:48:49 +0000608get_inprogress_dict(void)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000609{
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000610 static PyObject *key;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000611 PyObject *tstate_dict, *inprogress;
612
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000613 if (key == NULL) {
614 key = PyString_InternFromString("cmp_state");
615 if (key == NULL)
616 return NULL;
617 }
618
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000619 tstate_dict = PyThreadState_GetDict();
620 if (tstate_dict == NULL) {
621 PyErr_BadInternalCall();
622 return NULL;
623 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000624
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000625 inprogress = PyDict_GetItem(tstate_dict, key);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000626 if (inprogress == NULL) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000627 inprogress = PyDict_New();
628 if (inprogress == NULL)
629 return NULL;
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000630 if (PyDict_SetItem(tstate_dict, key, inprogress) == -1) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000631 Py_DECREF(inprogress);
632 return NULL;
633 }
Jeremy Hyltona251ea02000-06-09 16:20:39 +0000634 Py_DECREF(inprogress);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000635 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000636
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000637 return inprogress;
638}
639
640static PyObject *
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000641check_recursion(PyObject *v, PyObject *w, int op)
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000642{
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000643 PyObject *inprogress;
644 PyObject *token;
Barry Warsaw9d23a4e2000-08-18 05:01:19 +0000645 Py_uintptr_t iv = (Py_uintptr_t)v;
646 Py_uintptr_t iw = (Py_uintptr_t)w;
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000647 PyObject *x, *y, *z;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000648
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000649 inprogress = get_inprogress_dict();
650 if (inprogress == NULL)
651 return NULL;
652
653 token = PyTuple_New(3);
654 if (token == NULL)
655 return NULL;
656
657 if (iv <= iw) {
658 PyTuple_SET_ITEM(token, 0, x = PyLong_FromVoidPtr((void *)v));
659 PyTuple_SET_ITEM(token, 1, y = PyLong_FromVoidPtr((void *)w));
660 if (op >= 0)
661 op = swapped_op[op];
662 } else {
663 PyTuple_SET_ITEM(token, 0, x = PyLong_FromVoidPtr((void *)w));
664 PyTuple_SET_ITEM(token, 1, y = PyLong_FromVoidPtr((void *)v));
665 }
666 PyTuple_SET_ITEM(token, 2, z = PyInt_FromLong((long)op));
667 if (x == NULL || y == NULL || z == NULL) {
668 Py_DECREF(token);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000669 return NULL;
670 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000671
672 if (PyDict_GetItem(inprogress, token) != NULL) {
673 Py_DECREF(token);
674 return Py_None; /* Without INCREF! */
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000675 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000676
677 if (PyDict_SetItem(inprogress, token, token) < 0) {
678 Py_DECREF(token);
679 return NULL;
680 }
681
682 return token;
683}
684
685static void
686delete_token(PyObject *token)
687{
688 PyObject *inprogress;
689
690 if (token == NULL || token == Py_None)
691 return;
692 inprogress = get_inprogress_dict();
693 if (inprogress == NULL)
694 PyErr_Clear();
695 else
696 PyDict_DelItem(inprogress, token);
697 Py_DECREF(token);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000698}
699
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700int
Fred Drake100814d2000-07-09 15:48:49 +0000701PyObject_Compare(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000703 PyTypeObject *vtp;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000704 int result;
705
Jack Jansend49cbe12000-08-22 21:52:51 +0000706#if defined(USE_STACKCHECK)
Guido van Rossum9c0a99e2000-08-30 15:53:50 +0000707 if (PyOS_CheckStack()) {
Jack Jansend49cbe12000-08-22 21:52:51 +0000708 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
709 return -1;
710 }
711#endif
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000712 if (v == NULL || w == NULL) {
713 PyErr_BadInternalCall();
714 return -1;
715 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000716 if (v == w)
717 return 0;
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000718 vtp = v->ob_type;
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000719 compare_nesting++;
720 if (compare_nesting > NESTING_LIMIT &&
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000721 (vtp->tp_as_mapping
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000722 || (vtp->tp_as_sequence
723 && !PyString_Check(v)
724 && !PyTuple_Check(v)))) {
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000725 /* try to detect circular data structures */
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000726 PyObject *token = check_recursion(v, w, -1);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000727
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000728 if (token == NULL) {
729 result = -1;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000730 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000731 else if (token == Py_None) {
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000732 /* already comparing these objects. assume
733 they're equal until shown otherwise */
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000734 result = 0;
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000735 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000736 else {
737 result = do_cmp(v, w);
738 delete_token(token);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000739 }
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000740 }
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000741 else {
742 result = do_cmp(v, w);
743 }
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000744 compare_nesting--;
Guido van Rossume797ec12001-01-17 15:24:28 +0000745 return result < 0 ? -1 : result;
746}
747
748static PyObject *
749try_3way_to_rich_compare(PyObject *v, PyObject *w, int op)
750{
751 int c;
752 PyObject *result;
753
754 c = try_3way_compare(v, w);
755 if (c <= -2)
756 return NULL;
757 if (c >= 2)
758 c = default_3way_compare(v, w);
759 switch (op) {
760 case Py_LT: c = c < 0; break;
761 case Py_LE: c = c <= 0; break;
762 case Py_EQ: c = c == 0; break;
763 case Py_NE: c = c != 0; break;
764 case Py_GT: c = c > 0; break;
765 case Py_GE: c = c >= 0; break;
766 }
767 result = c ? Py_True : Py_False;
768 Py_INCREF(result);
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000769 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000770}
771
Neil Schemenauerd38855c2001-01-21 16:25:18 +0000772static PyObject *
Guido van Rossume797ec12001-01-17 15:24:28 +0000773do_richcmp(PyObject *v, PyObject *w, int op)
774{
775 PyObject *res;
776
777 res = try_rich_compare(v, w, op);
778 if (res != Py_NotImplemented)
779 return res;
780 Py_DECREF(res);
781
782 return try_3way_to_rich_compare(v, w, op);
783}
784
785PyObject *
786PyObject_RichCompare(PyObject *v, PyObject *w, int op)
787{
788 PyObject *res;
789
790 assert(Py_LT <= op && op <= Py_GE);
791
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000792 compare_nesting++;
793 if (compare_nesting > NESTING_LIMIT &&
794 (v->ob_type->tp_as_mapping
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000795 || (v->ob_type->tp_as_sequence
796 && !PyString_Check(v)
797 && !PyTuple_Check(v)))) {
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000798 /* try to detect circular data structures */
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000799 PyObject *token = check_recursion(v, w, op);
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000800
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000801 if (token == NULL) {
802 res = NULL;
Guido van Rossume797ec12001-01-17 15:24:28 +0000803 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000804 else if (token == Py_None) {
805 /* already comparing these objects with this operator.
806 assume they're equal until shown otherwise */
807 if (op == Py_EQ)
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000808 res = Py_True;
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000809 else if (op == Py_NE)
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000810 res = Py_False;
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000811 else {
812 PyErr_SetString(PyExc_ValueError,
813 "can't order recursive values");
814 res = NULL;
815 }
816 Py_XINCREF(res);
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000817 }
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000818 else {
819 res = do_richcmp(v, w, op);
820 delete_token(token);
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000821 }
Guido van Rossume797ec12001-01-17 15:24:28 +0000822 }
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000823 else {
824 res = do_richcmp(v, w, op);
825 }
Guido van Rossum2ffbf6b2001-01-17 21:27:02 +0000826 compare_nesting--;
Guido van Rossume797ec12001-01-17 15:24:28 +0000827 return res;
828}
829
830int
831PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
832{
833 PyObject *res = PyObject_RichCompare(v, w, op);
834 int ok;
835
836 if (res == NULL)
837 return -1;
838 ok = PyObject_IsTrue(res);
839 Py_DECREF(res);
840 return ok;
841}
Fred Drake13634cf2000-06-29 19:17:04 +0000842
843/* Set of hash utility functions to help maintaining the invariant that
844 iff a==b then hash(a)==hash(b)
845
846 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
847*/
848
849long
Fred Drake100814d2000-07-09 15:48:49 +0000850_Py_HashDouble(double v)
Fred Drake13634cf2000-06-29 19:17:04 +0000851{
Tim Peters39dce292000-08-15 03:34:48 +0000852 double intpart, fractpart;
853 int expo;
854 long hipart;
855 long x; /* the final hash value */
856 /* This is designed so that Python numbers of different types
857 * that compare equal hash to the same value; otherwise comparisons
858 * of mapping keys will turn out weird.
859 */
860
861#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
862{
863 extended e;
864 fractpart = modf(v, &e);
865 intpart = e;
866}
867#else
868 fractpart = modf(v, &intpart);
869#endif
870 if (fractpart == 0.0) {
871 /* This must return the same hash as an equal int or long. */
872 if (intpart > LONG_MAX || -intpart > LONG_MAX) {
873 /* Convert to long and use its hash. */
874 PyObject *plong; /* converted to Python long */
875 if (Py_IS_INFINITY(intpart))
876 /* can't convert to long int -- arbitrary */
877 v = v < 0 ? -271828.0 : 314159.0;
878 plong = PyLong_FromDouble(v);
879 if (plong == NULL)
880 return -1;
881 x = PyObject_Hash(plong);
882 Py_DECREF(plong);
883 return x;
884 }
885 /* Fits in a C long == a Python int, so is its own hash. */
886 x = (long)intpart;
887 if (x == -1)
888 x = -2;
889 return x;
890 }
891 /* The fractional part is non-zero, so we don't have to worry about
892 * making this match the hash of some other type.
893 * Use frexp to get at the bits in the double.
Fred Drake13634cf2000-06-29 19:17:04 +0000894 * Since the VAX D double format has 56 mantissa bits, which is the
895 * most of any double format in use, each of these parts may have as
896 * many as (but no more than) 56 significant bits.
Tim Peters39dce292000-08-15 03:34:48 +0000897 * So, assuming sizeof(long) >= 4, each part can be broken into two
898 * longs; frexp and multiplication are used to do that.
899 * Also, since the Cray double format has 15 exponent bits, which is
900 * the most of any double format in use, shifting the exponent field
901 * left by 15 won't overflow a long (again assuming sizeof(long) >= 4).
Fred Drake13634cf2000-06-29 19:17:04 +0000902 */
Tim Peters39dce292000-08-15 03:34:48 +0000903 v = frexp(v, &expo);
904 v *= 2147483648.0; /* 2**31 */
905 hipart = (long)v; /* take the top 32 bits */
906 v = (v - (double)hipart) * 2147483648.0; /* get the next 32 bits */
907 x = hipart + (long)v + (expo << 15);
908 if (x == -1)
909 x = -2;
910 return x;
Fred Drake13634cf2000-06-29 19:17:04 +0000911}
912
913long
Fred Drake100814d2000-07-09 15:48:49 +0000914_Py_HashPointer(void *p)
Fred Drake13634cf2000-06-29 19:17:04 +0000915{
916#if SIZEOF_LONG >= SIZEOF_VOID_P
917 return (long)p;
918#else
919 /* convert to a Python long and hash that */
920 PyObject* longobj;
921 long x;
922
923 if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
924 x = -1;
925 goto finally;
926 }
927 x = PyObject_Hash(longobj);
928
929finally:
930 Py_XDECREF(longobj);
931 return x;
932#endif
933}
934
935
Guido van Rossum9bfef441993-03-29 10:43:31 +0000936long
Fred Drake100814d2000-07-09 15:48:49 +0000937PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000938{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940 if (tp->tp_hash != NULL)
941 return (*tp->tp_hash)(v);
Guido van Rossum41c32442001-01-18 23:33:37 +0000942 if (tp->tp_compare == NULL && tp->tp_richcompare == NULL) {
Fred Drake13634cf2000-06-29 19:17:04 +0000943 return _Py_HashPointer(v); /* Use address as hash value */
944 }
Guido van Rossum9bfef441993-03-29 10:43:31 +0000945 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000947 return -1;
948}
949
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000951PyObject_GetAttrString(PyObject *v, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000952{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000953 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000955 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000956 if (w == NULL)
957 return NULL;
958 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000960 return res;
961 }
962
Guido van Rossum3f5da241990-12-20 15:06:42 +0000963 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumdb935161998-01-19 22:16:36 +0000964 PyErr_Format(PyExc_AttributeError,
965 "'%.50s' object has no attribute '%.400s'",
966 v->ob_type->tp_name,
967 name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000968 return NULL;
969 }
970 else {
971 return (*v->ob_type->tp_getattr)(v, name);
972 }
973}
974
975int
Fred Drake100814d2000-07-09 15:48:49 +0000976PyObject_HasAttrString(PyObject *v, char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000977{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000979 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000981 return 1;
982 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000984 return 0;
985}
986
987int
Fred Drake100814d2000-07-09 15:48:49 +0000988PyObject_SetAttrString(PyObject *v, char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000989{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000990 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000992 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000993 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000994 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000995 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000996 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000998 return res;
999 }
1000
Guido van Rossum3f5da241990-12-20 15:06:42 +00001001 if (v->ob_type->tp_setattr == NULL) {
1002 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +00001004 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +00001007 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +00001008 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001009 }
1010 else {
1011 return (*v->ob_type->tp_setattr)(v, name, w);
1012 }
1013}
1014
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001015/* Internal API needed by PyObject_GetAttr(): */
1016extern
1017PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
1018 const char *errors);
1019
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001020PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001021PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001022{
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001023 /* The Unicode to string conversion is done here because the
1024 existing tp_getattro slots expect a string object as name
1025 and we wouldn't want to break those. */
1026 if (PyUnicode_Check(name)) {
1027 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
1028 if (name == NULL)
1029 return NULL;
1030 }
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001031
1032 if (!PyString_Check(name)) {
1033 PyErr_SetString(PyExc_TypeError,
1034 "attribute name must be string");
1035 return NULL;
1036 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001037 if (v->ob_type->tp_getattro != NULL)
1038 return (*v->ob_type->tp_getattro)(v, name);
1039 else
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001040 return PyObject_GetAttrString(v, PyString_AS_STRING(name));
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001041}
1042
1043int
Fred Drake100814d2000-07-09 15:48:49 +00001044PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001045{
1046 PyObject *res = PyObject_GetAttr(v, name);
1047 if (res != NULL) {
1048 Py_DECREF(res);
1049 return 1;
1050 }
1051 PyErr_Clear();
1052 return 0;
1053}
1054
1055int
Fred Drake100814d2000-07-09 15:48:49 +00001056PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001057{
1058 int err;
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001059
1060 /* The Unicode to string conversion is done here because the
1061 existing tp_setattro slots expect a string object as name
1062 and we wouldn't want to break those. */
1063 if (PyUnicode_Check(name)) {
1064 name = PyUnicode_AsEncodedString(name, NULL, NULL);
1065 if (name == NULL)
1066 return -1;
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001067 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001068 else
1069 Py_INCREF(name);
1070
1071 if (!PyString_Check(name)){
Jeremy Hylton99a8f902000-06-23 14:36:32 +00001072 PyErr_SetString(PyExc_TypeError,
1073 "attribute name must be string");
1074 err = -1;
1075 }
Marc-André Lemburge44e5072000-09-18 16:20:57 +00001076 else {
1077 PyString_InternInPlace(&name);
1078 if (v->ob_type->tp_setattro != NULL)
1079 err = (*v->ob_type->tp_setattro)(v, name, value);
1080 else
1081 err = PyObject_SetAttrString(v,
1082 PyString_AS_STRING(name), value);
1083 }
1084
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001085 Py_DECREF(name);
1086 return err;
1087}
1088
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001089/* Test a value used as condition, e.g., in a for or if statement.
1090 Return -1 if an error occurred */
1091
1092int
Fred Drake100814d2000-07-09 15:48:49 +00001093PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001094{
1095 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001097 res = 0;
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001098 else if (v->ob_type->tp_as_number != NULL &&
1099 v->ob_type->tp_as_number->nb_nonzero != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001100 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001101 else if (v->ob_type->tp_as_mapping != NULL &&
1102 v->ob_type->tp_as_mapping->mp_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001103 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
Guido van Rossum1c4f4581998-05-22 00:53:24 +00001104 else if (v->ob_type->tp_as_sequence != NULL &&
1105 v->ob_type->tp_as_sequence->sq_length != NULL)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001106 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1107 else
1108 res = 1;
1109 if (res > 0)
1110 res = 1;
1111 return res;
1112}
1113
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001114/* equivalent of 'not v'
1115 Return -1 if an error occurred */
1116
1117int
Fred Drake100814d2000-07-09 15:48:49 +00001118PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001119{
1120 int res;
1121 res = PyObject_IsTrue(v);
1122 if (res < 0)
1123 return res;
1124 return res == 0;
1125}
1126
Guido van Rossum5524a591995-01-10 15:26:20 +00001127/* Coerce two numeric types to the "larger" one.
1128 Increment the reference count on each argument.
Guido van Rossume797ec12001-01-17 15:24:28 +00001129 Return value:
1130 -1 if an error occurred;
1131 0 if the coercion succeeded (and then the reference counts are increased);
1132 1 if no coercion is possible (and no error is raised).
Guido van Rossum5524a591995-01-10 15:26:20 +00001133*/
Guido van Rossum5524a591995-01-10 15:26:20 +00001134int
Fred Drake100814d2000-07-09 15:48:49 +00001135PyNumber_CoerceEx(PyObject **pv, PyObject **pw)
Guido van Rossum5524a591995-01-10 15:26:20 +00001136{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 register PyObject *v = *pv;
1138 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +00001139 int res;
1140
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
1142 Py_INCREF(v);
1143 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +00001144 return 0;
1145 }
1146 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1147 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1148 if (res <= 0)
1149 return res;
1150 }
1151 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1152 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1153 if (res <= 0)
1154 return res;
1155 }
Guido van Rossum242c6421997-11-19 16:03:17 +00001156 return 1;
1157}
1158
Guido van Rossume797ec12001-01-17 15:24:28 +00001159/* Coerce two numeric types to the "larger" one.
1160 Increment the reference count on each argument.
1161 Return -1 and raise an exception if no coercion is possible
1162 (and then no reference count is incremented).
1163*/
Guido van Rossum242c6421997-11-19 16:03:17 +00001164int
Fred Drake100814d2000-07-09 15:48:49 +00001165PyNumber_Coerce(PyObject **pv, PyObject **pw)
Guido van Rossum242c6421997-11-19 16:03:17 +00001166{
1167 int err = PyNumber_CoerceEx(pv, pw);
1168 if (err <= 0)
1169 return err;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001170 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +00001171 return -1;
1172}
1173
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001175/* Test whether an object can be called */
1176
1177int
Fred Drake100814d2000-07-09 15:48:49 +00001178PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001179{
1180 if (x == NULL)
1181 return 0;
1182 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 PyFunction_Check(x) ||
1184 PyMethod_Check(x) ||
1185 PyCFunction_Check(x) ||
1186 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001187 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 if (PyInstance_Check(x)) {
1189 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001190 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001192 return 0;
1193 }
1194 /* Could test recursively but don't, for fear of endless
1195 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001197 return 1;
1198 }
1199 return 0;
1200}
1201
1202
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203/*
1204NoObject is usable as a non-NULL undefined value, used by the macro None.
1205There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001206so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207*/
1208
Guido van Rossum0c182a11992-03-27 17:26:13 +00001209/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001211none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214}
1215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216static PyTypeObject PyNothing_Type = {
1217 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220 0,
1221 0,
1222 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001223 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001224 0, /*tp_getattr*/
1225 0, /*tp_setattr*/
1226 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +00001227 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001228 0, /*tp_as_number*/
1229 0, /*tp_as_sequence*/
1230 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001231 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001232};
1233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234PyObject _Py_NoneStruct = {
1235 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001236};
1237
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001238/* NotImplemented is an object that can be used to signal that an
1239 operation is not implemented for the given type combination. */
1240
1241static PyObject *
1242NotImplemented_repr(PyObject *op)
1243{
1244 return PyString_FromString("NotImplemented");
1245}
1246
1247static PyTypeObject PyNotImplemented_Type = {
1248 PyObject_HEAD_INIT(&PyType_Type)
1249 0,
1250 "NotImplemented",
1251 0,
1252 0,
1253 0, /*tp_dealloc*/ /*never called*/
1254 0, /*tp_print*/
1255 0, /*tp_getattr*/
1256 0, /*tp_setattr*/
1257 0, /*tp_compare*/
1258 (reprfunc)NotImplemented_repr, /*tp_repr*/
1259 0, /*tp_as_number*/
1260 0, /*tp_as_sequence*/
1261 0, /*tp_as_mapping*/
1262 0, /*tp_hash */
1263};
1264
1265PyObject _Py_NotImplementedStruct = {
1266 PyObject_HEAD_INIT(&PyNotImplemented_Type)
1267};
1268
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001269
Guido van Rossum84a90321996-05-22 16:34:47 +00001270#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001271
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001273
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001274void
Fred Drake100814d2000-07-09 15:48:49 +00001275_Py_ResetReferences(void)
Guido van Rossume09fb551997-08-05 02:04:34 +00001276{
1277 refchain._ob_prev = refchain._ob_next = &refchain;
1278 _Py_RefTotal = 0;
1279}
1280
1281void
Fred Drake100814d2000-07-09 15:48:49 +00001282_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001283{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001285 op->ob_refcnt = 1;
1286 op->_ob_next = refchain._ob_next;
1287 op->_ob_prev = &refchain;
1288 refchain._ob_next->_ob_prev = op;
1289 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001290#ifdef COUNT_ALLOCS
1291 inc_count(op->ob_type);
1292#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001293}
1294
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001295void
Fred Drake100814d2000-07-09 15:48:49 +00001296_Py_ForgetReference(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001297{
Guido van Rossumbffd6832000-01-20 22:32:56 +00001298#ifdef SLOW_UNREF_CHECK
Guido van Rossum4c08d552000-03-10 22:55:18 +00001299 register PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001300#endif
Guido van Rossumd7047b31995-01-02 19:07:15 +00001301 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001303 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +00001304 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001306#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +00001307 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
1308 if (p == op)
1309 break;
1310 }
Guido van Rossumd7047b31995-01-02 19:07:15 +00001311 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001313#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001314 op->_ob_next->_ob_prev = op->_ob_prev;
1315 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001316 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +00001317#ifdef COUNT_ALLOCS
1318 op->ob_type->tp_free++;
1319#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320}
1321
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001322void
Fred Drake100814d2000-07-09 15:48:49 +00001323_Py_Dealloc(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001324{
Guido van Rossum9776adf1994-09-07 14:36:45 +00001325 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 _Py_ForgetReference(op);
Guido van Rossum9776adf1994-09-07 14:36:45 +00001327 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001328}
1329
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001330void
Fred Drake100814d2000-07-09 15:48:49 +00001331_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001332{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 PyObject *op;
Guido van Rossume09fb551997-08-05 02:04:34 +00001334 fprintf(fp, "Remaining objects:\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001335 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
1336 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 if (PyObject_Print(op, fp, 0) != 0)
1338 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001339 putc('\n', fp);
1340 }
1341}
1342
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001343PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001344_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001345{
1346 int i, n;
1347 PyObject *t = NULL;
1348 PyObject *res, *op;
1349
1350 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1351 return NULL;
1352 op = refchain._ob_next;
1353 res = PyList_New(0);
1354 if (res == NULL)
1355 return NULL;
1356 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1357 while (op == self || op == args || op == res || op == t ||
1358 t != NULL && op->ob_type != (PyTypeObject *) t) {
1359 op = op->_ob_next;
1360 if (op == &refchain)
1361 return res;
1362 }
1363 if (PyList_Append(res, op) < 0) {
1364 Py_DECREF(res);
1365 return NULL;
1366 }
1367 op = op->_ob_next;
1368 }
1369 return res;
1370}
1371
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001372#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +00001373
1374
1375/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +00001376PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +00001377
1378
1379/* Hack to force loading of abstract.o */
Jeremy Hylton6253f832000-07-12 12:56:19 +00001380int (*_Py_abstract_hack)(PyObject *) = &PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001381
1382
Andrew M. Kuchling1582a3a2000-08-16 12:27:23 +00001383/* Python's malloc wrappers (see pymem.h) */
Guido van Rossume09fb551997-08-05 02:04:34 +00001384
Thomas Wouters334fb892000-07-25 12:56:38 +00001385void *
Fred Drake100814d2000-07-09 15:48:49 +00001386PyMem_Malloc(size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001387{
1388#if _PyMem_EXTRA > 0
1389 if (nbytes == 0)
1390 nbytes = _PyMem_EXTRA;
1391#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001392 return PyMem_MALLOC(nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001393}
1394
Thomas Wouters334fb892000-07-25 12:56:38 +00001395void *
1396PyMem_Realloc(void *p, size_t nbytes)
Guido van Rossume09fb551997-08-05 02:04:34 +00001397{
1398#if _PyMem_EXTRA > 0
1399 if (nbytes == 0)
1400 nbytes = _PyMem_EXTRA;
1401#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +00001402 return PyMem_REALLOC(p, nbytes);
Guido van Rossume09fb551997-08-05 02:04:34 +00001403}
1404
1405void
Thomas Wouters334fb892000-07-25 12:56:38 +00001406PyMem_Free(void *p)
Guido van Rossume09fb551997-08-05 02:04:34 +00001407{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001408 PyMem_FREE(p);
1409}
1410
1411
1412/* Python's object malloc wrappers (see objimpl.h) */
1413
Thomas Wouters334fb892000-07-25 12:56:38 +00001414void *
Fred Drake100814d2000-07-09 15:48:49 +00001415PyObject_Malloc(size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001416{
1417 return PyObject_MALLOC(nbytes);
1418}
1419
Thomas Wouters334fb892000-07-25 12:56:38 +00001420void *
1421PyObject_Realloc(void *p, size_t nbytes)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001422{
1423 return PyObject_REALLOC(p, nbytes);
1424}
1425
1426void
Thomas Wouters334fb892000-07-25 12:56:38 +00001427PyObject_Free(void *p)
Guido van Rossumb18618d2000-05-03 23:44:39 +00001428{
1429 PyObject_FREE(p);
Guido van Rossume09fb551997-08-05 02:04:34 +00001430}
Guido van Rossum86610361998-04-10 22:32:46 +00001431
1432
1433/* These methods are used to control infinite recursion in repr, str, print,
1434 etc. Container objects that may recursively contain themselves,
1435 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and
1436 Py_ReprLeave() to avoid infinite recursion.
1437
1438 Py_ReprEnter() returns 0 the first time it is called for a particular
1439 object and 1 every time thereafter. It returns -1 if an exception
1440 occurred. Py_ReprLeave() has no return value.
1441
1442 See dictobject.c and listobject.c for examples of use.
1443*/
1444
1445#define KEY "Py_Repr"
1446
1447int
Fred Drake100814d2000-07-09 15:48:49 +00001448Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001449{
1450 PyObject *dict;
1451 PyObject *list;
1452 int i;
1453
1454 dict = PyThreadState_GetDict();
1455 if (dict == NULL)
1456 return -1;
1457 list = PyDict_GetItemString(dict, KEY);
1458 if (list == NULL) {
1459 list = PyList_New(0);
1460 if (list == NULL)
1461 return -1;
1462 if (PyDict_SetItemString(dict, KEY, list) < 0)
1463 return -1;
1464 Py_DECREF(list);
1465 }
1466 i = PyList_GET_SIZE(list);
1467 while (--i >= 0) {
1468 if (PyList_GET_ITEM(list, i) == obj)
1469 return 1;
1470 }
1471 PyList_Append(list, obj);
1472 return 0;
1473}
1474
1475void
Fred Drake100814d2000-07-09 15:48:49 +00001476Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00001477{
1478 PyObject *dict;
1479 PyObject *list;
1480 int i;
1481
1482 dict = PyThreadState_GetDict();
Guido van Rossumeb909461998-04-11 15:17:34 +00001483 if (dict == NULL)
1484 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001485 list = PyDict_GetItemString(dict, KEY);
Guido van Rossumeb909461998-04-11 15:17:34 +00001486 if (list == NULL || !PyList_Check(list))
1487 return;
Guido van Rossum86610361998-04-10 22:32:46 +00001488 i = PyList_GET_SIZE(list);
1489 /* Count backwards because we always expect obj to be list[-1] */
1490 while (--i >= 0) {
1491 if (PyList_GET_ITEM(list, i) == obj) {
1492 PyList_SetSlice(list, i, i + 1, NULL);
1493 break;
1494 }
1495 }
1496}
Guido van Rossumd724b232000-03-13 16:01:29 +00001497
1498/*
1499 trashcan
1500 CT 2k0130
1501 non-recursively destroy nested objects
1502
1503 CT 2k0223
1504 everything is now done in a macro.
1505
1506 CT 2k0305
1507 modified to use functions, after Tim Peter's suggestion.
1508
1509 CT 2k0309
1510 modified to restore a possible error.
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001511
1512 CT 2k0325
1513 added better safe than sorry check for threadstate
Guido van Rossume92e6102000-04-24 15:40:53 +00001514
1515 CT 2k0422
1516 complete rewrite. We now build a chain via ob_type
1517 and save the limited number of types in ob_refcnt.
1518 This is perfect since we don't need any memory.
1519 A patch for free-threading would need just a lock.
Guido van Rossumd724b232000-03-13 16:01:29 +00001520*/
1521
Guido van Rossume92e6102000-04-24 15:40:53 +00001522#define Py_TRASHCAN_TUPLE 1
1523#define Py_TRASHCAN_LIST 2
1524#define Py_TRASHCAN_DICT 3
1525#define Py_TRASHCAN_FRAME 4
1526#define Py_TRASHCAN_TRACEBACK 5
1527/* extend here if other objects want protection */
1528
Guido van Rossumd724b232000-03-13 16:01:29 +00001529int _PyTrash_delete_nesting = 0;
Guido van Rossume92e6102000-04-24 15:40:53 +00001530
Guido van Rossumd724b232000-03-13 16:01:29 +00001531PyObject * _PyTrash_delete_later = NULL;
1532
1533void
Fred Drake100814d2000-07-09 15:48:49 +00001534_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00001535{
Guido van Rossume92e6102000-04-24 15:40:53 +00001536 int typecode;
Guido van Rossum13ff8eb2000-03-25 18:39:19 +00001537
Guido van Rossume92e6102000-04-24 15:40:53 +00001538 if (PyTuple_Check(op))
1539 typecode = Py_TRASHCAN_TUPLE;
1540 else if (PyList_Check(op))
1541 typecode = Py_TRASHCAN_LIST;
1542 else if (PyDict_Check(op))
1543 typecode = Py_TRASHCAN_DICT;
1544 else if (PyFrame_Check(op))
1545 typecode = Py_TRASHCAN_FRAME;
1546 else if (PyTraceBack_Check(op))
1547 typecode = Py_TRASHCAN_TRACEBACK;
Moshe Zadkacf703f02000-08-04 15:36:13 +00001548 else /* We have a bug here -- those are the only types in GC */ {
1549 Py_FatalError("Type not supported in GC -- internal bug");
1550 return; /* pacify compiler -- execution never here */
1551 }
Guido van Rossume92e6102000-04-24 15:40:53 +00001552 op->ob_refcnt = typecode;
Guido van Rossumd724b232000-03-13 16:01:29 +00001553
Guido van Rossume92e6102000-04-24 15:40:53 +00001554 op->ob_type = (PyTypeObject*)_PyTrash_delete_later;
1555 _PyTrash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00001556}
1557
1558void
Fred Drake100814d2000-07-09 15:48:49 +00001559_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00001560{
1561 while (_PyTrash_delete_later) {
1562 PyObject *shredder = _PyTrash_delete_later;
Guido van Rossume92e6102000-04-24 15:40:53 +00001563 _PyTrash_delete_later = (PyObject*) shredder->ob_type;
1564
1565 switch (shredder->ob_refcnt) {
1566 case Py_TRASHCAN_TUPLE:
1567 shredder->ob_type = &PyTuple_Type;
1568 break;
1569 case Py_TRASHCAN_LIST:
1570 shredder->ob_type = &PyList_Type;
1571 break;
1572 case Py_TRASHCAN_DICT:
1573 shredder->ob_type = &PyDict_Type;
1574 break;
1575 case Py_TRASHCAN_FRAME:
1576 shredder->ob_type = &PyFrame_Type;
1577 break;
1578 case Py_TRASHCAN_TRACEBACK:
1579 shredder->ob_type = &PyTraceBack_Type;
1580 break;
1581 }
1582 _Py_NewReference(shredder);
1583
Guido van Rossumd724b232000-03-13 16:01:29 +00001584 ++_PyTrash_delete_nesting;
1585 Py_DECREF(shredder);
1586 --_PyTrash_delete_nesting;
1587 }
1588}