xref: /third_party/python/Objects/object.c (revision 7db96d56)
1
2/* Generic object operations; and implementation of None */
3
4#include "Python.h"
5#include "pycore_call.h"          // _PyObject_CallNoArgs()
6#include "pycore_ceval.h"         // _Py_EnterRecursiveCallTstate()
7#include "pycore_context.h"       // _PyContextTokenMissing_Type
8#include "pycore_dict.h"          // _PyObject_MakeDictFromInstanceAttributes()
9#include "pycore_floatobject.h"   // _PyFloat_DebugMallocStats()
10#include "pycore_initconfig.h"    // _PyStatus_EXCEPTION()
11#include "pycore_namespace.h"     // _PyNamespace_Type
12#include "pycore_object.h"        // _PyType_CheckConsistency(), _Py_FatalRefcountError()
13#include "pycore_pyerrors.h"      // _PyErr_Occurred()
14#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
15#include "pycore_pystate.h"       // _PyThreadState_GET()
16#include "pycore_symtable.h"      // PySTEntry_Type
17#include "pycore_typeobject.h"    // _PyTypes_InitSlotDefs()
18#include "pycore_unionobject.h"   // _PyUnion_Type
19#include "pycore_interpreteridobject.h"  // _PyInterpreterID_Type
20
21#ifdef Py_LIMITED_API
22   // Prevent recursive call _Py_IncRef() <=> Py_INCREF()
23#  error "Py_LIMITED_API macro must not be defined"
24#endif
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/* Defined in tracemalloc.c */
31extern void _PyMem_DumpTraceback(int fd, const void *ptr);
32
33
34int
35_PyObject_CheckConsistency(PyObject *op, int check_content)
36{
37#define CHECK(expr) \
38    do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
39
40    CHECK(!_PyObject_IsFreed(op));
41    CHECK(Py_REFCNT(op) >= 1);
42
43    _PyType_CheckConsistency(Py_TYPE(op));
44
45    if (PyUnicode_Check(op)) {
46        _PyUnicode_CheckConsistency(op, check_content);
47    }
48    else if (PyDict_Check(op)) {
49        _PyDict_CheckConsistency(op, check_content);
50    }
51    return 1;
52
53#undef CHECK
54}
55
56
57#ifdef Py_REF_DEBUG
58Py_ssize_t _Py_RefTotal;
59
60Py_ssize_t
61_Py_GetRefTotal(void)
62{
63    return _Py_RefTotal;
64}
65
66void
67_PyDebug_PrintTotalRefs(void) {
68    fprintf(stderr,
69            "[%zd refs, %zd blocks]\n",
70            _Py_GetRefTotal(), _Py_GetAllocatedBlocks());
71}
72#endif /* Py_REF_DEBUG */
73
74/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
75   These are used by the individual routines for object creation.
76   Do not call them otherwise, they do not initialize the object! */
77
78#ifdef Py_TRACE_REFS
79/* Head of circular doubly-linked list of all objects.  These are linked
80 * together via the _ob_prev and _ob_next members of a PyObject, which
81 * exist only in a Py_TRACE_REFS build.
82 */
83static PyObject refchain = {&refchain, &refchain};
84
85/* Insert op at the front of the list of all objects.  If force is true,
86 * op is added even if _ob_prev and _ob_next are non-NULL already.  If
87 * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
88 * force should be true if and only if op points to freshly allocated,
89 * uninitialized memory, or you've unlinked op from the list and are
90 * relinking it into the front.
91 * Note that objects are normally added to the list via _Py_NewReference,
92 * which is called by PyObject_Init.  Not all objects are initialized that
93 * way, though; exceptions include statically allocated type objects, and
94 * statically allocated singletons (like Py_True and Py_None).
95 */
96void
97_Py_AddToAllObjects(PyObject *op, int force)
98{
99#ifdef  Py_DEBUG
100    if (!force) {
101        /* If it's initialized memory, op must be in or out of
102         * the list unambiguously.
103         */
104        _PyObject_ASSERT(op, (op->_ob_prev == NULL) == (op->_ob_next == NULL));
105    }
106#endif
107    if (force || op->_ob_prev == NULL) {
108        op->_ob_next = refchain._ob_next;
109        op->_ob_prev = &refchain;
110        refchain._ob_next->_ob_prev = op;
111        refchain._ob_next = op;
112    }
113}
114#endif  /* Py_TRACE_REFS */
115
116#ifdef Py_REF_DEBUG
117/* Log a fatal error; doesn't return. */
118void
119_Py_NegativeRefcount(const char *filename, int lineno, PyObject *op)
120{
121    _PyObject_AssertFailed(op, NULL, "object has negative ref count",
122                           filename, lineno, __func__);
123}
124
125#endif /* Py_REF_DEBUG */
126
127void
128Py_IncRef(PyObject *o)
129{
130    Py_XINCREF(o);
131}
132
133void
134Py_DecRef(PyObject *o)
135{
136    Py_XDECREF(o);
137}
138
139void
140_Py_IncRef(PyObject *o)
141{
142    Py_INCREF(o);
143}
144
145void
146_Py_DecRef(PyObject *o)
147{
148    Py_DECREF(o);
149}
150
151PyObject *
152PyObject_Init(PyObject *op, PyTypeObject *tp)
153{
154    if (op == NULL) {
155        return PyErr_NoMemory();
156    }
157
158    _PyObject_Init(op, tp);
159    return op;
160}
161
162PyVarObject *
163PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
164{
165    if (op == NULL) {
166        return (PyVarObject *) PyErr_NoMemory();
167    }
168
169    _PyObject_InitVar(op, tp, size);
170    return op;
171}
172
173PyObject *
174_PyObject_New(PyTypeObject *tp)
175{
176    PyObject *op = (PyObject *) PyObject_Malloc(_PyObject_SIZE(tp));
177    if (op == NULL) {
178        return PyErr_NoMemory();
179    }
180    _PyObject_Init(op, tp);
181    return op;
182}
183
184PyVarObject *
185_PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
186{
187    PyVarObject *op;
188    const size_t size = _PyObject_VAR_SIZE(tp, nitems);
189    op = (PyVarObject *) PyObject_Malloc(size);
190    if (op == NULL) {
191        return (PyVarObject *)PyErr_NoMemory();
192    }
193    _PyObject_InitVar(op, tp, nitems);
194    return op;
195}
196
197void
198PyObject_CallFinalizer(PyObject *self)
199{
200    PyTypeObject *tp = Py_TYPE(self);
201
202    if (tp->tp_finalize == NULL)
203        return;
204    /* tp_finalize should only be called once. */
205    if (_PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
206        return;
207
208    tp->tp_finalize(self);
209    if (_PyType_IS_GC(tp)) {
210        _PyGC_SET_FINALIZED(self);
211    }
212}
213
214int
215PyObject_CallFinalizerFromDealloc(PyObject *self)
216{
217    if (Py_REFCNT(self) != 0) {
218        _PyObject_ASSERT_FAILED_MSG(self,
219                                    "PyObject_CallFinalizerFromDealloc called "
220                                    "on object with a non-zero refcount");
221    }
222
223    /* Temporarily resurrect the object. */
224    Py_SET_REFCNT(self, 1);
225
226    PyObject_CallFinalizer(self);
227
228    _PyObject_ASSERT_WITH_MSG(self,
229                              Py_REFCNT(self) > 0,
230                              "refcount is too small");
231
232    /* Undo the temporary resurrection; can't use DECREF here, it would
233     * cause a recursive call. */
234    Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
235    if (Py_REFCNT(self) == 0) {
236        return 0;         /* this is the normal path out */
237    }
238
239    /* tp_finalize resurrected it!  Make it look like the original Py_DECREF
240     * never happened. */
241    Py_ssize_t refcnt = Py_REFCNT(self);
242    _Py_NewReference(self);
243    Py_SET_REFCNT(self, refcnt);
244
245    _PyObject_ASSERT(self,
246                     (!_PyType_IS_GC(Py_TYPE(self))
247                      || _PyObject_GC_IS_TRACKED(self)));
248    /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
249       _Py_RefTotal, so we need to undo that. */
250#ifdef Py_REF_DEBUG
251    _Py_RefTotal--;
252#endif
253    return -1;
254}
255
256int
257PyObject_Print(PyObject *op, FILE *fp, int flags)
258{
259    int ret = 0;
260    if (PyErr_CheckSignals())
261        return -1;
262#ifdef USE_STACKCHECK
263    if (PyOS_CheckStack()) {
264        PyErr_SetString(PyExc_MemoryError, "stack overflow");
265        return -1;
266    }
267#endif
268    clearerr(fp); /* Clear any previous error condition */
269    if (op == NULL) {
270        Py_BEGIN_ALLOW_THREADS
271        fprintf(fp, "<nil>");
272        Py_END_ALLOW_THREADS
273    }
274    else {
275        if (Py_REFCNT(op) <= 0) {
276            /* XXX(twouters) cast refcount to long until %zd is
277               universally available */
278            Py_BEGIN_ALLOW_THREADS
279            fprintf(fp, "<refcnt %ld at %p>",
280                (long)Py_REFCNT(op), (void *)op);
281            Py_END_ALLOW_THREADS
282        }
283        else {
284            PyObject *s;
285            if (flags & Py_PRINT_RAW)
286                s = PyObject_Str(op);
287            else
288                s = PyObject_Repr(op);
289            if (s == NULL)
290                ret = -1;
291            else if (PyBytes_Check(s)) {
292                fwrite(PyBytes_AS_STRING(s), 1,
293                       PyBytes_GET_SIZE(s), fp);
294            }
295            else if (PyUnicode_Check(s)) {
296                PyObject *t;
297                t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
298                if (t == NULL) {
299                    ret = -1;
300                }
301                else {
302                    fwrite(PyBytes_AS_STRING(t), 1,
303                           PyBytes_GET_SIZE(t), fp);
304                    Py_DECREF(t);
305                }
306            }
307            else {
308                PyErr_Format(PyExc_TypeError,
309                             "str() or repr() returned '%.100s'",
310                             Py_TYPE(s)->tp_name);
311                ret = -1;
312            }
313            Py_XDECREF(s);
314        }
315    }
316    if (ret == 0) {
317        if (ferror(fp)) {
318            PyErr_SetFromErrno(PyExc_OSError);
319            clearerr(fp);
320            ret = -1;
321        }
322    }
323    return ret;
324}
325
326/* For debugging convenience.  Set a breakpoint here and call it from your DLL */
327void
328_Py_BreakPoint(void)
329{
330}
331
332
333/* Heuristic checking if the object memory is uninitialized or deallocated.
334   Rely on the debug hooks on Python memory allocators:
335   see _PyMem_IsPtrFreed().
336
337   The function can be used to prevent segmentation fault on dereferencing
338   pointers like 0xDDDDDDDDDDDDDDDD. */
339int
340_PyObject_IsFreed(PyObject *op)
341{
342    if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) {
343        return 1;
344    }
345    /* ignore op->ob_ref: its value can have be modified
346       by Py_INCREF() and Py_DECREF(). */
347#ifdef Py_TRACE_REFS
348    if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) {
349        return 1;
350    }
351    if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) {
352         return 1;
353     }
354#endif
355    return 0;
356}
357
358
359/* For debugging convenience.  See Misc/gdbinit for some useful gdb hooks */
360void
361_PyObject_Dump(PyObject* op)
362{
363    if (_PyObject_IsFreed(op)) {
364        /* It seems like the object memory has been freed:
365           don't access it to prevent a segmentation fault. */
366        fprintf(stderr, "<object at %p is freed>\n", op);
367        fflush(stderr);
368        return;
369    }
370
371    /* first, write fields which are the least likely to crash */
372    fprintf(stderr, "object address  : %p\n", (void *)op);
373    /* XXX(twouters) cast refcount to long until %zd is
374       universally available */
375    fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op));
376    fflush(stderr);
377
378    PyTypeObject *type = Py_TYPE(op);
379    fprintf(stderr, "object type     : %p\n", type);
380    fprintf(stderr, "object type name: %s\n",
381            type==NULL ? "NULL" : type->tp_name);
382
383    /* the most dangerous part */
384    fprintf(stderr, "object repr     : ");
385    fflush(stderr);
386
387    PyGILState_STATE gil = PyGILState_Ensure();
388    PyObject *error_type, *error_value, *error_traceback;
389    PyErr_Fetch(&error_type, &error_value, &error_traceback);
390
391    (void)PyObject_Print(op, stderr, 0);
392    fflush(stderr);
393
394    PyErr_Restore(error_type, error_value, error_traceback);
395    PyGILState_Release(gil);
396
397    fprintf(stderr, "\n");
398    fflush(stderr);
399}
400
401PyObject *
402PyObject_Repr(PyObject *v)
403{
404    PyObject *res;
405    if (PyErr_CheckSignals())
406        return NULL;
407#ifdef USE_STACKCHECK
408    if (PyOS_CheckStack()) {
409        PyErr_SetString(PyExc_MemoryError, "stack overflow");
410        return NULL;
411    }
412#endif
413    if (v == NULL)
414        return PyUnicode_FromString("<NULL>");
415    if (Py_TYPE(v)->tp_repr == NULL)
416        return PyUnicode_FromFormat("<%s object at %p>",
417                                    Py_TYPE(v)->tp_name, v);
418
419    PyThreadState *tstate = _PyThreadState_GET();
420#ifdef Py_DEBUG
421    /* PyObject_Repr() must not be called with an exception set,
422       because it can clear it (directly or indirectly) and so the
423       caller loses its exception */
424    assert(!_PyErr_Occurred(tstate));
425#endif
426
427    /* It is possible for a type to have a tp_repr representation that loops
428       infinitely. */
429    if (_Py_EnterRecursiveCallTstate(tstate,
430                                     " while getting the repr of an object")) {
431        return NULL;
432    }
433    res = (*Py_TYPE(v)->tp_repr)(v);
434    _Py_LeaveRecursiveCallTstate(tstate);
435
436    if (res == NULL) {
437        return NULL;
438    }
439    if (!PyUnicode_Check(res)) {
440        _PyErr_Format(tstate, PyExc_TypeError,
441                      "__repr__ returned non-string (type %.200s)",
442                      Py_TYPE(res)->tp_name);
443        Py_DECREF(res);
444        return NULL;
445    }
446#ifndef Py_DEBUG
447    if (PyUnicode_READY(res) < 0) {
448        return NULL;
449    }
450#endif
451    return res;
452}
453
454PyObject *
455PyObject_Str(PyObject *v)
456{
457    PyObject *res;
458    if (PyErr_CheckSignals())
459        return NULL;
460#ifdef USE_STACKCHECK
461    if (PyOS_CheckStack()) {
462        PyErr_SetString(PyExc_MemoryError, "stack overflow");
463        return NULL;
464    }
465#endif
466    if (v == NULL)
467        return PyUnicode_FromString("<NULL>");
468    if (PyUnicode_CheckExact(v)) {
469#ifndef Py_DEBUG
470        if (PyUnicode_READY(v) < 0)
471            return NULL;
472#endif
473        Py_INCREF(v);
474        return v;
475    }
476    if (Py_TYPE(v)->tp_str == NULL)
477        return PyObject_Repr(v);
478
479    PyThreadState *tstate = _PyThreadState_GET();
480#ifdef Py_DEBUG
481    /* PyObject_Str() must not be called with an exception set,
482       because it can clear it (directly or indirectly) and so the
483       caller loses its exception */
484    assert(!_PyErr_Occurred(tstate));
485#endif
486
487    /* It is possible for a type to have a tp_str representation that loops
488       infinitely. */
489    if (_Py_EnterRecursiveCallTstate(tstate, " while getting the str of an object")) {
490        return NULL;
491    }
492    res = (*Py_TYPE(v)->tp_str)(v);
493    _Py_LeaveRecursiveCallTstate(tstate);
494
495    if (res == NULL) {
496        return NULL;
497    }
498    if (!PyUnicode_Check(res)) {
499        _PyErr_Format(tstate, PyExc_TypeError,
500                      "__str__ returned non-string (type %.200s)",
501                      Py_TYPE(res)->tp_name);
502        Py_DECREF(res);
503        return NULL;
504    }
505#ifndef Py_DEBUG
506    if (PyUnicode_READY(res) < 0) {
507        return NULL;
508    }
509#endif
510    assert(_PyUnicode_CheckConsistency(res, 1));
511    return res;
512}
513
514PyObject *
515PyObject_ASCII(PyObject *v)
516{
517    PyObject *repr, *ascii, *res;
518
519    repr = PyObject_Repr(v);
520    if (repr == NULL)
521        return NULL;
522
523    if (PyUnicode_IS_ASCII(repr))
524        return repr;
525
526    /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
527    ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
528    Py_DECREF(repr);
529    if (ascii == NULL)
530        return NULL;
531
532    res = PyUnicode_DecodeASCII(
533        PyBytes_AS_STRING(ascii),
534        PyBytes_GET_SIZE(ascii),
535        NULL);
536
537    Py_DECREF(ascii);
538    return res;
539}
540
541PyObject *
542PyObject_Bytes(PyObject *v)
543{
544    PyObject *result, *func;
545
546    if (v == NULL)
547        return PyBytes_FromString("<NULL>");
548
549    if (PyBytes_CheckExact(v)) {
550        Py_INCREF(v);
551        return v;
552    }
553
554    func = _PyObject_LookupSpecial(v, &_Py_ID(__bytes__));
555    if (func != NULL) {
556        result = _PyObject_CallNoArgs(func);
557        Py_DECREF(func);
558        if (result == NULL)
559            return NULL;
560        if (!PyBytes_Check(result)) {
561            PyErr_Format(PyExc_TypeError,
562                         "__bytes__ returned non-bytes (type %.200s)",
563                         Py_TYPE(result)->tp_name);
564            Py_DECREF(result);
565            return NULL;
566        }
567        return result;
568    }
569    else if (PyErr_Occurred())
570        return NULL;
571    return PyBytes_FromObject(v);
572}
573
574
575/*
576def _PyObject_FunctionStr(x):
577    try:
578        qualname = x.__qualname__
579    except AttributeError:
580        return str(x)
581    try:
582        mod = x.__module__
583        if mod is not None and mod != 'builtins':
584            return f"{x.__module__}.{qualname}()"
585    except AttributeError:
586        pass
587    return qualname
588*/
589PyObject *
590_PyObject_FunctionStr(PyObject *x)
591{
592    assert(!PyErr_Occurred());
593    PyObject *qualname;
594    int ret = _PyObject_LookupAttr(x, &_Py_ID(__qualname__), &qualname);
595    if (qualname == NULL) {
596        if (ret < 0) {
597            return NULL;
598        }
599        return PyObject_Str(x);
600    }
601    PyObject *module;
602    PyObject *result = NULL;
603    ret = _PyObject_LookupAttr(x, &_Py_ID(__module__), &module);
604    if (module != NULL && module != Py_None) {
605        ret = PyObject_RichCompareBool(module, &_Py_ID(builtins), Py_NE);
606        if (ret < 0) {
607            // error
608            goto done;
609        }
610        if (ret > 0) {
611            result = PyUnicode_FromFormat("%S.%S()", module, qualname);
612            goto done;
613        }
614    }
615    else if (ret < 0) {
616        goto done;
617    }
618    result = PyUnicode_FromFormat("%S()", qualname);
619done:
620    Py_DECREF(qualname);
621    Py_XDECREF(module);
622    return result;
623}
624
625/* For Python 3.0.1 and later, the old three-way comparison has been
626   completely removed in favour of rich comparisons.  PyObject_Compare() and
627   PyObject_Cmp() are gone, and the builtin cmp function no longer exists.
628   The old tp_compare slot has been renamed to tp_as_async, and should no
629   longer be used.  Use tp_richcompare instead.
630
631   See (*) below for practical amendments.
632
633   tp_richcompare gets called with a first argument of the appropriate type
634   and a second object of an arbitrary type.  We never do any kind of
635   coercion.
636
637   The tp_richcompare slot should return an object, as follows:
638
639    NULL if an exception occurred
640    NotImplemented if the requested comparison is not implemented
641    any other false value if the requested comparison is false
642    any other true value if the requested comparison is true
643
644  The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get
645  NotImplemented.
646
647  (*) Practical amendments:
648
649  - If rich comparison returns NotImplemented, == and != are decided by
650    comparing the object pointer (i.e. falling back to the base object
651    implementation).
652
653*/
654
655/* Map rich comparison operators to their swapped version, e.g. LT <--> GT */
656int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
657
658static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
659
660/* Perform a rich comparison, raising TypeError when the requested comparison
661   operator is not supported. */
662static PyObject *
663do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op)
664{
665    richcmpfunc f;
666    PyObject *res;
667    int checked_reverse_op = 0;
668
669    if (!Py_IS_TYPE(v, Py_TYPE(w)) &&
670        PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) &&
671        (f = Py_TYPE(w)->tp_richcompare) != NULL) {
672        checked_reverse_op = 1;
673        res = (*f)(w, v, _Py_SwappedOp[op]);
674        if (res != Py_NotImplemented)
675            return res;
676        Py_DECREF(res);
677    }
678    if ((f = Py_TYPE(v)->tp_richcompare) != NULL) {
679        res = (*f)(v, w, op);
680        if (res != Py_NotImplemented)
681            return res;
682        Py_DECREF(res);
683    }
684    if (!checked_reverse_op && (f = Py_TYPE(w)->tp_richcompare) != NULL) {
685        res = (*f)(w, v, _Py_SwappedOp[op]);
686        if (res != Py_NotImplemented)
687            return res;
688        Py_DECREF(res);
689    }
690    /* If neither object implements it, provide a sensible default
691       for == and !=, but raise an exception for ordering. */
692    switch (op) {
693    case Py_EQ:
694        res = (v == w) ? Py_True : Py_False;
695        break;
696    case Py_NE:
697        res = (v != w) ? Py_True : Py_False;
698        break;
699    default:
700        _PyErr_Format(tstate, PyExc_TypeError,
701                      "'%s' not supported between instances of '%.100s' and '%.100s'",
702                      opstrings[op],
703                      Py_TYPE(v)->tp_name,
704                      Py_TYPE(w)->tp_name);
705        return NULL;
706    }
707    Py_INCREF(res);
708    return res;
709}
710
711/* Perform a rich comparison with object result.  This wraps do_richcompare()
712   with a check for NULL arguments and a recursion check. */
713
714PyObject *
715PyObject_RichCompare(PyObject *v, PyObject *w, int op)
716{
717    PyThreadState *tstate = _PyThreadState_GET();
718
719    assert(Py_LT <= op && op <= Py_GE);
720    if (v == NULL || w == NULL) {
721        if (!_PyErr_Occurred(tstate)) {
722            PyErr_BadInternalCall();
723        }
724        return NULL;
725    }
726    if (_Py_EnterRecursiveCallTstate(tstate, " in comparison")) {
727        return NULL;
728    }
729    PyObject *res = do_richcompare(tstate, v, w, op);
730    _Py_LeaveRecursiveCallTstate(tstate);
731    return res;
732}
733
734/* Perform a rich comparison with integer result.  This wraps
735   PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */
736int
737PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
738{
739    PyObject *res;
740    int ok;
741
742    /* Quick result when objects are the same.
743       Guarantees that identity implies equality. */
744    if (v == w) {
745        if (op == Py_EQ)
746            return 1;
747        else if (op == Py_NE)
748            return 0;
749    }
750
751    res = PyObject_RichCompare(v, w, op);
752    if (res == NULL)
753        return -1;
754    if (PyBool_Check(res))
755        ok = (res == Py_True);
756    else
757        ok = PyObject_IsTrue(res);
758    Py_DECREF(res);
759    return ok;
760}
761
762Py_hash_t
763PyObject_HashNotImplemented(PyObject *v)
764{
765    PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
766                 Py_TYPE(v)->tp_name);
767    return -1;
768}
769
770Py_hash_t
771PyObject_Hash(PyObject *v)
772{
773    PyTypeObject *tp = Py_TYPE(v);
774    if (tp->tp_hash != NULL)
775        return (*tp->tp_hash)(v);
776    /* To keep to the general practice that inheriting
777     * solely from object in C code should work without
778     * an explicit call to PyType_Ready, we implicitly call
779     * PyType_Ready here and then check the tp_hash slot again
780     */
781    if (tp->tp_dict == NULL) {
782        if (PyType_Ready(tp) < 0)
783            return -1;
784        if (tp->tp_hash != NULL)
785            return (*tp->tp_hash)(v);
786    }
787    /* Otherwise, the object can't be hashed */
788    return PyObject_HashNotImplemented(v);
789}
790
791PyObject *
792PyObject_GetAttrString(PyObject *v, const char *name)
793{
794    PyObject *w, *res;
795
796    if (Py_TYPE(v)->tp_getattr != NULL)
797        return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
798    w = PyUnicode_FromString(name);
799    if (w == NULL)
800        return NULL;
801    res = PyObject_GetAttr(v, w);
802    Py_DECREF(w);
803    return res;
804}
805
806int
807PyObject_HasAttrString(PyObject *v, const char *name)
808{
809    PyObject *res = PyObject_GetAttrString(v, name);
810    if (res != NULL) {
811        Py_DECREF(res);
812        return 1;
813    }
814    PyErr_Clear();
815    return 0;
816}
817
818int
819PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
820{
821    PyObject *s;
822    int res;
823
824    if (Py_TYPE(v)->tp_setattr != NULL)
825        return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
826    s = PyUnicode_InternFromString(name);
827    if (s == NULL)
828        return -1;
829    res = PyObject_SetAttr(v, s, w);
830    Py_XDECREF(s);
831    return res;
832}
833
834int
835_PyObject_IsAbstract(PyObject *obj)
836{
837    int res;
838    PyObject* isabstract;
839
840    if (obj == NULL)
841        return 0;
842
843    res = _PyObject_LookupAttr(obj, &_Py_ID(__isabstractmethod__), &isabstract);
844    if (res > 0) {
845        res = PyObject_IsTrue(isabstract);
846        Py_DECREF(isabstract);
847    }
848    return res;
849}
850
851PyObject *
852_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
853{
854    PyObject *result;
855    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
856    if (!oname)
857        return NULL;
858    result = PyObject_GetAttr(v, oname);
859    return result;
860}
861
862int
863_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
864{
865    int result;
866    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
867    if (!oname)
868        return -1;
869    result = PyObject_SetAttr(v, oname, w);
870    return result;
871}
872
873static inline int
874set_attribute_error_context(PyObject* v, PyObject* name)
875{
876    assert(PyErr_Occurred());
877    if (!PyErr_ExceptionMatches(PyExc_AttributeError)){
878        return 0;
879    }
880    // Intercept AttributeError exceptions and augment them to offer suggestions later.
881    PyObject *type, *value, *traceback;
882    PyErr_Fetch(&type, &value, &traceback);
883    PyErr_NormalizeException(&type, &value, &traceback);
884    // Check if the normalized exception is indeed an AttributeError
885    if (!PyErr_GivenExceptionMatches(value, PyExc_AttributeError)) {
886        goto restore;
887    }
888    PyAttributeErrorObject* the_exc = (PyAttributeErrorObject*) value;
889    // Check if this exception was already augmented
890    if (the_exc->name || the_exc->obj) {
891        goto restore;
892    }
893    // Augment the exception with the name and object
894    if (PyObject_SetAttr(value, &_Py_ID(name), name) ||
895        PyObject_SetAttr(value, &_Py_ID(obj), v)) {
896        return 1;
897    }
898restore:
899    PyErr_Restore(type, value, traceback);
900    return 0;
901}
902
903PyObject *
904PyObject_GetAttr(PyObject *v, PyObject *name)
905{
906    PyTypeObject *tp = Py_TYPE(v);
907    if (!PyUnicode_Check(name)) {
908        PyErr_Format(PyExc_TypeError,
909                     "attribute name must be string, not '%.200s'",
910                     Py_TYPE(name)->tp_name);
911        return NULL;
912    }
913
914    PyObject* result = NULL;
915    if (tp->tp_getattro != NULL) {
916        result = (*tp->tp_getattro)(v, name);
917    }
918    else if (tp->tp_getattr != NULL) {
919        const char *name_str = PyUnicode_AsUTF8(name);
920        if (name_str == NULL) {
921            return NULL;
922        }
923        result = (*tp->tp_getattr)(v, (char *)name_str);
924    }
925    else {
926        PyErr_Format(PyExc_AttributeError,
927                    "'%.50s' object has no attribute '%U'",
928                    tp->tp_name, name);
929    }
930
931    if (result == NULL) {
932        set_attribute_error_context(v, name);
933    }
934    return result;
935}
936
937int
938_PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
939{
940    PyTypeObject *tp = Py_TYPE(v);
941
942    if (!PyUnicode_Check(name)) {
943        PyErr_Format(PyExc_TypeError,
944                     "attribute name must be string, not '%.200s'",
945                     Py_TYPE(name)->tp_name);
946        *result = NULL;
947        return -1;
948    }
949
950    if (tp->tp_getattro == PyObject_GenericGetAttr) {
951        *result = _PyObject_GenericGetAttrWithDict(v, name, NULL, 1);
952        if (*result != NULL) {
953            return 1;
954        }
955        if (PyErr_Occurred()) {
956            return -1;
957        }
958        return 0;
959    }
960    if (tp->tp_getattro != NULL) {
961        *result = (*tp->tp_getattro)(v, name);
962    }
963    else if (tp->tp_getattr != NULL) {
964        const char *name_str = PyUnicode_AsUTF8(name);
965        if (name_str == NULL) {
966            *result = NULL;
967            return -1;
968        }
969        *result = (*tp->tp_getattr)(v, (char *)name_str);
970    }
971    else {
972        *result = NULL;
973        return 0;
974    }
975
976    if (*result != NULL) {
977        return 1;
978    }
979    if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
980        return -1;
981    }
982    PyErr_Clear();
983    return 0;
984}
985
986int
987_PyObject_LookupAttrId(PyObject *v, _Py_Identifier *name, PyObject **result)
988{
989    PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
990    if (!oname) {
991        *result = NULL;
992        return -1;
993    }
994    return  _PyObject_LookupAttr(v, oname, result);
995}
996
997int
998PyObject_HasAttr(PyObject *v, PyObject *name)
999{
1000    PyObject *res;
1001    if (_PyObject_LookupAttr(v, name, &res) < 0) {
1002        PyErr_Clear();
1003        return 0;
1004    }
1005    if (res == NULL) {
1006        return 0;
1007    }
1008    Py_DECREF(res);
1009    return 1;
1010}
1011
1012int
1013PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
1014{
1015    PyTypeObject *tp = Py_TYPE(v);
1016    int err;
1017
1018    if (!PyUnicode_Check(name)) {
1019        PyErr_Format(PyExc_TypeError,
1020                     "attribute name must be string, not '%.200s'",
1021                     Py_TYPE(name)->tp_name);
1022        return -1;
1023    }
1024    Py_INCREF(name);
1025
1026    PyUnicode_InternInPlace(&name);
1027    if (tp->tp_setattro != NULL) {
1028        err = (*tp->tp_setattro)(v, name, value);
1029        Py_DECREF(name);
1030        return err;
1031    }
1032    if (tp->tp_setattr != NULL) {
1033        const char *name_str = PyUnicode_AsUTF8(name);
1034        if (name_str == NULL) {
1035            Py_DECREF(name);
1036            return -1;
1037        }
1038        err = (*tp->tp_setattr)(v, (char *)name_str, value);
1039        Py_DECREF(name);
1040        return err;
1041    }
1042    Py_DECREF(name);
1043    _PyObject_ASSERT(name, Py_REFCNT(name) >= 1);
1044    if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
1045        PyErr_Format(PyExc_TypeError,
1046                     "'%.100s' object has no attributes "
1047                     "(%s .%U)",
1048                     tp->tp_name,
1049                     value==NULL ? "del" : "assign to",
1050                     name);
1051    else
1052        PyErr_Format(PyExc_TypeError,
1053                     "'%.100s' object has only read-only attributes "
1054                     "(%s .%U)",
1055                     tp->tp_name,
1056                     value==NULL ? "del" : "assign to",
1057                     name);
1058    return -1;
1059}
1060
1061PyObject **
1062_PyObject_DictPointer(PyObject *obj)
1063{
1064    Py_ssize_t dictoffset;
1065    PyTypeObject *tp = Py_TYPE(obj);
1066
1067    if (tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
1068        return _PyObject_ManagedDictPointer(obj);
1069    }
1070    dictoffset = tp->tp_dictoffset;
1071    if (dictoffset == 0)
1072        return NULL;
1073    if (dictoffset < 0) {
1074        Py_ssize_t tsize = Py_SIZE(obj);
1075        if (tsize < 0) {
1076            tsize = -tsize;
1077        }
1078        size_t size = _PyObject_VAR_SIZE(tp, tsize);
1079        assert(size <= (size_t)PY_SSIZE_T_MAX);
1080        dictoffset += (Py_ssize_t)size;
1081
1082        _PyObject_ASSERT(obj, dictoffset > 0);
1083        _PyObject_ASSERT(obj, dictoffset % SIZEOF_VOID_P == 0);
1084    }
1085    return (PyObject **) ((char *)obj + dictoffset);
1086}
1087
1088/* Helper to get a pointer to an object's __dict__ slot, if any.
1089 * Creates the dict from inline attributes if necessary.
1090 * Does not set an exception.
1091 *
1092 * Note that the tp_dictoffset docs used to recommend this function,
1093 * so it should be treated as part of the public API.
1094 */
1095PyObject **
1096_PyObject_GetDictPtr(PyObject *obj)
1097{
1098    if ((Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT) == 0) {
1099        return _PyObject_DictPointer(obj);
1100    }
1101    PyObject **dict_ptr = _PyObject_ManagedDictPointer(obj);
1102    PyDictValues **values_ptr = _PyObject_ValuesPointer(obj);
1103    if (*values_ptr == NULL) {
1104        return dict_ptr;
1105    }
1106    assert(*dict_ptr == NULL);
1107    PyObject *dict = _PyObject_MakeDictFromInstanceAttributes(obj, *values_ptr);
1108    if (dict == NULL) {
1109        PyErr_Clear();
1110        return NULL;
1111    }
1112    *values_ptr = NULL;
1113    *dict_ptr = dict;
1114    return dict_ptr;
1115}
1116
1117PyObject *
1118PyObject_SelfIter(PyObject *obj)
1119{
1120    Py_INCREF(obj);
1121    return obj;
1122}
1123
1124/* Helper used when the __next__ method is removed from a type:
1125   tp_iternext is never NULL and can be safely called without checking
1126   on every iteration.
1127 */
1128
1129PyObject *
1130_PyObject_NextNotImplemented(PyObject *self)
1131{
1132    PyErr_Format(PyExc_TypeError,
1133                 "'%.200s' object is not iterable",
1134                 Py_TYPE(self)->tp_name);
1135    return NULL;
1136}
1137
1138
1139/* Specialized version of _PyObject_GenericGetAttrWithDict
1140   specifically for the LOAD_METHOD opcode.
1141
1142   Return 1 if a method is found, 0 if it's a regular attribute
1143   from __dict__ or something returned by using a descriptor
1144   protocol.
1145
1146   `method` will point to the resolved attribute or NULL.  In the
1147   latter case, an error will be set.
1148*/
1149int
1150_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
1151{
1152    int meth_found = 0;
1153
1154    assert(*method == NULL);
1155
1156    PyTypeObject *tp = Py_TYPE(obj);
1157    if (!_PyType_IsReady(tp)) {
1158        if (PyType_Ready(tp) < 0) {
1159            return 0;
1160        }
1161    }
1162
1163    if (tp->tp_getattro != PyObject_GenericGetAttr || !PyUnicode_CheckExact(name)) {
1164        *method = PyObject_GetAttr(obj, name);
1165        return 0;
1166    }
1167
1168    PyObject *descr = _PyType_Lookup(tp, name);
1169    descrgetfunc f = NULL;
1170    if (descr != NULL) {
1171        Py_INCREF(descr);
1172        if (_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
1173            meth_found = 1;
1174        } else {
1175            f = Py_TYPE(descr)->tp_descr_get;
1176            if (f != NULL && PyDescr_IsData(descr)) {
1177                *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1178                Py_DECREF(descr);
1179                return 0;
1180            }
1181        }
1182    }
1183    PyDictValues *values;
1184    if ((tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) &&
1185        (values = *_PyObject_ValuesPointer(obj)))
1186    {
1187        assert(*_PyObject_DictPointer(obj) == NULL);
1188        PyObject *attr = _PyObject_GetInstanceAttribute(obj, values, name);
1189        if (attr != NULL) {
1190            *method = attr;
1191            Py_XDECREF(descr);
1192            return 0;
1193        }
1194    }
1195    else {
1196        PyObject **dictptr = _PyObject_DictPointer(obj);
1197        PyObject *dict;
1198        if (dictptr != NULL && (dict = *dictptr) != NULL) {
1199            Py_INCREF(dict);
1200            PyObject *attr = PyDict_GetItemWithError(dict, name);
1201            if (attr != NULL) {
1202                *method = Py_NewRef(attr);
1203                Py_DECREF(dict);
1204                Py_XDECREF(descr);
1205                return 0;
1206            }
1207            Py_DECREF(dict);
1208
1209            if (PyErr_Occurred()) {
1210                Py_XDECREF(descr);
1211                return 0;
1212            }
1213        }
1214    }
1215
1216    if (meth_found) {
1217        *method = descr;
1218        return 1;
1219    }
1220
1221    if (f != NULL) {
1222        *method = f(descr, obj, (PyObject *)Py_TYPE(obj));
1223        Py_DECREF(descr);
1224        return 0;
1225    }
1226
1227    if (descr != NULL) {
1228        *method = descr;
1229        return 0;
1230    }
1231
1232    PyErr_Format(PyExc_AttributeError,
1233                 "'%.50s' object has no attribute '%U'",
1234                 tp->tp_name, name);
1235
1236    set_attribute_error_context(obj, name);
1237    return 0;
1238}
1239
1240/* Generic GetAttr functions - put these in your tp_[gs]etattro slot. */
1241
1242PyObject *
1243_PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
1244                                 PyObject *dict, int suppress)
1245{
1246    /* Make sure the logic of _PyObject_GetMethod is in sync with
1247       this method.
1248
1249       When suppress=1, this function suppresses AttributeError.
1250    */
1251
1252    PyTypeObject *tp = Py_TYPE(obj);
1253    PyObject *descr = NULL;
1254    PyObject *res = NULL;
1255    descrgetfunc f;
1256    PyObject **dictptr;
1257
1258    if (!PyUnicode_Check(name)){
1259        PyErr_Format(PyExc_TypeError,
1260                     "attribute name must be string, not '%.200s'",
1261                     Py_TYPE(name)->tp_name);
1262        return NULL;
1263    }
1264    Py_INCREF(name);
1265
1266    if (tp->tp_dict == NULL) {
1267        if (PyType_Ready(tp) < 0)
1268            goto done;
1269    }
1270
1271    descr = _PyType_Lookup(tp, name);
1272
1273    f = NULL;
1274    if (descr != NULL) {
1275        Py_INCREF(descr);
1276        f = Py_TYPE(descr)->tp_descr_get;
1277        if (f != NULL && PyDescr_IsData(descr)) {
1278            res = f(descr, obj, (PyObject *)Py_TYPE(obj));
1279            if (res == NULL && suppress &&
1280                    PyErr_ExceptionMatches(PyExc_AttributeError)) {
1281                PyErr_Clear();
1282            }
1283            goto done;
1284        }
1285    }
1286    if (dict == NULL) {
1287        if ((tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) &&
1288            *_PyObject_ValuesPointer(obj))
1289        {
1290            PyDictValues **values_ptr = _PyObject_ValuesPointer(obj);
1291            if (PyUnicode_CheckExact(name)) {
1292                assert(*_PyObject_DictPointer(obj) == NULL);
1293                res = _PyObject_GetInstanceAttribute(obj, *values_ptr, name);
1294                if (res != NULL) {
1295                    goto done;
1296                }
1297            }
1298            else {
1299                dictptr = _PyObject_DictPointer(obj);
1300                assert(dictptr != NULL && *dictptr == NULL);
1301                *dictptr = dict = _PyObject_MakeDictFromInstanceAttributes(obj, *values_ptr);
1302                if (dict == NULL) {
1303                    res = NULL;
1304                    goto done;
1305                }
1306                *values_ptr = NULL;
1307            }
1308        }
1309        else {
1310            dictptr = _PyObject_DictPointer(obj);
1311            if (dictptr) {
1312                dict = *dictptr;
1313            }
1314        }
1315    }
1316    if (dict != NULL) {
1317        Py_INCREF(dict);
1318        res = PyDict_GetItemWithError(dict, name);
1319        if (res != NULL) {
1320            Py_INCREF(res);
1321            Py_DECREF(dict);
1322            goto done;
1323        }
1324        else {
1325            Py_DECREF(dict);
1326            if (PyErr_Occurred()) {
1327                if (suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1328                    PyErr_Clear();
1329                }
1330                else {
1331                    goto done;
1332                }
1333            }
1334        }
1335    }
1336
1337    if (f != NULL) {
1338        res = f(descr, obj, (PyObject *)Py_TYPE(obj));
1339        if (res == NULL && suppress &&
1340                PyErr_ExceptionMatches(PyExc_AttributeError)) {
1341            PyErr_Clear();
1342        }
1343        goto done;
1344    }
1345
1346    if (descr != NULL) {
1347        res = descr;
1348        descr = NULL;
1349        goto done;
1350    }
1351
1352    if (!suppress) {
1353        PyErr_Format(PyExc_AttributeError,
1354                     "'%.50s' object has no attribute '%U'",
1355                     tp->tp_name, name);
1356
1357        set_attribute_error_context(obj, name);
1358    }
1359  done:
1360    Py_XDECREF(descr);
1361    Py_DECREF(name);
1362    return res;
1363}
1364
1365PyObject *
1366PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
1367{
1368    return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 0);
1369}
1370
1371int
1372_PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
1373                                 PyObject *value, PyObject *dict)
1374{
1375    PyTypeObject *tp = Py_TYPE(obj);
1376    PyObject *descr;
1377    descrsetfunc f;
1378    int res = -1;
1379
1380    if (!PyUnicode_Check(name)){
1381        PyErr_Format(PyExc_TypeError,
1382                     "attribute name must be string, not '%.200s'",
1383                     Py_TYPE(name)->tp_name);
1384        return -1;
1385    }
1386
1387    if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
1388        return -1;
1389
1390    Py_INCREF(name);
1391    Py_INCREF(tp);
1392    descr = _PyType_Lookup(tp, name);
1393
1394    if (descr != NULL) {
1395        Py_INCREF(descr);
1396        f = Py_TYPE(descr)->tp_descr_set;
1397        if (f != NULL) {
1398            res = f(descr, obj, value);
1399            goto done;
1400        }
1401    }
1402
1403    if (dict == NULL) {
1404        if ((tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) && *_PyObject_ValuesPointer(obj)) {
1405            res = _PyObject_StoreInstanceAttribute(obj, *_PyObject_ValuesPointer(obj), name, value);
1406        }
1407        else {
1408            PyObject **dictptr = _PyObject_DictPointer(obj);
1409            if (dictptr == NULL) {
1410                if (descr == NULL) {
1411                    PyErr_Format(PyExc_AttributeError,
1412                                "'%.100s' object has no attribute '%U'",
1413                                tp->tp_name, name);
1414                }
1415                else {
1416                    PyErr_Format(PyExc_AttributeError,
1417                                "'%.50s' object attribute '%U' is read-only",
1418                                tp->tp_name, name);
1419                }
1420                goto done;
1421            }
1422            else {
1423                res = _PyObjectDict_SetItem(tp, dictptr, name, value);
1424            }
1425        }
1426    }
1427    else {
1428        Py_INCREF(dict);
1429        if (value == NULL)
1430            res = PyDict_DelItem(dict, name);
1431        else
1432            res = PyDict_SetItem(dict, name, value);
1433        Py_DECREF(dict);
1434    }
1435    if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) {
1436        if (PyType_IsSubtype(tp, &PyType_Type)) {
1437            PyErr_Format(PyExc_AttributeError,
1438                         "type object '%.50s' has no attribute '%U'",
1439                         ((PyTypeObject*)obj)->tp_name, name);
1440        }
1441        else {
1442            PyErr_Format(PyExc_AttributeError,
1443                         "'%.100s' object has no attribute '%U'",
1444                         tp->tp_name, name);
1445        }
1446    }
1447  done:
1448    Py_XDECREF(descr);
1449    Py_DECREF(tp);
1450    Py_DECREF(name);
1451    return res;
1452}
1453
1454int
1455PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
1456{
1457    return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
1458}
1459
1460int
1461PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
1462{
1463    PyObject **dictptr = _PyObject_GetDictPtr(obj);
1464    if (dictptr == NULL) {
1465        if (_PyType_HasFeature(Py_TYPE(obj), Py_TPFLAGS_MANAGED_DICT) &&
1466            *_PyObject_ValuesPointer(obj) != NULL)
1467        {
1468            /* Was unable to convert to dict */
1469            PyErr_NoMemory();
1470        }
1471        else {
1472            PyErr_SetString(PyExc_AttributeError,
1473                            "This object has no __dict__");
1474        }
1475        return -1;
1476    }
1477    if (value == NULL) {
1478        PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
1479        return -1;
1480    }
1481    if (!PyDict_Check(value)) {
1482        PyErr_Format(PyExc_TypeError,
1483                     "__dict__ must be set to a dictionary, "
1484                     "not a '%.200s'", Py_TYPE(value)->tp_name);
1485        return -1;
1486    }
1487    Py_INCREF(value);
1488    Py_XSETREF(*dictptr, value);
1489    return 0;
1490}
1491
1492
1493/* Test a value used as condition, e.g., in a while or if statement.
1494   Return -1 if an error occurred */
1495
1496int
1497PyObject_IsTrue(PyObject *v)
1498{
1499    Py_ssize_t res;
1500    if (v == Py_True)
1501        return 1;
1502    if (v == Py_False)
1503        return 0;
1504    if (v == Py_None)
1505        return 0;
1506    else if (Py_TYPE(v)->tp_as_number != NULL &&
1507             Py_TYPE(v)->tp_as_number->nb_bool != NULL)
1508        res = (*Py_TYPE(v)->tp_as_number->nb_bool)(v);
1509    else if (Py_TYPE(v)->tp_as_mapping != NULL &&
1510             Py_TYPE(v)->tp_as_mapping->mp_length != NULL)
1511        res = (*Py_TYPE(v)->tp_as_mapping->mp_length)(v);
1512    else if (Py_TYPE(v)->tp_as_sequence != NULL &&
1513             Py_TYPE(v)->tp_as_sequence->sq_length != NULL)
1514        res = (*Py_TYPE(v)->tp_as_sequence->sq_length)(v);
1515    else
1516        return 1;
1517    /* if it is negative, it should be either -1 or -2 */
1518    return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
1519}
1520
1521/* equivalent of 'not v'
1522   Return -1 if an error occurred */
1523
1524int
1525PyObject_Not(PyObject *v)
1526{
1527    int res;
1528    res = PyObject_IsTrue(v);
1529    if (res < 0)
1530        return res;
1531    return res == 0;
1532}
1533
1534/* Test whether an object can be called */
1535
1536int
1537PyCallable_Check(PyObject *x)
1538{
1539    if (x == NULL)
1540        return 0;
1541    return Py_TYPE(x)->tp_call != NULL;
1542}
1543
1544
1545/* Helper for PyObject_Dir without arguments: returns the local scope. */
1546static PyObject *
1547_dir_locals(void)
1548{
1549    PyObject *names;
1550    PyObject *locals;
1551
1552    locals = PyEval_GetLocals();
1553    if (locals == NULL)
1554        return NULL;
1555
1556    names = PyMapping_Keys(locals);
1557    if (!names)
1558        return NULL;
1559    if (!PyList_Check(names)) {
1560        PyErr_Format(PyExc_TypeError,
1561            "dir(): expected keys() of locals to be a list, "
1562            "not '%.200s'", Py_TYPE(names)->tp_name);
1563        Py_DECREF(names);
1564        return NULL;
1565    }
1566    if (PyList_Sort(names)) {
1567        Py_DECREF(names);
1568        return NULL;
1569    }
1570    /* the locals don't need to be DECREF'd */
1571    return names;
1572}
1573
1574/* Helper for PyObject_Dir: object introspection. */
1575static PyObject *
1576_dir_object(PyObject *obj)
1577{
1578    PyObject *result, *sorted;
1579    PyObject *dirfunc = _PyObject_LookupSpecial(obj, &_Py_ID(__dir__));
1580
1581    assert(obj != NULL);
1582    if (dirfunc == NULL) {
1583        if (!PyErr_Occurred())
1584            PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
1585        return NULL;
1586    }
1587    /* use __dir__ */
1588    result = _PyObject_CallNoArgs(dirfunc);
1589    Py_DECREF(dirfunc);
1590    if (result == NULL)
1591        return NULL;
1592    /* return sorted(result) */
1593    sorted = PySequence_List(result);
1594    Py_DECREF(result);
1595    if (sorted == NULL)
1596        return NULL;
1597    if (PyList_Sort(sorted)) {
1598        Py_DECREF(sorted);
1599        return NULL;
1600    }
1601    return sorted;
1602}
1603
1604/* Implementation of dir() -- if obj is NULL, returns the names in the current
1605   (local) scope.  Otherwise, performs introspection of the object: returns a
1606   sorted list of attribute names (supposedly) accessible from the object
1607*/
1608PyObject *
1609PyObject_Dir(PyObject *obj)
1610{
1611    return (obj == NULL) ? _dir_locals() : _dir_object(obj);
1612}
1613
1614/*
1615None is a non-NULL undefined value.
1616There is (and should be!) no way to create other objects of this type,
1617so there is exactly one (which is indestructible, by the way).
1618*/
1619
1620/* ARGSUSED */
1621static PyObject *
1622none_repr(PyObject *op)
1623{
1624    return PyUnicode_FromString("None");
1625}
1626
1627static void _Py_NO_RETURN
1628none_dealloc(PyObject* Py_UNUSED(ignore))
1629{
1630    _Py_FatalRefcountError("deallocating None");
1631}
1632
1633static PyObject *
1634none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1635{
1636    if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
1637        PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
1638        return NULL;
1639    }
1640    Py_RETURN_NONE;
1641}
1642
1643static int
1644none_bool(PyObject *v)
1645{
1646    return 0;
1647}
1648
1649static PyNumberMethods none_as_number = {
1650    0,                          /* nb_add */
1651    0,                          /* nb_subtract */
1652    0,                          /* nb_multiply */
1653    0,                          /* nb_remainder */
1654    0,                          /* nb_divmod */
1655    0,                          /* nb_power */
1656    0,                          /* nb_negative */
1657    0,                          /* nb_positive */
1658    0,                          /* nb_absolute */
1659    (inquiry)none_bool,         /* nb_bool */
1660    0,                          /* nb_invert */
1661    0,                          /* nb_lshift */
1662    0,                          /* nb_rshift */
1663    0,                          /* nb_and */
1664    0,                          /* nb_xor */
1665    0,                          /* nb_or */
1666    0,                          /* nb_int */
1667    0,                          /* nb_reserved */
1668    0,                          /* nb_float */
1669    0,                          /* nb_inplace_add */
1670    0,                          /* nb_inplace_subtract */
1671    0,                          /* nb_inplace_multiply */
1672    0,                          /* nb_inplace_remainder */
1673    0,                          /* nb_inplace_power */
1674    0,                          /* nb_inplace_lshift */
1675    0,                          /* nb_inplace_rshift */
1676    0,                          /* nb_inplace_and */
1677    0,                          /* nb_inplace_xor */
1678    0,                          /* nb_inplace_or */
1679    0,                          /* nb_floor_divide */
1680    0,                          /* nb_true_divide */
1681    0,                          /* nb_inplace_floor_divide */
1682    0,                          /* nb_inplace_true_divide */
1683    0,                          /* nb_index */
1684};
1685
1686PyTypeObject _PyNone_Type = {
1687    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1688    "NoneType",
1689    0,
1690    0,
1691    none_dealloc,       /*tp_dealloc*/ /*never called*/
1692    0,                  /*tp_vectorcall_offset*/
1693    0,                  /*tp_getattr*/
1694    0,                  /*tp_setattr*/
1695    0,                  /*tp_as_async*/
1696    none_repr,          /*tp_repr*/
1697    &none_as_number,    /*tp_as_number*/
1698    0,                  /*tp_as_sequence*/
1699    0,                  /*tp_as_mapping*/
1700    0,                  /*tp_hash */
1701    0,                  /*tp_call */
1702    0,                  /*tp_str */
1703    0,                  /*tp_getattro */
1704    0,                  /*tp_setattro */
1705    0,                  /*tp_as_buffer */
1706    Py_TPFLAGS_DEFAULT, /*tp_flags */
1707    0,                  /*tp_doc */
1708    0,                  /*tp_traverse */
1709    0,                  /*tp_clear */
1710    0,                  /*tp_richcompare */
1711    0,                  /*tp_weaklistoffset */
1712    0,                  /*tp_iter */
1713    0,                  /*tp_iternext */
1714    0,                  /*tp_methods */
1715    0,                  /*tp_members */
1716    0,                  /*tp_getset */
1717    0,                  /*tp_base */
1718    0,                  /*tp_dict */
1719    0,                  /*tp_descr_get */
1720    0,                  /*tp_descr_set */
1721    0,                  /*tp_dictoffset */
1722    0,                  /*tp_init */
1723    0,                  /*tp_alloc */
1724    none_new,           /*tp_new */
1725};
1726
1727PyObject _Py_NoneStruct = {
1728  _PyObject_EXTRA_INIT
1729  1, &_PyNone_Type
1730};
1731
1732/* NotImplemented is an object that can be used to signal that an
1733   operation is not implemented for the given type combination. */
1734
1735static PyObject *
1736NotImplemented_repr(PyObject *op)
1737{
1738    return PyUnicode_FromString("NotImplemented");
1739}
1740
1741static PyObject *
1742NotImplemented_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
1743{
1744    return PyUnicode_FromString("NotImplemented");
1745}
1746
1747static PyMethodDef notimplemented_methods[] = {
1748    {"__reduce__", NotImplemented_reduce, METH_NOARGS, NULL},
1749    {NULL, NULL}
1750};
1751
1752static PyObject *
1753notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1754{
1755    if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_GET_SIZE(kwargs))) {
1756        PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
1757        return NULL;
1758    }
1759    Py_RETURN_NOTIMPLEMENTED;
1760}
1761
1762static void _Py_NO_RETURN
1763notimplemented_dealloc(PyObject* ignore)
1764{
1765    /* This should never get called, but we also don't want to SEGV if
1766     * we accidentally decref NotImplemented out of existence.
1767     */
1768    Py_FatalError("deallocating NotImplemented");
1769}
1770
1771static int
1772notimplemented_bool(PyObject *v)
1773{
1774    if (PyErr_WarnEx(PyExc_DeprecationWarning,
1775                     "NotImplemented should not be used in a boolean context",
1776                     1) < 0)
1777    {
1778        return -1;
1779    }
1780    return 1;
1781}
1782
1783static PyNumberMethods notimplemented_as_number = {
1784    .nb_bool = notimplemented_bool,
1785};
1786
1787PyTypeObject _PyNotImplemented_Type = {
1788    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1789    "NotImplementedType",
1790    0,
1791    0,
1792    notimplemented_dealloc,       /*tp_dealloc*/ /*never called*/
1793    0,                  /*tp_vectorcall_offset*/
1794    0,                  /*tp_getattr*/
1795    0,                  /*tp_setattr*/
1796    0,                  /*tp_as_async*/
1797    NotImplemented_repr,        /*tp_repr*/
1798    &notimplemented_as_number,  /*tp_as_number*/
1799    0,                  /*tp_as_sequence*/
1800    0,                  /*tp_as_mapping*/
1801    0,                  /*tp_hash */
1802    0,                  /*tp_call */
1803    0,                  /*tp_str */
1804    0,                  /*tp_getattro */
1805    0,                  /*tp_setattro */
1806    0,                  /*tp_as_buffer */
1807    Py_TPFLAGS_DEFAULT, /*tp_flags */
1808    0,                  /*tp_doc */
1809    0,                  /*tp_traverse */
1810    0,                  /*tp_clear */
1811    0,                  /*tp_richcompare */
1812    0,                  /*tp_weaklistoffset */
1813    0,                  /*tp_iter */
1814    0,                  /*tp_iternext */
1815    notimplemented_methods, /*tp_methods */
1816    0,                  /*tp_members */
1817    0,                  /*tp_getset */
1818    0,                  /*tp_base */
1819    0,                  /*tp_dict */
1820    0,                  /*tp_descr_get */
1821    0,                  /*tp_descr_set */
1822    0,                  /*tp_dictoffset */
1823    0,                  /*tp_init */
1824    0,                  /*tp_alloc */
1825    notimplemented_new, /*tp_new */
1826};
1827
1828PyObject _Py_NotImplementedStruct = {
1829    _PyObject_EXTRA_INIT
1830    1, &_PyNotImplemented_Type
1831};
1832
1833PyStatus
1834_PyTypes_InitState(PyInterpreterState *interp)
1835{
1836    if (!_Py_IsMainInterpreter(interp)) {
1837        return _PyStatus_OK();
1838    }
1839
1840    PyStatus status = _PyTypes_InitSlotDefs();
1841    if (_PyStatus_EXCEPTION(status)) {
1842        return status;
1843    }
1844
1845    return _PyStatus_OK();
1846}
1847
1848
1849
1850#ifdef MS_WINDOWS
1851extern PyTypeObject PyHKEY_Type;
1852#endif
1853extern PyTypeObject _Py_GenericAliasIterType;
1854extern PyTypeObject _PyMemoryIter_Type;
1855
1856static PyTypeObject* static_types[] = {
1857    // The two most important base types: must be initialized first and
1858    // deallocated last.
1859    &PyBaseObject_Type,
1860    &PyType_Type,
1861
1862    // Static types with base=&PyBaseObject_Type
1863    &PyAsyncGen_Type,
1864    &PyByteArrayIter_Type,
1865    &PyByteArray_Type,
1866    &PyBytesIter_Type,
1867    &PyBytes_Type,
1868    &PyCFunction_Type,
1869    &PyCallIter_Type,
1870    &PyCapsule_Type,
1871    &PyCell_Type,
1872    &PyClassMethodDescr_Type,
1873    &PyClassMethod_Type,
1874    &PyCode_Type,
1875    &PyComplex_Type,
1876    &PyContextToken_Type,
1877    &PyContextVar_Type,
1878    &PyContext_Type,
1879    &PyCoro_Type,
1880    &PyDictItems_Type,
1881    &PyDictIterItem_Type,
1882    &PyDictIterKey_Type,
1883    &PyDictIterValue_Type,
1884    &PyDictKeys_Type,
1885    &PyDictProxy_Type,
1886    &PyDictRevIterItem_Type,
1887    &PyDictRevIterKey_Type,
1888    &PyDictRevIterValue_Type,
1889    &PyDictValues_Type,
1890    &PyDict_Type,
1891    &PyEllipsis_Type,
1892    &PyEnum_Type,
1893    &PyFilter_Type,
1894    &PyFloat_Type,
1895    &PyFrame_Type,
1896    &PyFrozenSet_Type,
1897    &PyFunction_Type,
1898    &PyGen_Type,
1899    &PyGetSetDescr_Type,
1900#ifdef MS_WINDOWS
1901    &PyHKEY_Type,
1902#endif
1903    &PyInstanceMethod_Type,
1904    &PyListIter_Type,
1905    &PyListRevIter_Type,
1906    &PyList_Type,
1907    &PyLongRangeIter_Type,
1908    &PyLong_Type,
1909    &PyMap_Type,
1910    &PyMemberDescr_Type,
1911    &PyMemoryView_Type,
1912    &PyMethodDescr_Type,
1913    &PyMethod_Type,
1914    &PyModuleDef_Type,
1915    &PyModule_Type,
1916    &PyODictIter_Type,
1917    &PyPickleBuffer_Type,
1918    &PyProperty_Type,
1919    &PyRangeIter_Type,
1920    &PyRange_Type,
1921    &PyReversed_Type,
1922    &PySTEntry_Type,
1923    &PySeqIter_Type,
1924    &PySetIter_Type,
1925    &PySet_Type,
1926    &PySlice_Type,
1927    &PyStaticMethod_Type,
1928    &PyStdPrinter_Type,
1929    &PySuper_Type,
1930    &PyTraceBack_Type,
1931    &PyTupleIter_Type,
1932    &PyTuple_Type,
1933    &PyUnicodeIter_Type,
1934    &PyUnicode_Type,
1935    &PyWrapperDescr_Type,
1936    &PyZip_Type,
1937    &Py_GenericAliasType,
1938    &_PyAnextAwaitable_Type,
1939    &_PyAsyncGenASend_Type,
1940    &_PyAsyncGenAThrow_Type,
1941    &_PyAsyncGenWrappedValue_Type,
1942    &_PyContextTokenMissing_Type,
1943    &_PyCoroWrapper_Type,
1944    &_Py_GenericAliasIterType,
1945    &_PyHamtItems_Type,
1946    &_PyHamtKeys_Type,
1947    &_PyHamtValues_Type,
1948    &_PyHamt_ArrayNode_Type,
1949    &_PyHamt_BitmapNode_Type,
1950    &_PyHamt_CollisionNode_Type,
1951    &_PyHamt_Type,
1952    &_PyInterpreterID_Type,
1953    &_PyManagedBuffer_Type,
1954    &_PyMemoryIter_Type,
1955    &_PyMethodWrapper_Type,
1956    &_PyNamespace_Type,
1957    &_PyNone_Type,
1958    &_PyNotImplemented_Type,
1959    &_PyUnicodeASCIIIter_Type,
1960    &_PyUnion_Type,
1961    &_PyWeakref_CallableProxyType,
1962    &_PyWeakref_ProxyType,
1963    &_PyWeakref_RefType,
1964
1965    // subclasses: _PyTypes_FiniTypes() deallocates them before their base
1966    // class
1967    &PyBool_Type,         // base=&PyLong_Type
1968    &PyCMethod_Type,      // base=&PyCFunction_Type
1969    &PyODictItems_Type,   // base=&PyDictItems_Type
1970    &PyODictKeys_Type,    // base=&PyDictKeys_Type
1971    &PyODictValues_Type,  // base=&PyDictValues_Type
1972    &PyODict_Type,        // base=&PyDict_Type
1973};
1974
1975
1976PyStatus
1977_PyTypes_InitTypes(PyInterpreterState *interp)
1978{
1979    if (!_Py_IsMainInterpreter(interp)) {
1980        return _PyStatus_OK();
1981    }
1982
1983    // All other static types (unless initialized elsewhere)
1984    for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
1985        PyTypeObject *type = static_types[i];
1986        if (PyType_Ready(type) < 0) {
1987            return _PyStatus_ERR("Can't initialize types");
1988        }
1989        if (type == &PyType_Type) {
1990            // Sanitify checks of the two most important types
1991            assert(PyBaseObject_Type.tp_base == NULL);
1992            assert(PyType_Type.tp_base == &PyBaseObject_Type);
1993        }
1994    }
1995
1996    return _PyStatus_OK();
1997}
1998
1999
2000// Best-effort function clearing static types.
2001//
2002// Don't deallocate a type if it still has subclasses. If a Py_Finalize()
2003// sub-function is interrupted by CTRL+C or fails with MemoryError, some
2004// subclasses are not cleared properly. Leave the static type unchanged in this
2005// case.
2006void
2007_PyTypes_FiniTypes(PyInterpreterState *interp)
2008{
2009    if (!_Py_IsMainInterpreter(interp)) {
2010        return;
2011    }
2012
2013    // Deallocate types in the reverse order to deallocate subclasses before
2014    // their base classes.
2015    for (Py_ssize_t i=Py_ARRAY_LENGTH(static_types)-1; i>=0; i--) {
2016        PyTypeObject *type = static_types[i];
2017        _PyStaticType_Dealloc(type);
2018    }
2019}
2020
2021
2022void
2023_Py_NewReference(PyObject *op)
2024{
2025    if (_Py_tracemalloc_config.tracing) {
2026        _PyTraceMalloc_NewReference(op);
2027    }
2028#ifdef Py_REF_DEBUG
2029    _Py_RefTotal++;
2030#endif
2031    Py_SET_REFCNT(op, 1);
2032#ifdef Py_TRACE_REFS
2033    _Py_AddToAllObjects(op, 1);
2034#endif
2035}
2036
2037
2038#ifdef Py_TRACE_REFS
2039void
2040_Py_ForgetReference(PyObject *op)
2041{
2042    if (Py_REFCNT(op) < 0) {
2043        _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt");
2044    }
2045
2046    if (op == &refchain ||
2047        op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
2048    {
2049        _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain");
2050    }
2051
2052#ifdef SLOW_UNREF_CHECK
2053    PyObject *p;
2054    for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
2055        if (p == op) {
2056            break;
2057        }
2058    }
2059    if (p == &refchain) {
2060        /* Not found */
2061        _PyObject_ASSERT_FAILED_MSG(op,
2062                                    "object not found in the objects list");
2063    }
2064#endif
2065
2066    op->_ob_next->_ob_prev = op->_ob_prev;
2067    op->_ob_prev->_ob_next = op->_ob_next;
2068    op->_ob_next = op->_ob_prev = NULL;
2069}
2070
2071/* Print all live objects.  Because PyObject_Print is called, the
2072 * interpreter must be in a healthy state.
2073 */
2074void
2075_Py_PrintReferences(FILE *fp)
2076{
2077    PyObject *op;
2078    fprintf(fp, "Remaining objects:\n");
2079    for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
2080        fprintf(fp, "%p [%zd] ", (void *)op, Py_REFCNT(op));
2081        if (PyObject_Print(op, fp, 0) != 0) {
2082            PyErr_Clear();
2083        }
2084        putc('\n', fp);
2085    }
2086}
2087
2088/* Print the addresses of all live objects.  Unlike _Py_PrintReferences, this
2089 * doesn't make any calls to the Python C API, so is always safe to call.
2090 */
2091void
2092_Py_PrintReferenceAddresses(FILE *fp)
2093{
2094    PyObject *op;
2095    fprintf(fp, "Remaining object addresses:\n");
2096    for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
2097        fprintf(fp, "%p [%zd] %s\n", (void *)op,
2098            Py_REFCNT(op), Py_TYPE(op)->tp_name);
2099}
2100
2101PyObject *
2102_Py_GetObjects(PyObject *self, PyObject *args)
2103{
2104    int i, n;
2105    PyObject *t = NULL;
2106    PyObject *res, *op;
2107
2108    if (!PyArg_ParseTuple(args, "i|O", &n, &t))
2109        return NULL;
2110    op = refchain._ob_next;
2111    res = PyList_New(0);
2112    if (res == NULL)
2113        return NULL;
2114    for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
2115        while (op == self || op == args || op == res || op == t ||
2116               (t != NULL && !Py_IS_TYPE(op, (PyTypeObject *) t))) {
2117            op = op->_ob_next;
2118            if (op == &refchain)
2119                return res;
2120        }
2121        if (PyList_Append(res, op) < 0) {
2122            Py_DECREF(res);
2123            return NULL;
2124        }
2125        op = op->_ob_next;
2126    }
2127    return res;
2128}
2129
2130#endif
2131
2132
2133/* Hack to force loading of abstract.o */
2134Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
2135
2136
2137void
2138_PyObject_DebugTypeStats(FILE *out)
2139{
2140    _PyDict_DebugMallocStats(out);
2141    _PyFloat_DebugMallocStats(out);
2142    _PyList_DebugMallocStats(out);
2143    _PyTuple_DebugMallocStats(out);
2144}
2145
2146/* These methods are used to control infinite recursion in repr, str, print,
2147   etc.  Container objects that may recursively contain themselves,
2148   e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
2149   Py_ReprLeave() to avoid infinite recursion.
2150
2151   Py_ReprEnter() returns 0 the first time it is called for a particular
2152   object and 1 every time thereafter.  It returns -1 if an exception
2153   occurred.  Py_ReprLeave() has no return value.
2154
2155   See dictobject.c and listobject.c for examples of use.
2156*/
2157
2158int
2159Py_ReprEnter(PyObject *obj)
2160{
2161    PyObject *dict;
2162    PyObject *list;
2163    Py_ssize_t i;
2164
2165    dict = PyThreadState_GetDict();
2166    /* Ignore a missing thread-state, so that this function can be called
2167       early on startup. */
2168    if (dict == NULL)
2169        return 0;
2170    list = PyDict_GetItemWithError(dict, &_Py_ID(Py_Repr));
2171    if (list == NULL) {
2172        if (PyErr_Occurred()) {
2173            return -1;
2174        }
2175        list = PyList_New(0);
2176        if (list == NULL)
2177            return -1;
2178        if (PyDict_SetItem(dict, &_Py_ID(Py_Repr), list) < 0)
2179            return -1;
2180        Py_DECREF(list);
2181    }
2182    i = PyList_GET_SIZE(list);
2183    while (--i >= 0) {
2184        if (PyList_GET_ITEM(list, i) == obj)
2185            return 1;
2186    }
2187    if (PyList_Append(list, obj) < 0)
2188        return -1;
2189    return 0;
2190}
2191
2192void
2193Py_ReprLeave(PyObject *obj)
2194{
2195    PyObject *dict;
2196    PyObject *list;
2197    Py_ssize_t i;
2198    PyObject *error_type, *error_value, *error_traceback;
2199
2200    PyErr_Fetch(&error_type, &error_value, &error_traceback);
2201
2202    dict = PyThreadState_GetDict();
2203    if (dict == NULL)
2204        goto finally;
2205
2206    list = PyDict_GetItemWithError(dict, &_Py_ID(Py_Repr));
2207    if (list == NULL || !PyList_Check(list))
2208        goto finally;
2209
2210    i = PyList_GET_SIZE(list);
2211    /* Count backwards because we always expect obj to be list[-1] */
2212    while (--i >= 0) {
2213        if (PyList_GET_ITEM(list, i) == obj) {
2214            PyList_SetSlice(list, i, i + 1, NULL);
2215            break;
2216        }
2217    }
2218
2219finally:
2220    /* ignore exceptions because there is no way to report them. */
2221    PyErr_Restore(error_type, error_value, error_traceback);
2222}
2223
2224/* Trashcan support. */
2225
2226#define _PyTrash_UNWIND_LEVEL 50
2227
2228/* Add op to the gcstate->trash_delete_later list.  Called when the current
2229 * call-stack depth gets large.  op must be a currently untracked gc'ed
2230 * object, with refcount 0.  Py_DECREF must already have been called on it.
2231 */
2232static void
2233_PyTrash_thread_deposit_object(PyObject *op)
2234{
2235    PyThreadState *tstate = _PyThreadState_GET();
2236    _PyObject_ASSERT(op, _PyObject_IS_GC(op));
2237    _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op));
2238    _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2239    _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later);
2240    tstate->trash_delete_later = op;
2241}
2242
2243/* Deallocate all the objects in the gcstate->trash_delete_later list.
2244 * Called when the call-stack unwinds again. */
2245static void
2246_PyTrash_thread_destroy_chain(void)
2247{
2248    PyThreadState *tstate = _PyThreadState_GET();
2249    /* We need to increase trash_delete_nesting here, otherwise,
2250       _PyTrash_thread_destroy_chain will be called recursively
2251       and then possibly crash.  An example that may crash without
2252       increase:
2253           N = 500000  # need to be large enough
2254           ob = object()
2255           tups = [(ob,) for i in range(N)]
2256           for i in range(49):
2257               tups = [(tup,) for tup in tups]
2258           del tups
2259    */
2260    assert(tstate->trash_delete_nesting == 0);
2261    ++tstate->trash_delete_nesting;
2262    while (tstate->trash_delete_later) {
2263        PyObject *op = tstate->trash_delete_later;
2264        destructor dealloc = Py_TYPE(op)->tp_dealloc;
2265
2266        tstate->trash_delete_later =
2267            (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op));
2268
2269        /* Call the deallocator directly.  This used to try to
2270         * fool Py_DECREF into calling it indirectly, but
2271         * Py_DECREF was already called on this object, and in
2272         * assorted non-release builds calling Py_DECREF again ends
2273         * up distorting allocation statistics.
2274         */
2275        _PyObject_ASSERT(op, Py_REFCNT(op) == 0);
2276        (*dealloc)(op);
2277        assert(tstate->trash_delete_nesting == 1);
2278    }
2279    --tstate->trash_delete_nesting;
2280}
2281
2282
2283int
2284_PyTrash_begin(PyThreadState *tstate, PyObject *op)
2285{
2286    if (tstate->trash_delete_nesting >= _PyTrash_UNWIND_LEVEL) {
2287        /* Store the object (to be deallocated later) and jump past
2288         * Py_TRASHCAN_END, skipping the body of the deallocator */
2289        _PyTrash_thread_deposit_object(op);
2290        return 1;
2291    }
2292    ++tstate->trash_delete_nesting;
2293    return 0;
2294}
2295
2296
2297void
2298_PyTrash_end(PyThreadState *tstate)
2299{
2300    --tstate->trash_delete_nesting;
2301    if (tstate->trash_delete_later && tstate->trash_delete_nesting <= 0) {
2302        _PyTrash_thread_destroy_chain();
2303    }
2304}
2305
2306
2307/* bpo-40170: It's only be used in Py_TRASHCAN_BEGIN macro to hide
2308   implementation details. */
2309int
2310_PyTrash_cond(PyObject *op, destructor dealloc)
2311{
2312    return Py_TYPE(op)->tp_dealloc == dealloc;
2313}
2314
2315
2316void _Py_NO_RETURN
2317_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
2318                       const char *file, int line, const char *function)
2319{
2320    fprintf(stderr, "%s:%d: ", file, line);
2321    if (function) {
2322        fprintf(stderr, "%s: ", function);
2323    }
2324    fflush(stderr);
2325
2326    if (expr) {
2327        fprintf(stderr, "Assertion \"%s\" failed", expr);
2328    }
2329    else {
2330        fprintf(stderr, "Assertion failed");
2331    }
2332    fflush(stderr);
2333
2334    if (msg) {
2335        fprintf(stderr, ": %s", msg);
2336    }
2337    fprintf(stderr, "\n");
2338    fflush(stderr);
2339
2340    if (_PyObject_IsFreed(obj)) {
2341        /* It seems like the object memory has been freed:
2342           don't access it to prevent a segmentation fault. */
2343        fprintf(stderr, "<object at %p is freed>\n", obj);
2344        fflush(stderr);
2345    }
2346    else {
2347        /* Display the traceback where the object has been allocated.
2348           Do it before dumping repr(obj), since repr() is more likely
2349           to crash than dumping the traceback. */
2350        void *ptr;
2351        PyTypeObject *type = Py_TYPE(obj);
2352        if (_PyType_IS_GC(type)) {
2353            ptr = (void *)((char *)obj - sizeof(PyGC_Head));
2354        }
2355        else {
2356            ptr = (void *)obj;
2357        }
2358        _PyMem_DumpTraceback(fileno(stderr), ptr);
2359
2360        /* This might succeed or fail, but we're about to abort, so at least
2361           try to provide any extra info we can: */
2362        _PyObject_Dump(obj);
2363
2364        fprintf(stderr, "\n");
2365        fflush(stderr);
2366    }
2367
2368    Py_FatalError("_PyObject_AssertFailed");
2369}
2370
2371
2372void
2373_Py_Dealloc(PyObject *op)
2374{
2375    PyTypeObject *type = Py_TYPE(op);
2376    destructor dealloc = type->tp_dealloc;
2377#ifdef Py_DEBUG
2378    PyThreadState *tstate = _PyThreadState_GET();
2379    PyObject *old_exc_type = tstate->curexc_type;
2380    // Keep the old exception type alive to prevent undefined behavior
2381    // on (tstate->curexc_type != old_exc_type) below
2382    Py_XINCREF(old_exc_type);
2383    // Make sure that type->tp_name remains valid
2384    Py_INCREF(type);
2385#endif
2386
2387#ifdef Py_TRACE_REFS
2388    _Py_ForgetReference(op);
2389#endif
2390    (*dealloc)(op);
2391
2392#ifdef Py_DEBUG
2393    // gh-89373: The tp_dealloc function must leave the current exception
2394    // unchanged.
2395    if (tstate->curexc_type != old_exc_type) {
2396        const char *err;
2397        if (old_exc_type == NULL) {
2398            err = "Deallocator of type '%s' raised an exception";
2399        }
2400        else if (tstate->curexc_type == NULL) {
2401            err = "Deallocator of type '%s' cleared the current exception";
2402        }
2403        else {
2404            // It can happen if dealloc() normalized the current exception.
2405            // A deallocator function must not change the current exception,
2406            // not even normalize it.
2407            err = "Deallocator of type '%s' overrode the current exception";
2408        }
2409        _Py_FatalErrorFormat(__func__, err, type->tp_name);
2410    }
2411    Py_XDECREF(old_exc_type);
2412    Py_DECREF(type);
2413#endif
2414}
2415
2416
2417PyObject **
2418PyObject_GET_WEAKREFS_LISTPTR(PyObject *op)
2419{
2420    return _PyObject_GET_WEAKREFS_LISTPTR(op);
2421}
2422
2423
2424#undef Py_NewRef
2425#undef Py_XNewRef
2426
2427// Export Py_NewRef() and Py_XNewRef() as regular functions for the stable ABI.
2428PyObject*
2429Py_NewRef(PyObject *obj)
2430{
2431    return _Py_NewRef(obj);
2432}
2433
2434PyObject*
2435Py_XNewRef(PyObject *obj)
2436{
2437    return _Py_XNewRef(obj);
2438}
2439
2440#undef Py_Is
2441#undef Py_IsNone
2442#undef Py_IsTrue
2443#undef Py_IsFalse
2444
2445// Export Py_Is(), Py_IsNone(), Py_IsTrue(), Py_IsFalse() as regular functions
2446// for the stable ABI.
2447int Py_Is(PyObject *x, PyObject *y)
2448{
2449    return (x == y);
2450}
2451
2452int Py_IsNone(PyObject *x)
2453{
2454    return Py_Is(x, Py_None);
2455}
2456
2457int Py_IsTrue(PyObject *x)
2458{
2459    return Py_Is(x, Py_True);
2460}
2461
2462int Py_IsFalse(PyObject *x)
2463{
2464    return Py_Is(x, Py_False);
2465}
2466
2467#ifdef __cplusplus
2468}
2469#endif
2470