blob: 2471f6b0588c9cd95da99423191b5a0aee61ea7c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Benjamin Peterson722954a2011-06-11 16:33:35 -05002/* Generic object operations; and implementation of None */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/pystate.h"
Yury Selivanovf23746a2018-01-22 19:11:18 -05006#include "internal/context.h"
Benjamin Petersonfd838e62009-04-20 02:09:13 +00007#include "frameobject.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009#ifdef __cplusplus
10extern "C" {
11#endif
12
Victor Stinnerbd303c12013-11-07 23:07:29 +010013_Py_IDENTIFIER(Py_Repr);
14_Py_IDENTIFIER(__bytes__);
15_Py_IDENTIFIER(__dir__);
16_Py_IDENTIFIER(__isabstractmethod__);
17_Py_IDENTIFIER(builtins);
18
Tim Peters34592512002-07-11 06:23:50 +000019#ifdef Py_REF_DEBUG
Neal Norwitz84632ee2006-03-04 20:00:59 +000020Py_ssize_t _Py_RefTotal;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000021
22Py_ssize_t
23_Py_GetRefTotal(void)
24{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000025 PyObject *o;
26 Py_ssize_t total = _Py_RefTotal;
Antoine Pitrou9d952542013-08-24 21:07:07 +020027 o = _PySet_Dummy;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 if (o != NULL)
29 total -= o->ob_refcnt;
30 return total;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000031}
Nick Coghland6009512014-11-20 21:39:37 +100032
33void
34_PyDebug_PrintTotalRefs(void) {
Eric Snowdae02762017-09-14 00:35:58 -070035 fprintf(stderr,
36 "[%" PY_FORMAT_SIZE_T "d refs, "
37 "%" PY_FORMAT_SIZE_T "d blocks]\n",
38 _Py_GetRefTotal(), _Py_GetAllocatedBlocks());
Nick Coghland6009512014-11-20 21:39:37 +100039}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000040#endif /* Py_REF_DEBUG */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum3f5da241990-12-20 15:06:42 +000042/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
43 These are used by the individual routines for object creation.
44 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Tim Peters78be7992003-03-23 02:51:01 +000046#ifdef Py_TRACE_REFS
Tim Peters7571a0f2003-03-23 17:52:28 +000047/* Head of circular doubly-linked list of all objects. These are linked
48 * together via the _ob_prev and _ob_next members of a PyObject, which
49 * exist only in a Py_TRACE_REFS build.
50 */
Tim Peters78be7992003-03-23 02:51:01 +000051static PyObject refchain = {&refchain, &refchain};
Tim Peters36eb4df2003-03-23 03:33:13 +000052
Tim Peters7571a0f2003-03-23 17:52:28 +000053/* Insert op at the front of the list of all objects. If force is true,
54 * op is added even if _ob_prev and _ob_next are non-NULL already. If
55 * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
56 * force should be true if and only if op points to freshly allocated,
57 * uninitialized memory, or you've unlinked op from the list and are
Tim Peters51f8d382003-03-23 18:06:08 +000058 * relinking it into the front.
Tim Peters7571a0f2003-03-23 17:52:28 +000059 * Note that objects are normally added to the list via _Py_NewReference,
60 * which is called by PyObject_Init. Not all objects are initialized that
61 * way, though; exceptions include statically allocated type objects, and
62 * statically allocated singletons (like Py_True and Py_None).
63 */
Tim Peters36eb4df2003-03-23 03:33:13 +000064void
Tim Peters7571a0f2003-03-23 17:52:28 +000065_Py_AddToAllObjects(PyObject *op, int force)
Tim Peters36eb4df2003-03-23 03:33:13 +000066{
Tim Peters7571a0f2003-03-23 17:52:28 +000067#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 if (!force) {
69 /* If it's initialized memory, op must be in or out of
70 * the list unambiguously.
71 */
72 assert((op->_ob_prev == NULL) == (op->_ob_next == NULL));
73 }
Tim Peters78be7992003-03-23 02:51:01 +000074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 if (force || op->_ob_prev == NULL) {
76 op->_ob_next = refchain._ob_next;
77 op->_ob_prev = &refchain;
78 refchain._ob_next->_ob_prev = op;
79 refchain._ob_next = op;
80 }
Tim Peters7571a0f2003-03-23 17:52:28 +000081}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082#endif /* Py_TRACE_REFS */
Tim Peters78be7992003-03-23 02:51:01 +000083
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000084#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085static PyTypeObject *type_list;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000086/* All types are added to type_list, at least when
87 they get one object created. That makes them
88 immortal, which unfortunately contributes to
89 garbage itself. If unlist_types_without_objects
90 is set, they will be removed from the type_list
91 once the last object is deallocated. */
Benjamin Petersona4a37fe2009-01-11 17:13:55 +000092static int unlist_types_without_objects;
93extern Py_ssize_t tuple_zero_allocs, fast_tuple_allocs;
94extern Py_ssize_t quick_int_allocs, quick_neg_int_allocs;
95extern Py_ssize_t null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000096void
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000097dump_counts(FILE* f)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000098{
Victor Stinner25420fe2017-11-20 18:12:22 -080099 PyInterpreterState *interp = PyThreadState_GET()->interp;
Eddie Elizondo745dc652018-02-21 20:55:18 -0800100 if (!interp->core_config.show_alloc_count) {
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +0300101 return;
Victor Stinner25420fe2017-11-20 18:12:22 -0800102 }
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000103
Eddie Elizondo745dc652018-02-21 20:55:18 -0800104 PyTypeObject *tp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 for (tp = type_list; tp; tp = tp->tp_next)
106 fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
107 "freed: %" PY_FORMAT_SIZE_T "d, "
108 "max in use: %" PY_FORMAT_SIZE_T "d\n",
109 tp->tp_name, tp->tp_allocs, tp->tp_frees,
110 tp->tp_maxalloc);
111 fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, "
112 "empty: %" PY_FORMAT_SIZE_T "d\n",
113 fast_tuple_allocs, tuple_zero_allocs);
114 fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, "
115 "neg: %" PY_FORMAT_SIZE_T "d\n",
116 quick_int_allocs, quick_neg_int_allocs);
117 fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, "
118 "1-strings: %" PY_FORMAT_SIZE_T "d\n",
119 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000120}
121
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000122PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000123get_counts(void)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 PyTypeObject *tp;
126 PyObject *result;
127 PyObject *v;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 result = PyList_New(0);
130 if (result == NULL)
131 return NULL;
132 for (tp = type_list; tp; tp = tp->tp_next) {
133 v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs,
134 tp->tp_frees, tp->tp_maxalloc);
135 if (v == NULL) {
136 Py_DECREF(result);
137 return NULL;
138 }
139 if (PyList_Append(result, v) < 0) {
140 Py_DECREF(v);
141 Py_DECREF(result);
142 return NULL;
143 }
144 Py_DECREF(v);
145 }
146 return result;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000147}
148
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000149void
Fred Drake100814d2000-07-09 15:48:49 +0000150inc_count(PyTypeObject *tp)
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 if (tp->tp_next == NULL && tp->tp_prev == NULL) {
153 /* first time; insert in linked list */
154 if (tp->tp_next != NULL) /* sanity check */
155 Py_FatalError("XXX inc_count sanity check");
156 if (type_list)
157 type_list->tp_prev = tp;
158 tp->tp_next = type_list;
159 /* Note that as of Python 2.2, heap-allocated type objects
160 * can go away, but this code requires that they stay alive
161 * until program exit. That's why we're careful with
162 * refcounts here. type_list gets a new reference to tp,
163 * while ownership of the reference type_list used to hold
164 * (if any) was transferred to tp->tp_next in the line above.
165 * tp is thus effectively immortal after this.
166 */
167 Py_INCREF(tp);
168 type_list = tp;
Tim Peters3e40c7f2003-03-23 03:04:32 +0000169#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 /* Also insert in the doubly-linked list of all objects,
171 * if not already there.
172 */
173 _Py_AddToAllObjects((PyObject *)tp, 0);
Tim Peters78be7992003-03-23 02:51:01 +0000174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 }
176 tp->tp_allocs++;
177 if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc)
178 tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000179}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000180
181void dec_count(PyTypeObject *tp)
182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 tp->tp_frees++;
184 if (unlist_types_without_objects &&
185 tp->tp_allocs == tp->tp_frees) {
186 /* unlink the type from type_list */
187 if (tp->tp_prev)
188 tp->tp_prev->tp_next = tp->tp_next;
189 else
190 type_list = tp->tp_next;
191 if (tp->tp_next)
192 tp->tp_next->tp_prev = tp->tp_prev;
193 tp->tp_next = tp->tp_prev = NULL;
194 Py_DECREF(tp);
195 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000196}
197
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000198#endif
199
Tim Peters7c321a82002-07-09 02:57:01 +0000200#ifdef Py_REF_DEBUG
201/* Log a fatal error; doesn't return. */
202void
203_Py_NegativeRefcount(const char *fname, int lineno, PyObject *op)
204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 char buf[300];
Tim Peters7c321a82002-07-09 02:57:01 +0000206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 PyOS_snprintf(buf, sizeof(buf),
208 "%s:%i object at %p has negative ref count "
209 "%" PY_FORMAT_SIZE_T "d",
210 fname, lineno, op, op->ob_refcnt);
211 Py_FatalError(buf);
Tim Peters7c321a82002-07-09 02:57:01 +0000212}
213
214#endif /* Py_REF_DEBUG */
215
Thomas Heller1328b522004-04-22 17:23:49 +0000216void
217Py_IncRef(PyObject *o)
218{
219 Py_XINCREF(o);
220}
221
222void
223Py_DecRef(PyObject *o)
224{
225 Py_XDECREF(o);
226}
227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000229PyObject_Init(PyObject *op, PyTypeObject *tp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (op == NULL)
232 return PyErr_NoMemory();
233 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
234 Py_TYPE(op) = tp;
235 _Py_NewReference(op);
236 return op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
Guido van Rossumb18618d2000-05-03 23:44:39 +0000239PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000240PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (op == NULL)
243 return (PyVarObject *) PyErr_NoMemory();
244 /* Any changes should be reflected in PyObject_INIT_VAR */
245 op->ob_size = size;
246 Py_TYPE(op) = tp;
247 _Py_NewReference((PyObject *)op);
248 return op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000249}
250
251PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000252_PyObject_New(PyTypeObject *tp)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 PyObject *op;
255 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
256 if (op == NULL)
257 return PyErr_NoMemory();
258 return PyObject_INIT(op, tp);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000259}
260
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000261PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000262_PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 PyVarObject *op;
265 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
266 op = (PyVarObject *) PyObject_MALLOC(size);
267 if (op == NULL)
268 return (PyVarObject *)PyErr_NoMemory();
269 return PyObject_INIT_VAR(op, tp, nitems);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000270}
271
Antoine Pitrou796564c2013-07-30 19:59:21 +0200272void
273PyObject_CallFinalizer(PyObject *self)
274{
275 PyTypeObject *tp = Py_TYPE(self);
276
277 /* The former could happen on heaptypes created from the C API, e.g.
278 PyType_FromSpec(). */
279 if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_FINALIZE) ||
280 tp->tp_finalize == NULL)
281 return;
282 /* tp_finalize should only be called once. */
283 if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
284 return;
285
286 tp->tp_finalize(self);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900287 if (PyType_IS_GC(tp)) {
288 _PyGC_SET_FINALIZED(self);
289 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200290}
291
292int
293PyObject_CallFinalizerFromDealloc(PyObject *self)
294{
295 Py_ssize_t refcnt;
296
297 /* Temporarily resurrect the object. */
298 if (self->ob_refcnt != 0) {
299 Py_FatalError("PyObject_CallFinalizerFromDealloc called on "
300 "object with a non-zero refcount");
301 }
302 self->ob_refcnt = 1;
303
304 PyObject_CallFinalizer(self);
305
306 /* Undo the temporary resurrection; can't use DECREF here, it would
307 * cause a recursive call.
308 */
309 assert(self->ob_refcnt > 0);
310 if (--self->ob_refcnt == 0)
311 return 0; /* this is the normal path out */
312
313 /* tp_finalize resurrected it! Make it look like the original Py_DECREF
314 * never happened.
315 */
316 refcnt = self->ob_refcnt;
317 _Py_NewReference(self);
318 self->ob_refcnt = refcnt;
319
INADA Naokid8521422018-05-17 11:07:21 +0900320 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +0200321 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
322 * we need to undo that. */
323 _Py_DEC_REFTOTAL;
324 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
325 * chain, so no more to do there.
326 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
327 * _Py_NewReference bumped tp_allocs: both of those need to be
328 * undone.
329 */
330#ifdef COUNT_ALLOCS
331 --Py_TYPE(self)->tp_frees;
332 --Py_TYPE(self)->tp_allocs;
333#endif
334 return -1;
335}
336
Antoine Pitrouc47bd4a2010-07-27 22:08:27 +0000337int
338PyObject_Print(PyObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 int ret = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (PyErr_CheckSignals())
342 return -1;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000343#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 if (PyOS_CheckStack()) {
345 PyErr_SetString(PyExc_MemoryError, "stack overflow");
346 return -1;
347 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 clearerr(fp); /* Clear any previous error condition */
350 if (op == NULL) {
351 Py_BEGIN_ALLOW_THREADS
352 fprintf(fp, "<nil>");
353 Py_END_ALLOW_THREADS
354 }
355 else {
356 if (op->ob_refcnt <= 0)
357 /* XXX(twouters) cast refcount to long until %zd is
358 universally available */
359 Py_BEGIN_ALLOW_THREADS
360 fprintf(fp, "<refcnt %ld at %p>",
361 (long)op->ob_refcnt, op);
362 Py_END_ALLOW_THREADS
363 else {
364 PyObject *s;
365 if (flags & Py_PRINT_RAW)
366 s = PyObject_Str(op);
367 else
368 s = PyObject_Repr(op);
369 if (s == NULL)
370 ret = -1;
371 else if (PyBytes_Check(s)) {
372 fwrite(PyBytes_AS_STRING(s), 1,
373 PyBytes_GET_SIZE(s), fp);
374 }
375 else if (PyUnicode_Check(s)) {
376 PyObject *t;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200377 t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 if (t == NULL)
379 ret = 0;
380 else {
381 fwrite(PyBytes_AS_STRING(t), 1,
382 PyBytes_GET_SIZE(t), fp);
Victor Stinnerba6b4302010-05-17 09:33:42 +0000383 Py_DECREF(t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 }
385 }
386 else {
387 PyErr_Format(PyExc_TypeError,
388 "str() or repr() returned '%.100s'",
389 s->ob_type->tp_name);
390 ret = -1;
391 }
392 Py_XDECREF(s);
393 }
394 }
395 if (ret == 0) {
396 if (ferror(fp)) {
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300397 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 clearerr(fp);
399 ret = -1;
400 }
401 }
402 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403}
404
Guido van Rossum38938152006-08-21 23:36:26 +0000405/* For debugging convenience. Set a breakpoint here and call it from your DLL */
406void
Thomas Woutersb2137042007-02-01 18:02:27 +0000407_Py_BreakPoint(void)
Guido van Rossum38938152006-08-21 23:36:26 +0000408{
409}
410
Neal Norwitz1a997502003-01-13 20:13:12 +0000411
Barry Warsaw9bf16442001-01-23 16:24:35 +0000412/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
Guido van Rossum38938152006-08-21 23:36:26 +0000413void
414_PyObject_Dump(PyObject* op)
Barry Warsaw9bf16442001-01-23 16:24:35 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 if (op == NULL)
417 fprintf(stderr, "NULL\n");
418 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 PyGILState_STATE gil;
Victor Stinnere5132102013-08-26 13:49:06 +0200420 PyObject *error_type, *error_value, *error_traceback;
421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 fprintf(stderr, "object : ");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 gil = PyGILState_Ensure();
Victor Stinnere5132102013-08-26 13:49:06 +0200424
425 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 (void)PyObject_Print(op, stderr, 0);
Victor Stinnere5132102013-08-26 13:49:06 +0200427 PyErr_Restore(error_type, error_value, error_traceback);
428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 PyGILState_Release(gil);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 /* XXX(twouters) cast refcount to long until %zd is
431 universally available */
432 fprintf(stderr, "\n"
433 "type : %s\n"
434 "refcount: %ld\n"
435 "address : %p\n",
436 Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name,
437 (long)op->ob_refcnt,
438 op);
439 }
Barry Warsaw9bf16442001-01-23 16:24:35 +0000440}
Barry Warsaw903138f2001-01-23 16:33:18 +0000441
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000443PyObject_Repr(PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 PyObject *res;
446 if (PyErr_CheckSignals())
447 return NULL;
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000448#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 if (PyOS_CheckStack()) {
450 PyErr_SetString(PyExc_MemoryError, "stack overflow");
451 return NULL;
452 }
Guido van Rossum9b00dfa1998-04-28 16:06:54 +0000453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 if (v == NULL)
455 return PyUnicode_FromString("<NULL>");
456 if (Py_TYPE(v)->tp_repr == NULL)
457 return PyUnicode_FromFormat("<%s object at %p>",
458 v->ob_type->tp_name, v);
Victor Stinner33824f62013-08-26 14:05:19 +0200459
460#ifdef Py_DEBUG
461 /* PyObject_Repr() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100462 because it can clear it (directly or indirectly) and so the
Martin Panter9955a372015-10-07 10:26:23 +0000463 caller loses its exception */
Victor Stinner33824f62013-08-26 14:05:19 +0200464 assert(!PyErr_Occurred());
465#endif
466
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200467 /* It is possible for a type to have a tp_repr representation that loops
468 infinitely. */
469 if (Py_EnterRecursiveCall(" while getting the repr of an object"))
470 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 res = (*v->ob_type->tp_repr)(v);
Serhiy Storchaka1fb72d22017-12-03 22:12:11 +0200472 Py_LeaveRecursiveCall();
Victor Stinner0a54cf12011-12-01 03:22:44 +0100473 if (res == NULL)
474 return NULL;
475 if (!PyUnicode_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 PyErr_Format(PyExc_TypeError,
477 "__repr__ returned non-string (type %.200s)",
478 res->ob_type->tp_name);
479 Py_DECREF(res);
480 return NULL;
481 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100482#ifndef Py_DEBUG
483 if (PyUnicode_READY(res) < 0)
484 return NULL;
485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 return res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487}
488
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +0000490PyObject_Str(PyObject *v)
Guido van Rossumc6004111993-11-05 10:22:19 +0000491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 PyObject *res;
493 if (PyErr_CheckSignals())
494 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000495#ifdef USE_STACKCHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if (PyOS_CheckStack()) {
497 PyErr_SetString(PyExc_MemoryError, "stack overflow");
498 return NULL;
499 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (v == NULL)
502 return PyUnicode_FromString("<NULL>");
503 if (PyUnicode_CheckExact(v)) {
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100504#ifndef Py_DEBUG
Victor Stinner4ead7c72011-11-20 19:48:36 +0100505 if (PyUnicode_READY(v) < 0)
506 return NULL;
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 Py_INCREF(v);
509 return v;
510 }
511 if (Py_TYPE(v)->tp_str == NULL)
512 return PyObject_Repr(v);
Guido van Rossum4f288ab2001-05-01 16:53:37 +0000513
Victor Stinner33824f62013-08-26 14:05:19 +0200514#ifdef Py_DEBUG
515 /* PyObject_Str() must not be called with an exception set,
Victor Stinnera8cb5152017-01-18 14:12:51 +0100516 because it can clear it (directly or indirectly) and so the
Nick Coghland979e432014-02-09 10:43:21 +1000517 caller loses its exception */
Victor Stinner33824f62013-08-26 14:05:19 +0200518 assert(!PyErr_Occurred());
519#endif
520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 /* It is possible for a type to have a tp_str representation that loops
522 infinitely. */
523 if (Py_EnterRecursiveCall(" while getting the str of an object"))
524 return NULL;
525 res = (*Py_TYPE(v)->tp_str)(v);
526 Py_LeaveRecursiveCall();
527 if (res == NULL)
528 return NULL;
529 if (!PyUnicode_Check(res)) {
530 PyErr_Format(PyExc_TypeError,
531 "__str__ returned non-string (type %.200s)",
532 Py_TYPE(res)->tp_name);
533 Py_DECREF(res);
534 return NULL;
535 }
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100536#ifndef Py_DEBUG
Victor Stinner4ead7c72011-11-20 19:48:36 +0100537 if (PyUnicode_READY(res) < 0)
538 return NULL;
Victor Stinnerdb88ae52011-12-01 02:15:00 +0100539#endif
Victor Stinner4ead7c72011-11-20 19:48:36 +0100540 assert(_PyUnicode_CheckConsistency(res, 1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 return res;
Neil Schemenauercf52c072005-08-12 17:34:58 +0000542}
543
Georg Brandl559e5d72008-06-11 18:37:52 +0000544PyObject *
545PyObject_ASCII(PyObject *v)
546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 PyObject *repr, *ascii, *res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 repr = PyObject_Repr(v);
550 if (repr == NULL)
551 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000552
Victor Stinneraf037572013-04-14 18:44:10 +0200553 if (PyUnicode_IS_ASCII(repr))
554 return repr;
555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200557 ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 Py_DECREF(repr);
559 if (ascii == NULL)
560 return NULL;
Georg Brandl559e5d72008-06-11 18:37:52 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 res = PyUnicode_DecodeASCII(
563 PyBytes_AS_STRING(ascii),
564 PyBytes_GET_SIZE(ascii),
565 NULL);
566
567 Py_DECREF(ascii);
568 return res;
Georg Brandl559e5d72008-06-11 18:37:52 +0000569}
Guido van Rossuma3af41d2001-01-18 22:07:06 +0000570
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000571PyObject *
572PyObject_Bytes(PyObject *v)
573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *result, *func;
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 if (v == NULL)
577 return PyBytes_FromString("<NULL>");
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (PyBytes_CheckExact(v)) {
580 Py_INCREF(v);
581 return v;
582 }
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000583
Benjamin Petersonce798522012-01-22 11:24:29 -0500584 func = _PyObject_LookupSpecial(v, &PyId___bytes__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100586 result = _PyObject_CallNoArg(func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 Py_DECREF(func);
588 if (result == NULL)
Benjamin Peterson41ece392010-09-11 16:39:57 +0000589 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 if (!PyBytes_Check(result)) {
Benjamin Peterson41ece392010-09-11 16:39:57 +0000591 PyErr_Format(PyExc_TypeError,
592 "__bytes__ returned non-bytes (type %.200s)",
593 Py_TYPE(result)->tp_name);
594 Py_DECREF(result);
595 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 }
597 return result;
598 }
599 else if (PyErr_Occurred())
600 return NULL;
601 return PyBytes_FromObject(v);
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000602}
603
Mark Dickinsonc008a172009-02-01 13:59:22 +0000604/* For Python 3.0.1 and later, the old three-way comparison has been
605 completely removed in favour of rich comparisons. PyObject_Compare() and
606 PyObject_Cmp() are gone, and the builtin cmp function no longer exists.
Mark Dickinsone94c6792009-02-02 20:36:42 +0000607 The old tp_compare slot has been renamed to tp_reserved, and should no
Mark Dickinsonc008a172009-02-01 13:59:22 +0000608 longer be used. Use tp_richcompare instead.
Guido van Rossum98297ee2007-11-06 21:34:58 +0000609
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000610 See (*) below for practical amendments.
611
Mark Dickinsonc008a172009-02-01 13:59:22 +0000612 tp_richcompare gets called with a first argument of the appropriate type
613 and a second object of an arbitrary type. We never do any kind of
614 coercion.
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000615
Mark Dickinsonc008a172009-02-01 13:59:22 +0000616 The tp_richcompare slot should return an object, as follows:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000617
618 NULL if an exception occurred
619 NotImplemented if the requested comparison is not implemented
620 any other false value if the requested comparison is false
621 any other true value if the requested comparison is true
622
623 The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get
624 NotImplemented.
625
626 (*) Practical amendments:
627
628 - If rich comparison returns NotImplemented, == and != are decided by
629 comparing the object pointer (i.e. falling back to the base object
630 implementation).
631
Guido van Rossuma4073002002-05-31 20:03:54 +0000632*/
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000633
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000634/* Map rich comparison operators to their swapped version, e.g. LT <--> GT */
Brett Cannona5ca2e72004-09-25 01:37:24 +0000635int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +0000636
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200637static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000638
639/* Perform a rich comparison, raising TypeError when the requested comparison
640 operator is not supported. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000641static PyObject *
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000642do_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossume797ec12001-01-17 15:24:28 +0000643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 richcmpfunc f;
645 PyObject *res;
646 int checked_reverse_op = 0;
Guido van Rossume797ec12001-01-17 15:24:28 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if (v->ob_type != w->ob_type &&
649 PyType_IsSubtype(w->ob_type, v->ob_type) &&
650 (f = w->ob_type->tp_richcompare) != NULL) {
651 checked_reverse_op = 1;
652 res = (*f)(w, v, _Py_SwappedOp[op]);
653 if (res != Py_NotImplemented)
654 return res;
655 Py_DECREF(res);
656 }
657 if ((f = v->ob_type->tp_richcompare) != NULL) {
658 res = (*f)(v, w, op);
659 if (res != Py_NotImplemented)
660 return res;
661 Py_DECREF(res);
662 }
663 if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
664 res = (*f)(w, v, _Py_SwappedOp[op]);
665 if (res != Py_NotImplemented)
666 return res;
667 Py_DECREF(res);
668 }
669 /* If neither object implements it, provide a sensible default
670 for == and !=, but raise an exception for ordering. */
671 switch (op) {
672 case Py_EQ:
673 res = (v == w) ? Py_True : Py_False;
674 break;
675 case Py_NE:
676 res = (v != w) ? Py_True : Py_False;
677 break;
678 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 PyErr_Format(PyExc_TypeError,
Victor Stinner91108f02015-10-14 18:25:31 +0200680 "'%s' not supported between instances of '%.100s' and '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 opstrings[op],
Victor Stinner91108f02015-10-14 18:25:31 +0200682 v->ob_type->tp_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 w->ob_type->tp_name);
684 return NULL;
685 }
686 Py_INCREF(res);
687 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000688}
689
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000690/* Perform a rich comparison with object result. This wraps do_richcompare()
691 with a check for NULL arguments and a recursion check. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000692
Guido van Rossume797ec12001-01-17 15:24:28 +0000693PyObject *
694PyObject_RichCompare(PyObject *v, PyObject *w, int op)
695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 PyObject *res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 assert(Py_LT <= op && op <= Py_GE);
699 if (v == NULL || w == NULL) {
700 if (!PyErr_Occurred())
701 PyErr_BadInternalCall();
702 return NULL;
703 }
704 if (Py_EnterRecursiveCall(" in comparison"))
705 return NULL;
706 res = do_richcompare(v, w, op);
707 Py_LeaveRecursiveCall();
708 return res;
Guido van Rossume797ec12001-01-17 15:24:28 +0000709}
710
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000711/* Perform a rich comparison with integer result. This wraps
712 PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */
Guido van Rossume797ec12001-01-17 15:24:28 +0000713int
714PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 PyObject *res;
717 int ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 /* Quick result when objects are the same.
720 Guarantees that identity implies equality. */
721 if (v == w) {
722 if (op == Py_EQ)
723 return 1;
724 else if (op == Py_NE)
725 return 0;
726 }
Mark Dickinson4a1f5932008-11-12 23:23:36 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 res = PyObject_RichCompare(v, w, op);
729 if (res == NULL)
730 return -1;
731 if (PyBool_Check(res))
732 ok = (res == Py_True);
733 else
734 ok = PyObject_IsTrue(res);
735 Py_DECREF(res);
736 return ok;
Guido van Rossume797ec12001-01-17 15:24:28 +0000737}
Fred Drake13634cf2000-06-29 19:17:04 +0000738
Antoine Pitrouce4a9da2011-11-21 20:46:33 +0100739Py_hash_t
Nick Coghland1abd252008-07-15 15:46:38 +0000740PyObject_HashNotImplemented(PyObject *v)
741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
743 Py_TYPE(v)->tp_name);
744 return -1;
Nick Coghland1abd252008-07-15 15:46:38 +0000745}
Fred Drake13634cf2000-06-29 19:17:04 +0000746
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000747Py_hash_t
Fred Drake100814d2000-07-09 15:48:49 +0000748PyObject_Hash(PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 PyTypeObject *tp = Py_TYPE(v);
751 if (tp->tp_hash != NULL)
752 return (*tp->tp_hash)(v);
753 /* To keep to the general practice that inheriting
754 * solely from object in C code should work without
755 * an explicit call to PyType_Ready, we implicitly call
756 * PyType_Ready here and then check the tp_hash slot again
757 */
758 if (tp->tp_dict == NULL) {
759 if (PyType_Ready(tp) < 0)
760 return -1;
761 if (tp->tp_hash != NULL)
762 return (*tp->tp_hash)(v);
763 }
764 /* Otherwise, the object can't be hashed */
765 return PyObject_HashNotImplemented(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000766}
767
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000769PyObject_GetAttrString(PyObject *v, const char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 PyObject *w, *res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (Py_TYPE(v)->tp_getattr != NULL)
774 return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
INADA Naoki3e8d6cb2017-02-21 23:57:25 +0900775 w = PyUnicode_FromString(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (w == NULL)
777 return NULL;
778 res = PyObject_GetAttr(v, w);
Victor Stinner59af08f2012-03-22 02:09:08 +0100779 Py_DECREF(w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781}
782
783int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000784PyObject_HasAttrString(PyObject *v, const char *name)
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyObject *res = PyObject_GetAttrString(v, name);
787 if (res != NULL) {
788 Py_DECREF(res);
789 return 1;
790 }
791 PyErr_Clear();
792 return 0;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000793}
794
795int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000796PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 PyObject *s;
799 int res;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 if (Py_TYPE(v)->tp_setattr != NULL)
802 return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
803 s = PyUnicode_InternFromString(name);
804 if (s == NULL)
805 return -1;
806 res = PyObject_SetAttr(v, s, w);
807 Py_XDECREF(s);
808 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809}
810
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500811int
812_PyObject_IsAbstract(PyObject *obj)
813{
814 int res;
815 PyObject* isabstract;
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500816
817 if (obj == NULL)
818 return 0;
819
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200820 res = _PyObject_LookupAttrId(obj, &PyId___isabstractmethod__, &isabstract);
821 if (res > 0) {
822 res = PyObject_IsTrue(isabstract);
823 Py_DECREF(isabstract);
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500824 }
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500825 return res;
826}
827
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000828PyObject *
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200829_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
830{
831 PyObject *result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100832 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200833 if (!oname)
834 return NULL;
835 result = PyObject_GetAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200836 return result;
837}
838
839int
840_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name)
841{
842 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100843 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200844 if (!oname)
845 return -1;
846 result = PyObject_HasAttr(v, oname);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200847 return result;
848}
849
850int
851_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
852{
853 int result;
Martin v. Löwisd10759f2011-11-07 13:00:05 +0100854 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200855 if (!oname)
856 return -1;
857 result = PyObject_SetAttr(v, oname, w);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200858 return result;
859}
860
861PyObject *
Fred Drake100814d2000-07-09 15:48:49 +0000862PyObject_GetAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyTypeObject *tp = Py_TYPE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 if (!PyUnicode_Check(name)) {
867 PyErr_Format(PyExc_TypeError,
868 "attribute name must be string, not '%.200s'",
869 name->ob_type->tp_name);
870 return NULL;
871 }
872 if (tp->tp_getattro != NULL)
873 return (*tp->tp_getattro)(v, name);
874 if (tp->tp_getattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200875 const char *name_str = PyUnicode_AsUTF8(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 if (name_str == NULL)
877 return NULL;
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200878 return (*tp->tp_getattr)(v, (char *)name_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 }
880 PyErr_Format(PyExc_AttributeError,
881 "'%.50s' object has no attribute '%U'",
882 tp->tp_name, name);
883 return NULL;
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000884}
885
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200886int
887_PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
INADA Naoki378edee2018-01-16 20:52:41 +0900888{
889 PyTypeObject *tp = Py_TYPE(v);
INADA Naoki378edee2018-01-16 20:52:41 +0900890
891 if (!PyUnicode_Check(name)) {
892 PyErr_Format(PyExc_TypeError,
893 "attribute name must be string, not '%.200s'",
894 name->ob_type->tp_name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200895 *result = NULL;
896 return -1;
INADA Naoki378edee2018-01-16 20:52:41 +0900897 }
898
899 if (tp->tp_getattro == PyObject_GenericGetAttr) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200900 *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
901 if (*result != NULL) {
902 return 1;
903 }
904 if (PyErr_Occurred()) {
905 return -1;
906 }
907 return 0;
INADA Naoki378edee2018-01-16 20:52:41 +0900908 }
909 if (tp->tp_getattro != NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200910 *result = (*tp->tp_getattro)(v, name);
INADA Naoki378edee2018-01-16 20:52:41 +0900911 }
912 else if (tp->tp_getattr != NULL) {
913 const char *name_str = PyUnicode_AsUTF8(name);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200914 if (name_str == NULL) {
915 *result = NULL;
916 return -1;
917 }
918 *result = (*tp->tp_getattr)(v, (char *)name_str);
INADA Naoki378edee2018-01-16 20:52:41 +0900919 }
INADA Naokie76daeb2018-01-26 16:22:51 +0900920 else {
921 *result = NULL;
922 return 0;
923 }
924
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200925 if (*result != NULL) {
926 return 1;
INADA Naoki378edee2018-01-16 20:52:41 +0900927 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200928 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
929 return -1;
930 }
931 PyErr_Clear();
932 return 0;
933}
934
935int
936_PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
937{
938 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
939 if (!oname) {
940 *result = NULL;
941 return -1;
942 }
943 return _PyObject_LookupAttr(v, oname, result);
INADA Naoki378edee2018-01-16 20:52:41 +0900944}
945
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000946int
Fred Drake100814d2000-07-09 15:48:49 +0000947PyObject_HasAttr(PyObject *v, PyObject *name)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000948{
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200949 PyObject *res;
950 if (_PyObject_LookupAttr(v, name, &res) < 0) {
951 PyErr_Clear();
952 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200954 if (res == NULL) {
955 return 0;
956 }
957 Py_DECREF(res);
958 return 1;
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000959}
960
961int
Fred Drake100814d2000-07-09 15:48:49 +0000962PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyTypeObject *tp = Py_TYPE(v);
965 int err;
Marc-André Lemburge44e5072000-09-18 16:20:57 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 if (!PyUnicode_Check(name)) {
968 PyErr_Format(PyExc_TypeError,
969 "attribute name must be string, not '%.200s'",
970 name->ob_type->tp_name);
971 return -1;
972 }
973 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 PyUnicode_InternInPlace(&name);
976 if (tp->tp_setattro != NULL) {
977 err = (*tp->tp_setattro)(v, name, value);
978 Py_DECREF(name);
979 return err;
980 }
981 if (tp->tp_setattr != NULL) {
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200982 const char *name_str = PyUnicode_AsUTF8(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 if (name_str == NULL)
984 return -1;
Serhiy Storchaka2a404b62017-01-22 23:07:07 +0200985 err = (*tp->tp_setattr)(v, (char *)name_str, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 Py_DECREF(name);
987 return err;
988 }
989 Py_DECREF(name);
990 assert(name->ob_refcnt >= 1);
991 if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
992 PyErr_Format(PyExc_TypeError,
993 "'%.100s' object has no attributes "
994 "(%s .%U)",
995 tp->tp_name,
996 value==NULL ? "del" : "assign to",
997 name);
998 else
999 PyErr_Format(PyExc_TypeError,
1000 "'%.100s' object has only read-only attributes "
1001 "(%s .%U)",
1002 tp->tp_name,
1003 value==NULL ? "del" : "assign to",
1004 name);
1005 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006}
1007
1008/* Helper to get a pointer to an object's __dict__ slot, if any */
1009
1010PyObject **
1011_PyObject_GetDictPtr(PyObject *obj)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 Py_ssize_t dictoffset;
1014 PyTypeObject *tp = Py_TYPE(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 dictoffset = tp->tp_dictoffset;
1017 if (dictoffset == 0)
1018 return NULL;
1019 if (dictoffset < 0) {
1020 Py_ssize_t tsize;
1021 size_t size;
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 tsize = ((PyVarObject *)obj)->ob_size;
1024 if (tsize < 0)
1025 tsize = -tsize;
1026 size = _PyObject_VAR_SIZE(tp, tsize);
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 dictoffset += (long)size;
1029 assert(dictoffset > 0);
1030 assert(dictoffset % SIZEOF_VOID_P == 0);
1031 }
1032 return (PyObject **) ((char *)obj + dictoffset);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001033}
1034
Tim Peters6d6c1a32001-08-02 04:15:00 +00001035PyObject *
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00001036PyObject_SelfIter(PyObject *obj)
Raymond Hettinger01538262003-03-17 08:24:35 +00001037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 Py_INCREF(obj);
1039 return obj;
Raymond Hettinger01538262003-03-17 08:24:35 +00001040}
1041
Antoine Pitroua7013882012-04-05 00:04:20 +02001042/* Convenience function to get a builtin from its name */
1043PyObject *
1044_PyObject_GetBuiltin(const char *name)
1045{
Victor Stinner53e9ec42013-11-07 00:43:05 +01001046 PyObject *mod_name, *mod, *attr;
1047
Victor Stinnerbd303c12013-11-07 23:07:29 +01001048 mod_name = _PyUnicode_FromId(&PyId_builtins); /* borrowed */
Victor Stinner53e9ec42013-11-07 00:43:05 +01001049 if (mod_name == NULL)
1050 return NULL;
1051 mod = PyImport_Import(mod_name);
Antoine Pitroua7013882012-04-05 00:04:20 +02001052 if (mod == NULL)
1053 return NULL;
1054 attr = PyObject_GetAttrString(mod, name);
1055 Py_DECREF(mod);
1056 return attr;
1057}
1058
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001059/* Helper used when the __next__ method is removed from a type:
1060 tp_iternext is never NULL and can be safely called without checking
1061 on every iteration.
1062 */
1063
1064PyObject *
1065_PyObject_NextNotImplemented(PyObject *self)
1066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 PyErr_Format(PyExc_TypeError,
1068 "'%.200s' object is not iterable",
1069 Py_TYPE(self)->tp_name);
1070 return NULL;
Amaury Forgeot d'Arcf343e012009-01-12 23:58:21 +00001071}
1072
Yury Selivanovf2392132016-12-13 19:03:51 -05001073
1074/* Specialized version of _PyObject_GenericGetAttrWithDict
1075 specifically for the LOAD_METHOD opcode.
1076
1077 Return 1 if a method is found, 0 if it's a regular attribute
1078 from __dict__ or something returned by using a descriptor
1079 protocol.
1080
1081 `method` will point to the resolved attribute or NULL. In the
1082 latter case, an error will be set.
1083*/
1084int
1085_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
1086{
1087 PyTypeObject *tp = Py_TYPE(obj);
1088 PyObject *descr;
1089 descrgetfunc f = NULL;
1090 PyObject **dictptr, *dict;
1091 PyObject *attr;
1092 int meth_found = 0;
1093
1094 assert(*method == NULL);
1095
1096 if (Py_TYPE(obj)->tp_getattro != PyObject_GenericGetAttr
1097 || !PyUnicode_Check(name)) {
1098 *method = PyObject_GetAttr(obj, name);
1099 return 0;
1100 }
1101
1102 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1103 return 0;
1104
1105 descr = _PyType_Lookup(tp, name);
1106 if (descr != NULL) {
1107 Py_INCREF(descr);
INADA Naoki5566bbb2017-02-03 07:43:03 +09001108 if (PyFunction_Check(descr) ||
1109 (Py_TYPE(descr) == &PyMethodDescr_Type)) {
Yury Selivanovf2392132016-12-13 19:03:51 -05001110 meth_found = 1;
1111 } else {
1112 f = descr->ob_type->tp_descr_get;
1113 if (f != NULL && PyDescr_IsData(descr)) {
1114 *method = f(descr, obj, (PyObject *)obj->ob_type);
1115 Py_DECREF(descr);
1116 return 0;
1117 }
1118 }
1119 }
1120
1121 dictptr = _PyObject_GetDictPtr(obj);
1122 if (dictptr != NULL && (dict = *dictptr) != NULL) {
1123 Py_INCREF(dict);
1124 attr = PyDict_GetItem(dict, name);
1125 if (attr != NULL) {
1126 Py_INCREF(attr);
1127 *method = attr;
1128 Py_DECREF(dict);
1129 Py_XDECREF(descr);
1130 return 0;
1131 }
1132 Py_DECREF(dict);
1133 }
1134
1135 if (meth_found) {
1136 *method = descr;
1137 return 1;
1138 }
1139
1140 if (f != NULL) {
1141 *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1142 Py_DECREF(descr);
1143 return 0;
1144 }
1145
1146 if (descr != NULL) {
1147 *method = descr;
1148 return 0;
1149 }
1150
1151 PyErr_Format(PyExc_AttributeError,
1152 "'%.50s' object has no attribute '%U'",
1153 tp->tp_name, name);
1154 return 0;
1155}
1156
1157/* Generic GetAttr functions - put these in your tp_[gs]etattro slot. */
Michael W. Hudson1593f502004-09-14 17:09:47 +00001158
Raymond Hettinger01538262003-03-17 08:24:35 +00001159PyObject *
INADA Naoki378edee2018-01-16 20:52:41 +09001160_PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
1161 PyObject *dict, int suppress)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001162{
Yury Selivanovf2392132016-12-13 19:03:51 -05001163 /* Make sure the logic of _PyObject_GetMethod is in sync with
1164 this method.
INADA Naoki378edee2018-01-16 20:52:41 +09001165
1166 When suppress=1, this function suppress AttributeError.
Yury Selivanovf2392132016-12-13 19:03:51 -05001167 */
1168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 PyTypeObject *tp = Py_TYPE(obj);
1170 PyObject *descr = NULL;
1171 PyObject *res = NULL;
1172 descrgetfunc f;
1173 Py_ssize_t dictoffset;
1174 PyObject **dictptr;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 if (!PyUnicode_Check(name)){
1177 PyErr_Format(PyExc_TypeError,
1178 "attribute name must be string, not '%.200s'",
1179 name->ob_type->tp_name);
1180 return NULL;
1181 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001182 Py_INCREF(name);
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (tp->tp_dict == NULL) {
1185 if (PyType_Ready(tp) < 0)
1186 goto done;
1187 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 descr = _PyType_Lookup(tp, name);
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 f = NULL;
1192 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001193 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 f = descr->ob_type->tp_descr_get;
1195 if (f != NULL && PyDescr_IsData(descr)) {
1196 res = f(descr, obj, (PyObject *)obj->ob_type);
INADA Naoki378edee2018-01-16 20:52:41 +09001197 if (res == NULL && suppress &&
1198 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1199 PyErr_Clear();
1200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 goto done;
1202 }
1203 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001205 if (dict == NULL) {
1206 /* Inline _PyObject_GetDictPtr */
1207 dictoffset = tp->tp_dictoffset;
1208 if (dictoffset != 0) {
1209 if (dictoffset < 0) {
1210 Py_ssize_t tsize;
1211 size_t size;
Guido van Rossumc66ff442002-08-19 16:50:48 +00001212
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001213 tsize = ((PyVarObject *)obj)->ob_size;
1214 if (tsize < 0)
1215 tsize = -tsize;
1216 size = _PyObject_VAR_SIZE(tp, tsize);
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001217 assert(size <= PY_SSIZE_T_MAX);
Guido van Rossumc66ff442002-08-19 16:50:48 +00001218
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001219 dictoffset += (Py_ssize_t)size;
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001220 assert(dictoffset > 0);
1221 assert(dictoffset % SIZEOF_VOID_P == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001223 dictptr = (PyObject **) ((char *)obj + dictoffset);
1224 dict = *dictptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 }
1226 }
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001227 if (dict != NULL) {
1228 Py_INCREF(dict);
1229 res = PyDict_GetItem(dict, name);
1230 if (res != NULL) {
1231 Py_INCREF(res);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001232 Py_DECREF(dict);
1233 goto done;
1234 }
1235 Py_DECREF(dict);
1236 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 if (f != NULL) {
1239 res = f(descr, obj, (PyObject *)Py_TYPE(obj));
INADA Naoki378edee2018-01-16 20:52:41 +09001240 if (res == NULL && suppress &&
1241 PyErr_ExceptionMatches(PyExc_AttributeError)) {
1242 PyErr_Clear();
1243 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 goto done;
1245 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 if (descr != NULL) {
1248 res = descr;
Victor Stinner2d01dc02012-03-09 00:44:13 +01001249 descr = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 goto done;
1251 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001252
INADA Naoki378edee2018-01-16 20:52:41 +09001253 if (!suppress) {
1254 PyErr_Format(PyExc_AttributeError,
1255 "'%.50s' object has no attribute '%U'",
1256 tp->tp_name, name);
1257 }
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001258 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001259 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 Py_DECREF(name);
1261 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262}
1263
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001264PyObject *
1265PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1266{
INADA Naoki378edee2018-01-16 20:52:41 +09001267 return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001268}
1269
Tim Peters6d6c1a32001-08-02 04:15:00 +00001270int
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001271_PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1272 PyObject *value, PyObject *dict)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 PyTypeObject *tp = Py_TYPE(obj);
1275 PyObject *descr;
1276 descrsetfunc f;
1277 PyObject **dictptr;
1278 int res = -1;
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 if (!PyUnicode_Check(name)){
1281 PyErr_Format(PyExc_TypeError,
1282 "attribute name must be string, not '%.200s'",
1283 name->ob_type->tp_name);
1284 return -1;
1285 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001287 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1288 return -1;
1289
1290 Py_INCREF(name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 descr = _PyType_Lookup(tp, name);
Victor Stinner2d01dc02012-03-09 00:44:13 +01001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 if (descr != NULL) {
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001295 Py_INCREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 f = descr->ob_type->tp_descr_set;
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001297 if (f != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 res = f(descr, obj, value);
1299 goto done;
1300 }
1301 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001303 if (dict == NULL) {
1304 dictptr = _PyObject_GetDictPtr(obj);
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001305 if (dictptr == NULL) {
1306 if (descr == NULL) {
1307 PyErr_Format(PyExc_AttributeError,
1308 "'%.100s' object has no attribute '%U'",
1309 tp->tp_name, name);
1310 }
1311 else {
1312 PyErr_Format(PyExc_AttributeError,
1313 "'%.50s' object attribute '%U' is read-only",
1314 tp->tp_name, name);
1315 }
Benjamin Peterson7d95e402012-04-23 11:24:50 -04001316 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001318 res = _PyObjectDict_SetItem(tp, dictptr, name, value);
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001319 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001320 else {
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001321 Py_INCREF(dict);
1322 if (value == NULL)
1323 res = PyDict_DelItem(dict, name);
1324 else
1325 res = PyDict_SetItem(dict, name, value);
Benjamin Peterson74529ad2012-03-09 07:25:32 -08001326 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
Serhiy Storchaka55c861f2016-04-17 20:31:51 +03001328 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1329 PyErr_SetObject(PyExc_AttributeError, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001330
Guido van Rossumebca9fc2001-12-04 15:54:53 +00001331 done:
Victor Stinner2d01dc02012-03-09 00:44:13 +01001332 Py_XDECREF(descr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 Py_DECREF(name);
1334 return res;
Guido van Rossum98ff96a1997-05-20 18:34:44 +00001335}
1336
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001337int
1338PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1339{
1340 return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1341}
1342
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001343int
1344PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
1345{
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001346 PyObject **dictptr = _PyObject_GetDictPtr(obj);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001347 if (dictptr == NULL) {
1348 PyErr_SetString(PyExc_AttributeError,
1349 "This object has no __dict__");
1350 return -1;
1351 }
1352 if (value == NULL) {
1353 PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
1354 return -1;
1355 }
1356 if (!PyDict_Check(value)) {
1357 PyErr_Format(PyExc_TypeError,
1358 "__dict__ must be set to a dictionary, "
1359 "not a '%.200s'", Py_TYPE(value)->tp_name);
1360 return -1;
1361 }
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001362 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001363 Py_XSETREF(*dictptr, value);
Benjamin Peterson8eb12692012-02-19 19:59:10 -05001364 return 0;
1365}
1366
Antoine Pitrou1a9a9d52010-08-28 18:17:03 +00001367
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001368/* Test a value used as condition, e.g., in a for or if statement.
1369 Return -1 if an error occurred */
1370
1371int
Fred Drake100814d2000-07-09 15:48:49 +00001372PyObject_IsTrue(PyObject *v)
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 Py_ssize_t res;
1375 if (v == Py_True)
1376 return 1;
1377 if (v == Py_False)
1378 return 0;
1379 if (v == Py_None)
1380 return 0;
1381 else if (v->ob_type->tp_as_number != NULL &&
1382 v->ob_type->tp_as_number->nb_bool != NULL)
1383 res = (*v->ob_type->tp_as_number->nb_bool)(v);
1384 else if (v->ob_type->tp_as_mapping != NULL &&
1385 v->ob_type->tp_as_mapping->mp_length != NULL)
1386 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1387 else if (v->ob_type->tp_as_sequence != NULL &&
1388 v->ob_type->tp_as_sequence->sq_length != NULL)
1389 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1390 else
1391 return 1;
1392 /* if it is negative, it should be either -1 or -2 */
1393 return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
Guido van Rossum6ac258d1993-05-12 08:24:20 +00001394}
1395
Tim Peters803526b2002-07-07 05:13:56 +00001396/* equivalent of 'not v'
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001397 Return -1 if an error occurred */
1398
1399int
Fred Drake100814d2000-07-09 15:48:49 +00001400PyObject_Not(PyObject *v)
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 int res;
1403 res = PyObject_IsTrue(v);
1404 if (res < 0)
1405 return res;
1406 return res == 0;
Guido van Rossumc3d3f961998-04-09 17:53:59 +00001407}
1408
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001409/* Test whether an object can be called */
1410
1411int
Fred Drake100814d2000-07-09 15:48:49 +00001412PyCallable_Check(PyObject *x)
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (x == NULL)
1415 return 0;
1416 return x->ob_type->tp_call != NULL;
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001417}
1418
Tim Peters7eea37e2001-09-04 22:08:56 +00001419
Georg Brandle32b4222007-03-10 22:13:27 +00001420/* Helper for PyObject_Dir without arguments: returns the local scope. */
1421static PyObject *
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001422_dir_locals(void)
Tim Peters305b5852001-09-17 02:38:46 +00001423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 PyObject *names;
Victor Stinner41bb43a2013-10-29 01:19:37 +01001425 PyObject *locals;
Tim Peters305b5852001-09-17 02:38:46 +00001426
Victor Stinner41bb43a2013-10-29 01:19:37 +01001427 locals = PyEval_GetLocals();
1428 if (locals == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 return NULL;
Tim Peters305b5852001-09-17 02:38:46 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 names = PyMapping_Keys(locals);
1432 if (!names)
1433 return NULL;
1434 if (!PyList_Check(names)) {
1435 PyErr_Format(PyExc_TypeError,
1436 "dir(): expected keys() of locals to be a list, "
1437 "not '%.200s'", Py_TYPE(names)->tp_name);
1438 Py_DECREF(names);
1439 return NULL;
1440 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001441 if (PyList_Sort(names)) {
1442 Py_DECREF(names);
1443 return NULL;
1444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 /* the locals don't need to be DECREF'd */
1446 return names;
Georg Brandle32b4222007-03-10 22:13:27 +00001447}
1448
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001449/* Helper for PyObject_Dir: object introspection. */
Georg Brandle32b4222007-03-10 22:13:27 +00001450static PyObject *
1451_dir_object(PyObject *obj)
1452{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001453 PyObject *result, *sorted;
Benjamin Petersonce798522012-01-22 11:24:29 -05001454 PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
Georg Brandle32b4222007-03-10 22:13:27 +00001455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 assert(obj);
1457 if (dirfunc == NULL) {
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001458 if (!PyErr_Occurred())
1459 PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
1460 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 }
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001462 /* use __dir__ */
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001463 result = _PyObject_CallNoArg(dirfunc);
Benjamin Peterson82b00c12011-05-24 11:09:06 -05001464 Py_DECREF(dirfunc);
1465 if (result == NULL)
1466 return NULL;
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001467 /* return sorted(result) */
1468 sorted = PySequence_List(result);
1469 Py_DECREF(result);
1470 if (sorted == NULL)
1471 return NULL;
1472 if (PyList_Sort(sorted)) {
1473 Py_DECREF(sorted);
1474 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 }
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001476 return sorted;
Georg Brandle32b4222007-03-10 22:13:27 +00001477}
1478
1479/* Implementation of dir() -- if obj is NULL, returns the names in the current
1480 (local) scope. Otherwise, performs introspection of the object: returns a
1481 sorted list of attribute names (supposedly) accessible from the object
1482*/
1483PyObject *
1484PyObject_Dir(PyObject *obj)
1485{
Benjamin Peterson3bbb7222011-06-11 16:12:08 -05001486 return (obj == NULL) ? _dir_locals() : _dir_object(obj);
Tim Peters7eea37e2001-09-04 22:08:56 +00001487}
Guido van Rossum49b11fe1995-01-26 00:38:22 +00001488
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001489/*
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001490None is a non-NULL undefined value.
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001491There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001493*/
1494
Guido van Rossum0c182a11992-03-27 17:26:13 +00001495/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001497none_repr(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 return PyUnicode_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001500}
1501
Barry Warsaw9bf16442001-01-23 16:24:35 +00001502/* ARGUSED */
1503static void
Tim Peters803526b2002-07-07 05:13:56 +00001504none_dealloc(PyObject* ignore)
Barry Warsaw9bf16442001-01-23 16:24:35 +00001505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 /* This should never get called, but we also don't want to SEGV if
1507 * we accidentally decref None out of existence.
1508 */
1509 Py_FatalError("deallocating None");
Barry Warsaw9bf16442001-01-23 16:24:35 +00001510}
1511
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001512static PyObject *
1513none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1514{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001515 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001516 PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
1517 return NULL;
1518 }
1519 Py_RETURN_NONE;
1520}
1521
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001522static int
1523none_bool(PyObject *v)
1524{
1525 return 0;
1526}
1527
1528static PyNumberMethods none_as_number = {
1529 0, /* nb_add */
1530 0, /* nb_subtract */
1531 0, /* nb_multiply */
1532 0, /* nb_remainder */
1533 0, /* nb_divmod */
1534 0, /* nb_power */
1535 0, /* nb_negative */
1536 0, /* nb_positive */
1537 0, /* nb_absolute */
1538 (inquiry)none_bool, /* nb_bool */
1539 0, /* nb_invert */
1540 0, /* nb_lshift */
1541 0, /* nb_rshift */
1542 0, /* nb_and */
1543 0, /* nb_xor */
1544 0, /* nb_or */
1545 0, /* nb_int */
1546 0, /* nb_reserved */
1547 0, /* nb_float */
1548 0, /* nb_inplace_add */
1549 0, /* nb_inplace_subtract */
1550 0, /* nb_inplace_multiply */
1551 0, /* nb_inplace_remainder */
1552 0, /* nb_inplace_power */
1553 0, /* nb_inplace_lshift */
1554 0, /* nb_inplace_rshift */
1555 0, /* nb_inplace_and */
1556 0, /* nb_inplace_xor */
1557 0, /* nb_inplace_or */
1558 0, /* nb_floor_divide */
1559 0, /* nb_true_divide */
1560 0, /* nb_inplace_floor_divide */
1561 0, /* nb_inplace_true_divide */
1562 0, /* nb_index */
1563};
Barry Warsaw9bf16442001-01-23 16:24:35 +00001564
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001565PyTypeObject _PyNone_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1567 "NoneType",
1568 0,
1569 0,
1570 none_dealloc, /*tp_dealloc*/ /*never called*/
1571 0, /*tp_print*/
1572 0, /*tp_getattr*/
1573 0, /*tp_setattr*/
1574 0, /*tp_reserved*/
1575 none_repr, /*tp_repr*/
Raymond Hettinger66d2be82011-07-28 09:55:13 -07001576 &none_as_number, /*tp_as_number*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 0, /*tp_as_sequence*/
1578 0, /*tp_as_mapping*/
1579 0, /*tp_hash */
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001580 0, /*tp_call */
1581 0, /*tp_str */
1582 0, /*tp_getattro */
1583 0, /*tp_setattro */
1584 0, /*tp_as_buffer */
1585 Py_TPFLAGS_DEFAULT, /*tp_flags */
1586 0, /*tp_doc */
1587 0, /*tp_traverse */
1588 0, /*tp_clear */
1589 0, /*tp_richcompare */
1590 0, /*tp_weaklistoffset */
1591 0, /*tp_iter */
1592 0, /*tp_iternext */
1593 0, /*tp_methods */
1594 0, /*tp_members */
1595 0, /*tp_getset */
1596 0, /*tp_base */
1597 0, /*tp_dict */
1598 0, /*tp_descr_get */
1599 0, /*tp_descr_set */
1600 0, /*tp_dictoffset */
1601 0, /*tp_init */
1602 0, /*tp_alloc */
1603 none_new, /*tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001604};
1605
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606PyObject _Py_NoneStruct = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001607 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001608 1, &_PyNone_Type
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001609};
1610
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001611/* NotImplemented is an object that can be used to signal that an
1612 operation is not implemented for the given type combination. */
1613
1614static PyObject *
1615NotImplemented_repr(PyObject *op)
1616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 return PyUnicode_FromString("NotImplemented");
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001618}
1619
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001620static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301621NotImplemented_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001622{
1623 return PyUnicode_FromString("NotImplemented");
1624}
1625
1626static PyMethodDef notimplemented_methods[] = {
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301627 {"__reduce__", NotImplemented_reduce, METH_NOARGS, NULL},
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001628 {NULL, NULL}
1629};
1630
1631static PyObject *
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001632notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1633{
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001634 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001635 PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
1636 return NULL;
1637 }
Brian Curtindfc80e32011-08-10 20:28:54 -05001638 Py_RETURN_NOTIMPLEMENTED;
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001639}
1640
Armin Ronacher226b1db2012-10-06 14:28:58 +02001641static void
1642notimplemented_dealloc(PyObject* ignore)
1643{
1644 /* This should never get called, but we also don't want to SEGV if
1645 * we accidentally decref NotImplemented out of existence.
1646 */
1647 Py_FatalError("deallocating NotImplemented");
1648}
1649
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001650PyTypeObject _PyNotImplemented_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1652 "NotImplementedType",
1653 0,
1654 0,
Armin Ronacher226b1db2012-10-06 14:28:58 +02001655 notimplemented_dealloc, /*tp_dealloc*/ /*never called*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 0, /*tp_print*/
1657 0, /*tp_getattr*/
1658 0, /*tp_setattr*/
1659 0, /*tp_reserved*/
1660 NotImplemented_repr, /*tp_repr*/
1661 0, /*tp_as_number*/
1662 0, /*tp_as_sequence*/
1663 0, /*tp_as_mapping*/
1664 0, /*tp_hash */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001665 0, /*tp_call */
1666 0, /*tp_str */
1667 0, /*tp_getattro */
1668 0, /*tp_setattro */
1669 0, /*tp_as_buffer */
1670 Py_TPFLAGS_DEFAULT, /*tp_flags */
1671 0, /*tp_doc */
1672 0, /*tp_traverse */
1673 0, /*tp_clear */
1674 0, /*tp_richcompare */
1675 0, /*tp_weaklistoffset */
1676 0, /*tp_iter */
1677 0, /*tp_iternext */
Alexandre Vassalottic49477b2013-11-24 02:53:45 -08001678 notimplemented_methods, /*tp_methods */
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001679 0, /*tp_members */
1680 0, /*tp_getset */
1681 0, /*tp_base */
1682 0, /*tp_dict */
1683 0, /*tp_descr_get */
1684 0, /*tp_descr_set */
1685 0, /*tp_dictoffset */
1686 0, /*tp_init */
1687 0, /*tp_alloc */
1688 notimplemented_new, /*tp_new */
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001689};
1690
1691PyObject _Py_NotImplementedStruct = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 _PyObject_EXTRA_INIT
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001693 1, &_PyNotImplemented_Type
Neil Schemenauer5ed85ec2001-01-04 01:48:10 +00001694};
1695
Guido van Rossumba21a492001-08-16 08:17:26 +00001696void
1697_Py_ReadyTypes(void)
1698{
Victor Stinner5a1bb4e2014-06-02 14:10:59 +02001699 if (PyType_Ready(&PyBaseObject_Type) < 0)
1700 Py_FatalError("Can't initialize object type");
1701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 if (PyType_Ready(&PyType_Type) < 0)
1703 Py_FatalError("Can't initialize type type");
Guido van Rossumba21a492001-08-16 08:17:26 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 if (PyType_Ready(&_PyWeakref_RefType) < 0)
1706 Py_FatalError("Can't initialize weakref type");
Fred Drake0a4dd392004-07-02 18:57:45 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 if (PyType_Ready(&_PyWeakref_CallableProxyType) < 0)
1709 Py_FatalError("Can't initialize callable weakref proxy type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (PyType_Ready(&_PyWeakref_ProxyType) < 0)
1712 Py_FatalError("Can't initialize weakref proxy type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001713
Victor Stinner5a1bb4e2014-06-02 14:10:59 +02001714 if (PyType_Ready(&PyLong_Type) < 0)
1715 Py_FatalError("Can't initialize int type");
1716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 if (PyType_Ready(&PyBool_Type) < 0)
1718 Py_FatalError("Can't initialize bool type");
Guido van Rossum77f6a652002-04-03 22:41:51 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 if (PyType_Ready(&PyByteArray_Type) < 0)
1721 Py_FatalError("Can't initialize bytearray type");
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 if (PyType_Ready(&PyBytes_Type) < 0)
1724 Py_FatalError("Can't initialize 'str'");
Guido van Rossumcacfc072002-05-24 19:01:59 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (PyType_Ready(&PyList_Type) < 0)
1727 Py_FatalError("Can't initialize list type");
Guido van Rossumba21a492001-08-16 08:17:26 +00001728
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001729 if (PyType_Ready(&_PyNone_Type) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 Py_FatalError("Can't initialize None type");
Guido van Rossumba21a492001-08-16 08:17:26 +00001731
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08001732 if (PyType_Ready(&_PyNotImplemented_Type) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 Py_FatalError("Can't initialize NotImplemented type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (PyType_Ready(&PyTraceBack_Type) < 0)
1736 Py_FatalError("Can't initialize traceback type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 if (PyType_Ready(&PySuper_Type) < 0)
1739 Py_FatalError("Can't initialize super type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 if (PyType_Ready(&PyRange_Type) < 0)
1742 Py_FatalError("Can't initialize range type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 if (PyType_Ready(&PyDict_Type) < 0)
1745 Py_FatalError("Can't initialize dict type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001746
Benjamin Petersondb87c992016-11-06 13:01:07 -08001747 if (PyType_Ready(&PyDictKeys_Type) < 0)
1748 Py_FatalError("Can't initialize dict keys type");
1749
1750 if (PyType_Ready(&PyDictValues_Type) < 0)
1751 Py_FatalError("Can't initialize dict values type");
1752
1753 if (PyType_Ready(&PyDictItems_Type) < 0)
1754 Py_FatalError("Can't initialize dict items type");
1755
Eric Snow96c6af92015-05-29 22:21:39 -06001756 if (PyType_Ready(&PyODict_Type) < 0)
1757 Py_FatalError("Can't initialize OrderedDict type");
1758
1759 if (PyType_Ready(&PyODictKeys_Type) < 0)
1760 Py_FatalError("Can't initialize odict_keys type");
1761
1762 if (PyType_Ready(&PyODictItems_Type) < 0)
1763 Py_FatalError("Can't initialize odict_items type");
1764
1765 if (PyType_Ready(&PyODictValues_Type) < 0)
1766 Py_FatalError("Can't initialize odict_values type");
1767
1768 if (PyType_Ready(&PyODictIter_Type) < 0)
1769 Py_FatalError("Can't initialize odict_keyiterator type");
1770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 if (PyType_Ready(&PySet_Type) < 0)
1772 Py_FatalError("Can't initialize set type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 if (PyType_Ready(&PyUnicode_Type) < 0)
1775 Py_FatalError("Can't initialize str type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 if (PyType_Ready(&PySlice_Type) < 0)
1778 Py_FatalError("Can't initialize slice type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 if (PyType_Ready(&PyStaticMethod_Type) < 0)
1781 Py_FatalError("Can't initialize static method type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 if (PyType_Ready(&PyComplex_Type) < 0)
1784 Py_FatalError("Can't initialize complex type");
Skip Montanaroba1e0f42009-10-18 14:25:35 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 if (PyType_Ready(&PyFloat_Type) < 0)
1787 Py_FatalError("Can't initialize float type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 if (PyType_Ready(&PyFrozenSet_Type) < 0)
1790 Py_FatalError("Can't initialize frozenset type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 if (PyType_Ready(&PyProperty_Type) < 0)
1793 Py_FatalError("Can't initialize property type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001794
Stefan Krah9a2d99e2012-02-25 12:24:21 +01001795 if (PyType_Ready(&_PyManagedBuffer_Type) < 0)
1796 Py_FatalError("Can't initialize managed buffer type");
1797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 if (PyType_Ready(&PyMemoryView_Type) < 0)
1799 Py_FatalError("Can't initialize memoryview type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 if (PyType_Ready(&PyTuple_Type) < 0)
1802 Py_FatalError("Can't initialize tuple type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 if (PyType_Ready(&PyEnum_Type) < 0)
1805 Py_FatalError("Can't initialize enumerate type");
Benjamin Petersonae937c02009-04-18 20:54:08 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (PyType_Ready(&PyReversed_Type) < 0)
1808 Py_FatalError("Can't initialize reversed type");
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (PyType_Ready(&PyStdPrinter_Type) < 0)
1811 Py_FatalError("Can't initialize StdPrinter");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (PyType_Ready(&PyCode_Type) < 0)
1814 Py_FatalError("Can't initialize code type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 if (PyType_Ready(&PyFrame_Type) < 0)
1817 Py_FatalError("Can't initialize frame type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 if (PyType_Ready(&PyCFunction_Type) < 0)
1820 Py_FatalError("Can't initialize builtin function type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (PyType_Ready(&PyMethod_Type) < 0)
1823 Py_FatalError("Can't initialize method type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 if (PyType_Ready(&PyFunction_Type) < 0)
1826 Py_FatalError("Can't initialize function type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 if (PyType_Ready(&PyDictProxy_Type) < 0)
1829 Py_FatalError("Can't initialize dict proxy type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 if (PyType_Ready(&PyGen_Type) < 0)
1832 Py_FatalError("Can't initialize generator type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 if (PyType_Ready(&PyGetSetDescr_Type) < 0)
1835 Py_FatalError("Can't initialize get-set descriptor type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (PyType_Ready(&PyWrapperDescr_Type) < 0)
1838 Py_FatalError("Can't initialize wrapper type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001839
Benjamin Petersoneff61f62011-09-01 16:32:31 -04001840 if (PyType_Ready(&_PyMethodWrapper_Type) < 0)
1841 Py_FatalError("Can't initialize method wrapper type");
1842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 if (PyType_Ready(&PyEllipsis_Type) < 0)
1844 Py_FatalError("Can't initialize ellipsis type");
Benjamin Petersonfd838e62009-04-20 02:09:13 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 if (PyType_Ready(&PyMemberDescr_Type) < 0)
1847 Py_FatalError("Can't initialize member descriptor type");
Benjamin Peterson8bc5b682009-05-09 18:10:51 +00001848
Barry Warsaw409da152012-06-03 16:18:47 -04001849 if (PyType_Ready(&_PyNamespace_Type) < 0)
1850 Py_FatalError("Can't initialize namespace type");
Benjamin Petersone8ea97f2012-10-30 23:27:52 -04001851
Benjamin Petersonc4311282012-10-30 23:21:10 -04001852 if (PyType_Ready(&PyCapsule_Type) < 0)
1853 Py_FatalError("Can't initialize capsule type");
1854
1855 if (PyType_Ready(&PyLongRangeIter_Type) < 0)
1856 Py_FatalError("Can't initialize long range iterator type");
1857
1858 if (PyType_Ready(&PyCell_Type) < 0)
1859 Py_FatalError("Can't initialize cell type");
1860
1861 if (PyType_Ready(&PyInstanceMethod_Type) < 0)
1862 Py_FatalError("Can't initialize instance method type");
1863
1864 if (PyType_Ready(&PyClassMethodDescr_Type) < 0)
1865 Py_FatalError("Can't initialize class method descr type");
1866
1867 if (PyType_Ready(&PyMethodDescr_Type) < 0)
1868 Py_FatalError("Can't initialize method descr type");
1869
1870 if (PyType_Ready(&PyCallIter_Type) < 0)
1871 Py_FatalError("Can't initialize call iter type");
1872
1873 if (PyType_Ready(&PySeqIter_Type) < 0)
1874 Py_FatalError("Can't initialize sequence iterator type");
Yury Selivanov5376ba92015-06-22 12:19:30 -04001875
1876 if (PyType_Ready(&PyCoro_Type) < 0)
1877 Py_FatalError("Can't initialize coroutine type");
1878
1879 if (PyType_Ready(&_PyCoroWrapper_Type) < 0)
1880 Py_FatalError("Can't initialize coroutine wrapper type");
Guido van Rossumba21a492001-08-16 08:17:26 +00001881}
1882
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001883
Guido van Rossum84a90321996-05-22 16:34:47 +00001884#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001885
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001886void
Fred Drake100814d2000-07-09 15:48:49 +00001887_Py_NewReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 _Py_INC_REFTOTAL;
1890 op->ob_refcnt = 1;
1891 _Py_AddToAllObjects(op, 1);
1892 _Py_INC_TPALLOCS(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001893}
1894
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001895void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001896_Py_ForgetReference(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001897{
Guido van Rossumbffd6832000-01-20 22:32:56 +00001898#ifdef SLOW_UNREF_CHECK
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001899 PyObject *p;
Guido van Rossumbffd6832000-01-20 22:32:56 +00001900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 if (op->ob_refcnt < 0)
1902 Py_FatalError("UNREF negative refcnt");
1903 if (op == &refchain ||
1904 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) {
1905 fprintf(stderr, "* ob\n");
1906 _PyObject_Dump(op);
1907 fprintf(stderr, "* op->_ob_prev->_ob_next\n");
1908 _PyObject_Dump(op->_ob_prev->_ob_next);
1909 fprintf(stderr, "* op->_ob_next->_ob_prev\n");
1910 _PyObject_Dump(op->_ob_next->_ob_prev);
1911 Py_FatalError("UNREF invalid object");
1912 }
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001913#ifdef SLOW_UNREF_CHECK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
1915 if (p == op)
1916 break;
1917 }
1918 if (p == &refchain) /* Not found */
1919 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +00001920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 op->_ob_next->_ob_prev = op->_ob_prev;
1922 op->_ob_prev->_ob_next = op->_ob_next;
1923 op->_ob_next = op->_ob_prev = NULL;
1924 _Py_INC_TPFREES(op);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925}
1926
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001927void
Fred Drake100814d2000-07-09 15:48:49 +00001928_Py_Dealloc(PyObject *op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 destructor dealloc = Py_TYPE(op)->tp_dealloc;
1931 _Py_ForgetReference(op);
1932 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001933}
1934
Tim Peters269b2a62003-04-17 19:52:29 +00001935/* Print all live objects. Because PyObject_Print is called, the
1936 * interpreter must be in a healthy state.
1937 */
Guido van Rossumaacdc9d1996-08-12 21:32:12 +00001938void
Fred Drake100814d2000-07-09 15:48:49 +00001939_Py_PrintReferences(FILE *fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 PyObject *op;
1942 fprintf(fp, "Remaining objects:\n");
1943 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
1944 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", op, op->ob_refcnt);
1945 if (PyObject_Print(op, fp, 0) != 0)
1946 PyErr_Clear();
1947 putc('\n', fp);
1948 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001949}
1950
Tim Peters269b2a62003-04-17 19:52:29 +00001951/* Print the addresses of all live objects. Unlike _Py_PrintReferences, this
1952 * doesn't make any calls to the Python C API, so is always safe to call.
1953 */
1954void
1955_Py_PrintReferenceAddresses(FILE *fp)
1956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 PyObject *op;
1958 fprintf(fp, "Remaining object addresses:\n");
1959 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
1960 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", op,
1961 op->ob_refcnt, Py_TYPE(op)->tp_name);
Tim Peters269b2a62003-04-17 19:52:29 +00001962}
1963
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001964PyObject *
Fred Drake100814d2000-07-09 15:48:49 +00001965_Py_GetObjects(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 int i, n;
1968 PyObject *t = NULL;
1969 PyObject *res, *op;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
1972 return NULL;
1973 op = refchain._ob_next;
1974 res = PyList_New(0);
1975 if (res == NULL)
1976 return NULL;
1977 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
1978 while (op == self || op == args || op == res || op == t ||
1979 (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) {
1980 op = op->_ob_next;
1981 if (op == &refchain)
1982 return res;
1983 }
1984 if (PyList_Append(res, op) < 0) {
1985 Py_DECREF(res);
1986 return NULL;
1987 }
1988 op = op->_ob_next;
1989 }
1990 return res;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001991}
1992
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001993#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +00001994
Benjamin Petersonb173f782009-05-05 22:31:58 +00001995
Guido van Rossum84a90321996-05-22 16:34:47 +00001996/* Hack to force loading of abstract.o */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001997Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
Guido van Rossume09fb551997-08-05 02:04:34 +00001998
1999
David Malcolm49526f42012-06-22 14:55:41 -04002000void
2001_PyObject_DebugTypeStats(FILE *out)
2002{
2003 _PyCFunction_DebugMallocStats(out);
2004 _PyDict_DebugMallocStats(out);
2005 _PyFloat_DebugMallocStats(out);
2006 _PyFrame_DebugMallocStats(out);
2007 _PyList_DebugMallocStats(out);
2008 _PyMethod_DebugMallocStats(out);
David Malcolm49526f42012-06-22 14:55:41 -04002009 _PyTuple_DebugMallocStats(out);
2010}
Guido van Rossumb18618d2000-05-03 23:44:39 +00002011
Guido van Rossum86610361998-04-10 22:32:46 +00002012/* These methods are used to control infinite recursion in repr, str, print,
2013 etc. Container objects that may recursively contain themselves,
Martin Panter8d56c022016-05-29 04:13:35 +00002014 e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
Guido van Rossum86610361998-04-10 22:32:46 +00002015 Py_ReprLeave() to avoid infinite recursion.
2016
2017 Py_ReprEnter() returns 0 the first time it is called for a particular
2018 object and 1 every time thereafter. It returns -1 if an exception
2019 occurred. Py_ReprLeave() has no return value.
2020
2021 See dictobject.c and listobject.c for examples of use.
2022*/
2023
Guido van Rossum86610361998-04-10 22:32:46 +00002024int
Fred Drake100814d2000-07-09 15:48:49 +00002025Py_ReprEnter(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00002026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 PyObject *dict;
2028 PyObject *list;
2029 Py_ssize_t i;
Guido van Rossum86610361998-04-10 22:32:46 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 dict = PyThreadState_GetDict();
Antoine Pitrou04d17d32014-03-31 22:04:38 +02002032 /* Ignore a missing thread-state, so that this function can be called
2033 early on startup. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (dict == NULL)
2035 return 0;
Victor Stinner7a07e452013-11-06 18:57:29 +01002036 list = _PyDict_GetItemId(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 if (list == NULL) {
2038 list = PyList_New(0);
2039 if (list == NULL)
2040 return -1;
Victor Stinner7a07e452013-11-06 18:57:29 +01002041 if (_PyDict_SetItemId(dict, &PyId_Py_Repr, list) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return -1;
2043 Py_DECREF(list);
2044 }
2045 i = PyList_GET_SIZE(list);
2046 while (--i >= 0) {
2047 if (PyList_GET_ITEM(list, i) == obj)
2048 return 1;
2049 }
Victor Stinnere901d1f2013-07-17 21:58:41 +02002050 if (PyList_Append(list, obj) < 0)
2051 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 return 0;
Guido van Rossum86610361998-04-10 22:32:46 +00002053}
2054
2055void
Fred Drake100814d2000-07-09 15:48:49 +00002056Py_ReprLeave(PyObject *obj)
Guido van Rossum86610361998-04-10 22:32:46 +00002057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 PyObject *dict;
2059 PyObject *list;
2060 Py_ssize_t i;
Victor Stinner1b634932013-07-16 22:24:44 +02002061 PyObject *error_type, *error_value, *error_traceback;
2062
2063 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 dict = PyThreadState_GetDict();
2066 if (dict == NULL)
Victor Stinner1b634932013-07-16 22:24:44 +02002067 goto finally;
2068
Victor Stinner7a07e452013-11-06 18:57:29 +01002069 list = _PyDict_GetItemId(dict, &PyId_Py_Repr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 if (list == NULL || !PyList_Check(list))
Victor Stinner1b634932013-07-16 22:24:44 +02002071 goto finally;
2072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 i = PyList_GET_SIZE(list);
2074 /* Count backwards because we always expect obj to be list[-1] */
2075 while (--i >= 0) {
2076 if (PyList_GET_ITEM(list, i) == obj) {
2077 PyList_SetSlice(list, i, i + 1, NULL);
2078 break;
2079 }
2080 }
Victor Stinner1b634932013-07-16 22:24:44 +02002081
2082finally:
2083 /* ignore exceptions because there is no way to report them. */
2084 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum86610361998-04-10 22:32:46 +00002085}
Guido van Rossumd724b232000-03-13 16:01:29 +00002086
Tim Peters803526b2002-07-07 05:13:56 +00002087/* Trashcan support. */
Guido van Rossumd724b232000-03-13 16:01:29 +00002088
Tim Peters803526b2002-07-07 05:13:56 +00002089/* Add op to the _PyTrash_delete_later list. Called when the current
2090 * call-stack depth gets large. op must be a currently untracked gc'ed
2091 * object, with refcount 0. Py_DECREF must already have been called on it.
2092 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002093void
Fred Drake100814d2000-07-09 15:48:49 +00002094_PyTrash_deposit_object(PyObject *op)
Guido van Rossumd724b232000-03-13 16:01:29 +00002095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 assert(PyObject_IS_GC(op));
INADA Naokid8521422018-05-17 11:07:21 +09002097 assert(!_PyObject_GC_IS_TRACKED(op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 assert(op->ob_refcnt == 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002099 _PyGCHead_SET_PREV(_Py_AS_GC(op), _PyRuntime.gc.trash_delete_later);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002100 _PyRuntime.gc.trash_delete_later = op;
Guido van Rossumd724b232000-03-13 16:01:29 +00002101}
2102
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002103/* The equivalent API, using per-thread state recursion info */
2104void
2105_PyTrash_thread_deposit_object(PyObject *op)
2106{
2107 PyThreadState *tstate = PyThreadState_GET();
2108 assert(PyObject_IS_GC(op));
INADA Naokid8521422018-05-17 11:07:21 +09002109 assert(!_PyObject_GC_IS_TRACKED(op));
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002110 assert(op->ob_refcnt == 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002111 _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002112 tstate->trash_delete_later = op;
2113}
2114
Tim Peters803526b2002-07-07 05:13:56 +00002115/* Dealloccate all the objects in the _PyTrash_delete_later list. Called when
2116 * the call-stack unwinds again.
2117 */
Guido van Rossumd724b232000-03-13 16:01:29 +00002118void
Fred Drake100814d2000-07-09 15:48:49 +00002119_PyTrash_destroy_chain(void)
Guido van Rossumd724b232000-03-13 16:01:29 +00002120{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002121 while (_PyRuntime.gc.trash_delete_later) {
2122 PyObject *op = _PyRuntime.gc.trash_delete_later;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 destructor dealloc = Py_TYPE(op)->tp_dealloc;
Neil Schemenauerf589c052002-03-29 03:05:54 +00002124
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002125 _PyRuntime.gc.trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002126 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Neil Schemenauerf589c052002-03-29 03:05:54 +00002127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 /* Call the deallocator directly. This used to try to
2129 * fool Py_DECREF into calling it indirectly, but
2130 * Py_DECREF was already called on this object, and in
2131 * assorted non-release builds calling Py_DECREF again ends
2132 * up distorting allocation statistics.
2133 */
2134 assert(op->ob_refcnt == 0);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002135 ++_PyRuntime.gc.trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 (*dealloc)(op);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002137 --_PyRuntime.gc.trash_delete_nesting;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 }
Guido van Rossumd724b232000-03-13 16:01:29 +00002139}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002141/* The equivalent API, using per-thread state recursion info */
2142void
2143_PyTrash_thread_destroy_chain(void)
2144{
2145 PyThreadState *tstate = PyThreadState_GET();
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002146 /* We need to increase trash_delete_nesting here, otherwise,
2147 _PyTrash_thread_destroy_chain will be called recursively
2148 and then possibly crash. An example that may crash without
2149 increase:
2150 N = 500000 # need to be large enough
2151 ob = object()
2152 tups = [(ob,) for i in range(N)]
2153 for i in range(49):
2154 tups = [(tup,) for tup in tups]
2155 del tups
2156 */
2157 assert(tstate->trash_delete_nesting == 0);
2158 ++tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002159 while (tstate->trash_delete_later) {
2160 PyObject *op = tstate->trash_delete_later;
2161 destructor dealloc = Py_TYPE(op)->tp_dealloc;
2162
2163 tstate->trash_delete_later =
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002164 (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002165
2166 /* Call the deallocator directly. This used to try to
2167 * fool Py_DECREF into calling it indirectly, but
2168 * Py_DECREF was already called on this object, and in
2169 * assorted non-release builds calling Py_DECREF again ends
2170 * up distorting allocation statistics.
2171 */
2172 assert(op->ob_refcnt == 0);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002173 (*dealloc)(op);
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002174 assert(tstate->trash_delete_nesting == 1);
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002175 }
Xiang Zhanga66f9c62017-05-13 13:36:14 +08002176 --tstate->trash_delete_nesting;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +02002177}
2178
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002179#ifndef Py_TRACE_REFS
2180/* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
2181 Define this here, so we can undefine the macro. */
2182#undef _Py_Dealloc
2183PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
2184void
2185_Py_Dealloc(PyObject *op)
2186{
2187 _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA
2188 (*Py_TYPE(op)->tp_dealloc)(op);
2189}
2190#endif
2191
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002192#ifdef __cplusplus
2193}
2194#endif