LCOV - code coverage report
Current view: top level - Objects - object.c (source / functions) Hit Total Coverage
Test: CPython lcov report Lines: 466 996 46.8 %
Date: 2017-04-19 Functions: 44 70 62.9 %

          Line data    Source code
       1             : 
       2             : /* Generic object operations; and implementation of None (NoObject) */
       3             : 
       4             : #include "Python.h"
       5             : #include "frameobject.h"
       6             : 
       7             : #ifdef __cplusplus
       8             : extern "C" {
       9             : #endif
      10             : 
      11             : #ifdef Py_REF_DEBUG
      12             : Py_ssize_t _Py_RefTotal;
      13             : 
      14             : Py_ssize_t
      15             : _Py_GetRefTotal(void)
      16             : {
      17             :     PyObject *o;
      18             :     Py_ssize_t total = _Py_RefTotal;
      19             :     /* ignore the references to the dummy object of the dicts and sets
      20             :        because they are not reliable and not useful (now that the
      21             :        hash table code is well-tested) */
      22             :     o = _PyDict_Dummy();
      23             :     if (o != NULL)
      24             :         total -= o->ob_refcnt;
      25             :     o = _PySet_Dummy();
      26             :     if (o != NULL)
      27             :         total -= o->ob_refcnt;
      28             :     return total;
      29             : }
      30             : #endif /* Py_REF_DEBUG */
      31             : 
      32             : int Py_DivisionWarningFlag;
      33             : int Py_Py3kWarningFlag;
      34             : 
      35             : /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
      36             :    These are used by the individual routines for object creation.
      37             :    Do not call them otherwise, they do not initialize the object! */
      38             : 
      39             : #ifdef Py_TRACE_REFS
      40             : /* Head of circular doubly-linked list of all objects.  These are linked
      41             :  * together via the _ob_prev and _ob_next members of a PyObject, which
      42             :  * exist only in a Py_TRACE_REFS build.
      43             :  */
      44             : static PyObject refchain = {&refchain, &refchain};
      45             : 
      46             : /* Insert op at the front of the list of all objects.  If force is true,
      47             :  * op is added even if _ob_prev and _ob_next are non-NULL already.  If
      48             :  * force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
      49             :  * force should be true if and only if op points to freshly allocated,
      50             :  * uninitialized memory, or you've unlinked op from the list and are
      51             :  * relinking it into the front.
      52             :  * Note that objects are normally added to the list via _Py_NewReference,
      53             :  * which is called by PyObject_Init.  Not all objects are initialized that
      54             :  * way, though; exceptions include statically allocated type objects, and
      55             :  * statically allocated singletons (like Py_True and Py_None).
      56             :  */
      57             : void
      58             : _Py_AddToAllObjects(PyObject *op, int force)
      59             : {
      60             : #ifdef  Py_DEBUG
      61             :     if (!force) {
      62             :         /* If it's initialized memory, op must be in or out of
      63             :          * the list unambiguously.
      64             :          */
      65             :         assert((op->_ob_prev == NULL) == (op->_ob_next == NULL));
      66             :     }
      67             : #endif
      68             :     if (force || op->_ob_prev == NULL) {
      69             :         op->_ob_next = refchain._ob_next;
      70             :         op->_ob_prev = &refchain;
      71             :         refchain._ob_next->_ob_prev = op;
      72             :         refchain._ob_next = op;
      73             :     }
      74             : }
      75             : #endif  /* Py_TRACE_REFS */
      76             : 
      77             : #ifdef COUNT_ALLOCS
      78             : static PyTypeObject *type_list;
      79             : /* All types are added to type_list, at least when
      80             :    they get one object created. That makes them
      81             :    immortal, which unfortunately contributes to
      82             :    garbage itself. If unlist_types_without_objects
      83             :    is set, they will be removed from the type_list
      84             :    once the last object is deallocated. */
      85             : static int unlist_types_without_objects;
      86             : extern Py_ssize_t tuple_zero_allocs, fast_tuple_allocs;
      87             : extern Py_ssize_t quick_int_allocs, quick_neg_int_allocs;
      88             : extern Py_ssize_t null_strings, one_strings;
      89             : void
      90             : dump_counts(FILE* f)
      91             : {
      92             :     PyTypeObject *tp;
      93             : 
      94             :     for (tp = type_list; tp; tp = tp->tp_next)
      95             :         fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
      96             :             "freed: %" PY_FORMAT_SIZE_T "d, "
      97             :             "max in use: %" PY_FORMAT_SIZE_T "d\n",
      98             :             tp->tp_name, tp->tp_allocs, tp->tp_frees,
      99             :             tp->tp_maxalloc);
     100             :     fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, "
     101             :         "empty: %" PY_FORMAT_SIZE_T "d\n",
     102             :         fast_tuple_allocs, tuple_zero_allocs);
     103             :     fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, "
     104             :         "neg: %" PY_FORMAT_SIZE_T "d\n",
     105             :         quick_int_allocs, quick_neg_int_allocs);
     106             :     fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, "
     107             :         "1-strings: %" PY_FORMAT_SIZE_T "d\n",
     108             :         null_strings, one_strings);
     109             : }
     110             : 
     111             : PyObject *
     112             : get_counts(void)
     113             : {
     114             :     PyTypeObject *tp;
     115             :     PyObject *result;
     116             :     PyObject *v;
     117             : 
     118             :     result = PyList_New(0);
     119             :     if (result == NULL)
     120             :         return NULL;
     121             :     for (tp = type_list; tp; tp = tp->tp_next) {
     122             :         v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs,
     123             :                           tp->tp_frees, tp->tp_maxalloc);
     124             :         if (v == NULL) {
     125             :             Py_DECREF(result);
     126             :             return NULL;
     127             :         }
     128             :         if (PyList_Append(result, v) < 0) {
     129             :             Py_DECREF(v);
     130             :             Py_DECREF(result);
     131             :             return NULL;
     132             :         }
     133             :         Py_DECREF(v);
     134             :     }
     135             :     return result;
     136             : }
     137             : 
     138             : void
     139             : inc_count(PyTypeObject *tp)
     140             : {
     141             :     if (tp->tp_next == NULL && tp->tp_prev == NULL) {
     142             :         /* first time; insert in linked list */
     143             :         if (tp->tp_next != NULL) /* sanity check */
     144             :             Py_FatalError("XXX inc_count sanity check");
     145             :         if (type_list)
     146             :             type_list->tp_prev = tp;
     147             :         tp->tp_next = type_list;
     148             :         /* Note that as of Python 2.2, heap-allocated type objects
     149             :          * can go away, but this code requires that they stay alive
     150             :          * until program exit.  That's why we're careful with
     151             :          * refcounts here.  type_list gets a new reference to tp,
     152             :          * while ownership of the reference type_list used to hold
     153             :          * (if any) was transferred to tp->tp_next in the line above.
     154             :          * tp is thus effectively immortal after this.
     155             :          */
     156             :         Py_INCREF(tp);
     157             :         type_list = tp;
     158             : #ifdef Py_TRACE_REFS
     159             :         /* Also insert in the doubly-linked list of all objects,
     160             :          * if not already there.
     161             :          */
     162             :         _Py_AddToAllObjects((PyObject *)tp, 0);
     163             : #endif
     164             :     }
     165             :     tp->tp_allocs++;
     166             :     if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc)
     167             :         tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees;
     168             : }
     169             : 
     170             : void dec_count(PyTypeObject *tp)
     171             : {
     172             :     tp->tp_frees++;
     173             :     if (unlist_types_without_objects &&
     174             :         tp->tp_allocs == tp->tp_frees) {
     175             :         /* unlink the type from type_list */
     176             :         if (tp->tp_prev)
     177             :             tp->tp_prev->tp_next = tp->tp_next;
     178             :         else
     179             :             type_list = tp->tp_next;
     180             :         if (tp->tp_next)
     181             :             tp->tp_next->tp_prev = tp->tp_prev;
     182             :         tp->tp_next = tp->tp_prev = NULL;
     183             :         Py_DECREF(tp);
     184             :     }
     185             : }
     186             : 
     187             : #endif
     188             : 
     189             : #ifdef Py_REF_DEBUG
     190             : /* Log a fatal error; doesn't return. */
     191             : void
     192             : _Py_NegativeRefcount(const char *fname, int lineno, PyObject *op)
     193             : {
     194             :     char buf[300];
     195             : 
     196             :     PyOS_snprintf(buf, sizeof(buf),
     197             :                   "%s:%i object at %p has negative ref count "
     198             :                   "%" PY_FORMAT_SIZE_T "d",
     199             :                   fname, lineno, op, op->ob_refcnt);
     200             :     Py_FatalError(buf);
     201             : }
     202             : 
     203             : #endif /* Py_REF_DEBUG */
     204             : 
     205             : void
     206           0 : Py_IncRef(PyObject *o)
     207             : {
     208           0 :     Py_XINCREF(o);
     209           0 : }
     210             : 
     211             : void
     212           0 : Py_DecRef(PyObject *o)
     213             : {
     214           0 :     Py_XDECREF(o);
     215           0 : }
     216             : 
     217             : PyObject *
     218        8867 : PyObject_Init(PyObject *op, PyTypeObject *tp)
     219             : {
     220        8867 :     if (op == NULL)
     221           0 :         return PyErr_NoMemory();
     222             :     /* Any changes should be reflected in PyObject_INIT (objimpl.h) */
     223        8867 :     Py_TYPE(op) = tp;
     224        8867 :     _Py_NewReference(op);
     225        8867 :     return op;
     226             : }
     227             : 
     228             : PyVarObject *
     229       21327 : PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size)
     230             : {
     231       21327 :     if (op == NULL)
     232           0 :         return (PyVarObject *) PyErr_NoMemory();
     233             :     /* Any changes should be reflected in PyObject_INIT_VAR */
     234       21327 :     op->ob_size = size;
     235       21327 :     Py_TYPE(op) = tp;
     236       21327 :     _Py_NewReference((PyObject *)op);
     237       21327 :     return op;
     238             : }
     239             : 
     240             : PyObject *
     241        2441 : _PyObject_New(PyTypeObject *tp)
     242             : {
     243             :     PyObject *op;
     244        2441 :     op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
     245        2441 :     if (op == NULL)
     246           0 :         return PyErr_NoMemory();
     247        2441 :     return PyObject_INIT(op, tp);
     248             : }
     249             : 
     250             : PyVarObject *
     251           0 : _PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
     252             : {
     253             :     PyVarObject *op;
     254           0 :     const size_t size = _PyObject_VAR_SIZE(tp, nitems);
     255           0 :     op = (PyVarObject *) PyObject_MALLOC(size);
     256           0 :     if (op == NULL)
     257           0 :         return (PyVarObject *)PyErr_NoMemory();
     258           0 :     return PyObject_INIT_VAR(op, tp, nitems);
     259             : }
     260             : 
     261             : /* for binary compatibility with 2.2 */
     262             : #undef _PyObject_Del
     263             : void
     264           0 : _PyObject_Del(PyObject *op)
     265             : {
     266           0 :     PyObject_FREE(op);
     267           0 : }
     268             : 
     269             : /* Implementation of PyObject_Print with recursion checking */
     270             : static int
     271           0 : internal_print(PyObject *op, FILE *fp, int flags, int nesting)
     272             : {
     273           0 :     int ret = 0;
     274           0 :     if (nesting > 10) {
     275           0 :         PyErr_SetString(PyExc_RuntimeError, "print recursion");
     276           0 :         return -1;
     277             :     }
     278           0 :     if (PyErr_CheckSignals())
     279           0 :         return -1;
     280             : #ifdef USE_STACKCHECK
     281             :     if (PyOS_CheckStack()) {
     282             :         PyErr_SetString(PyExc_MemoryError, "stack overflow");
     283             :         return -1;
     284             :     }
     285             : #endif
     286           0 :     clearerr(fp); /* Clear any previous error condition */
     287           0 :     if (op == NULL) {
     288             :         Py_BEGIN_ALLOW_THREADS
     289           0 :         fprintf(fp, "<nil>");
     290             :         Py_END_ALLOW_THREADS
     291             :     }
     292             :     else {
     293           0 :         if (op->ob_refcnt <= 0)
     294             :             /* XXX(twouters) cast refcount to long until %zd is
     295             :                universally available */
     296             :             Py_BEGIN_ALLOW_THREADS
     297           0 :             fprintf(fp, "<refcnt %ld at %p>",
     298             :                 (long)op->ob_refcnt, op);
     299             :             Py_END_ALLOW_THREADS
     300           0 :         else if (Py_TYPE(op)->tp_print == NULL) {
     301             :             PyObject *s;
     302           0 :             if (flags & Py_PRINT_RAW)
     303           0 :                 s = PyObject_Str(op);
     304             :             else
     305           0 :                 s = PyObject_Repr(op);
     306           0 :             if (s == NULL)
     307           0 :                 ret = -1;
     308             :             else {
     309           0 :                 ret = internal_print(s, fp, Py_PRINT_RAW,
     310             :                                      nesting+1);
     311             :             }
     312           0 :             Py_XDECREF(s);
     313             :         }
     314             :         else
     315           0 :             ret = (*Py_TYPE(op)->tp_print)(op, fp, flags);
     316             :     }
     317           0 :     if (ret == 0) {
     318           0 :         if (ferror(fp)) {
     319           0 :             PyErr_SetFromErrno(PyExc_IOError);
     320           0 :             clearerr(fp);
     321           0 :             ret = -1;
     322             :         }
     323             :     }
     324           0 :     return ret;
     325             : }
     326             : 
     327             : int
     328           0 : PyObject_Print(PyObject *op, FILE *fp, int flags)
     329             : {
     330           0 :     return internal_print(op, fp, flags, 0);
     331             : }
     332             : 
     333             : 
     334             : /* For debugging convenience.  See Misc/gdbinit for some useful gdb hooks */
     335           0 : void _PyObject_Dump(PyObject* op)
     336             : {
     337           0 :     if (op == NULL)
     338           0 :         fprintf(stderr, "NULL\n");
     339             :     else {
     340             : #ifdef WITH_THREAD
     341             :         PyGILState_STATE gil;
     342             : #endif
     343           0 :         fprintf(stderr, "object  : ");
     344             : #ifdef WITH_THREAD
     345             :         gil = PyGILState_Ensure();
     346             : #endif
     347           0 :         (void)PyObject_Print(op, stderr, 0);
     348             : #ifdef WITH_THREAD
     349             :         PyGILState_Release(gil);
     350             : #endif
     351             :         /* XXX(twouters) cast refcount to long until %zd is
     352             :            universally available */
     353           0 :         fprintf(stderr, "\n"
     354             :             "type    : %s\n"
     355             :             "refcount: %ld\n"
     356             :             "address : %p\n",
     357           0 :             Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name,
     358             :             (long)op->ob_refcnt,
     359             :             op);
     360             :     }
     361           0 : }
     362             : 
     363             : PyObject *
     364        1191 : PyObject_Repr(PyObject *v)
     365             : {
     366        1191 :     if (PyErr_CheckSignals())
     367           0 :         return NULL;
     368             : #ifdef USE_STACKCHECK
     369             :     if (PyOS_CheckStack()) {
     370             :         PyErr_SetString(PyExc_MemoryError, "stack overflow");
     371             :         return NULL;
     372             :     }
     373             : #endif
     374        1191 :     if (v == NULL)
     375           0 :         return PyString_FromString("<NULL>");
     376        1191 :     else if (Py_TYPE(v)->tp_repr == NULL)
     377           0 :         return PyString_FromFormat("<%s object at %p>",
     378           0 :                                    Py_TYPE(v)->tp_name, v);
     379             :     else {
     380             :         PyObject *res;
     381        1191 :         res = (*Py_TYPE(v)->tp_repr)(v);
     382        1191 :         if (res == NULL)
     383           0 :             return NULL;
     384             : #ifdef Py_USING_UNICODE
     385        1191 :         if (PyUnicode_Check(res)) {
     386             :             PyObject* str;
     387           0 :             str = PyUnicode_AsEncodedString(res, NULL, NULL);
     388           0 :             Py_DECREF(res);
     389           0 :             if (str)
     390           0 :                 res = str;
     391             :             else
     392           0 :                 return NULL;
     393             :         }
     394             : #endif
     395        1191 :         if (!PyString_Check(res)) {
     396           0 :             PyErr_Format(PyExc_TypeError,
     397             :                          "__repr__ returned non-string (type %.200s)",
     398           0 :                          Py_TYPE(res)->tp_name);
     399           0 :             Py_DECREF(res);
     400           0 :             return NULL;
     401             :         }
     402        1191 :         return res;
     403             :     }
     404             : }
     405             : 
     406             : PyObject *
     407        4161 : _PyObject_Str(PyObject *v)
     408             : {
     409             :     PyObject *res;
     410             :     int type_ok;
     411        4161 :     if (v == NULL)
     412           0 :         return PyString_FromString("<NULL>");
     413        4161 :     if (PyString_CheckExact(v)) {
     414        3963 :         Py_INCREF(v);
     415        3963 :         return v;
     416             :     }
     417             : #ifdef Py_USING_UNICODE
     418         198 :     if (PyUnicode_CheckExact(v)) {
     419           0 :         Py_INCREF(v);
     420           0 :         return v;
     421             :     }
     422             : #endif
     423         198 :     if (Py_TYPE(v)->tp_str == NULL)
     424           0 :         return PyObject_Repr(v);
     425             : 
     426             :     /* It is possible for a type to have a tp_str representation that loops
     427             :        infinitely. */
     428         198 :     if (Py_EnterRecursiveCall(" while getting the str of an object"))
     429           0 :         return NULL;
     430         198 :     res = (*Py_TYPE(v)->tp_str)(v);
     431         198 :     Py_LeaveRecursiveCall();
     432         198 :     if (res == NULL)
     433           0 :         return NULL;
     434         198 :     type_ok = PyString_Check(res);
     435             : #ifdef Py_USING_UNICODE
     436         198 :     type_ok = type_ok || PyUnicode_Check(res);
     437             : #endif
     438         198 :     if (!type_ok) {
     439           0 :         PyErr_Format(PyExc_TypeError,
     440             :                      "__str__ returned non-string (type %.200s)",
     441           0 :                      Py_TYPE(res)->tp_name);
     442           0 :         Py_DECREF(res);
     443           0 :         return NULL;
     444             :     }
     445         198 :     return res;
     446             : }
     447             : 
     448             : PyObject *
     449        2709 : PyObject_Str(PyObject *v)
     450             : {
     451        2709 :     PyObject *res = _PyObject_Str(v);
     452        2709 :     if (res == NULL)
     453           0 :         return NULL;
     454             : #ifdef Py_USING_UNICODE
     455        2709 :     if (PyUnicode_Check(res)) {
     456             :         PyObject* str;
     457           0 :         str = PyUnicode_AsEncodedString(res, NULL, NULL);
     458           0 :         Py_DECREF(res);
     459           0 :         if (str)
     460           0 :             res = str;
     461             :         else
     462           0 :             return NULL;
     463             :     }
     464             : #endif
     465             :     assert(PyString_Check(res));
     466        2709 :     return res;
     467             : }
     468             : 
     469             : #ifdef Py_USING_UNICODE
     470             : PyObject *
     471           3 : PyObject_Unicode(PyObject *v)
     472             : {
     473             :     PyObject *res;
     474             :     PyObject *func;
     475             :     PyObject *str;
     476           3 :     int unicode_method_found = 0;
     477             :     static PyObject *unicodestr = NULL;
     478             : 
     479           3 :     if (v == NULL) {
     480           0 :         res = PyString_FromString("<NULL>");
     481           0 :         if (res == NULL)
     482           0 :             return NULL;
     483           0 :         str = PyUnicode_FromEncodedObject(res, NULL, "strict");
     484           0 :         Py_DECREF(res);
     485           0 :         return str;
     486           3 :     } else if (PyUnicode_CheckExact(v)) {
     487           0 :         Py_INCREF(v);
     488           0 :         return v;
     489             :     }
     490             : 
     491           3 :     if (PyInstance_Check(v)) {
     492             :         /* We're an instance of a classic class */
     493             :         /* Try __unicode__ from the instance -- alas we have no type */
     494           0 :         if (!unicodestr) {
     495           0 :             unicodestr = PyString_InternFromString("__unicode__");
     496           0 :             if (!unicodestr)
     497           0 :                 return NULL;
     498             :         }
     499           0 :         func = PyObject_GetAttr(v, unicodestr);
     500           0 :         if (func != NULL) {
     501           0 :             unicode_method_found = 1;
     502           0 :             res = PyObject_CallFunctionObjArgs(func, NULL);
     503           0 :             Py_DECREF(func);
     504             :         }
     505             :         else {
     506           0 :             PyErr_Clear();
     507             :         }
     508             :     }
     509             :     else {
     510             :         /* Not a classic class instance, try __unicode__. */
     511           3 :         func = _PyObject_LookupSpecial(v, "__unicode__", &unicodestr);
     512           3 :         if (func != NULL) {
     513           0 :             unicode_method_found = 1;
     514           0 :             res = PyObject_CallFunctionObjArgs(func, NULL);
     515           0 :             Py_DECREF(func);
     516             :         }
     517           3 :         else if (PyErr_Occurred())
     518           0 :             return NULL;
     519             :     }
     520             : 
     521             :     /* Didn't find __unicode__ */
     522           3 :     if (!unicode_method_found) {
     523           3 :         if (PyUnicode_Check(v)) {
     524             :             /* For a Unicode subtype that's didn't overwrite __unicode__,
     525             :                return a true Unicode object with the same data. */
     526           0 :             return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(v),
     527             :                                          PyUnicode_GET_SIZE(v));
     528             :         }
     529           3 :         if (PyString_CheckExact(v)) {
     530           3 :             Py_INCREF(v);
     531           3 :             res = v;
     532             :         }
     533             :         else {
     534           0 :             if (Py_TYPE(v)->tp_str != NULL)
     535           0 :                 res = (*Py_TYPE(v)->tp_str)(v);
     536             :             else
     537           0 :                 res = PyObject_Repr(v);
     538             :         }
     539             :     }
     540             : 
     541           3 :     if (res == NULL)
     542           0 :         return NULL;
     543           3 :     if (!PyUnicode_Check(res)) {
     544           3 :         str = PyUnicode_FromEncodedObject(res, NULL, "strict");
     545           3 :         Py_DECREF(res);
     546           3 :         res = str;
     547             :     }
     548           3 :     return res;
     549             : }
     550             : #endif
     551             : 
     552             : 
     553             : /* Helper to warn about deprecated tp_compare return values.  Return:
     554             :    -2 for an exception;
     555             :    -1 if v <  w;
     556             :     0 if v == w;
     557             :     1 if v  > w.
     558             :    (This function cannot return 2.)
     559             : */
     560             : static int
     561        8537 : adjust_tp_compare(int c)
     562             : {
     563        8537 :     if (PyErr_Occurred()) {
     564           0 :         if (c != -1 && c != -2) {
     565             :             PyObject *t, *v, *tb;
     566           0 :             PyErr_Fetch(&t, &v, &tb);
     567           0 :             if (PyErr_Warn(PyExc_RuntimeWarning,
     568             :                            "tp_compare didn't return -1 or -2 "
     569             :                            "for exception") < 0) {
     570           0 :                 Py_XDECREF(t);
     571           0 :                 Py_XDECREF(v);
     572           0 :                 Py_XDECREF(tb);
     573             :             }
     574             :             else
     575           0 :                 PyErr_Restore(t, v, tb);
     576             :         }
     577           0 :         return -2;
     578             :     }
     579        8537 :     else if (c < -1 || c > 1) {
     580           0 :         if (PyErr_Warn(PyExc_RuntimeWarning,
     581             :                        "tp_compare didn't return -1, 0 or 1") < 0)
     582           0 :             return -2;
     583             :         else
     584           0 :             return c < -1 ? -1 : 1;
     585             :     }
     586             :     else {
     587             :         assert(c >= -1 && c <= 1);
     588        8537 :         return c;
     589             :     }
     590             : }
     591             : 
     592             : 
     593             : /* Macro to get the tp_richcompare field of a type if defined */
     594             : #define RICHCOMPARE(t) (PyType_HasFeature((t), Py_TPFLAGS_HAVE_RICHCOMPARE) \
     595             :              ? (t)->tp_richcompare : NULL)
     596             : 
     597             : /* Map rich comparison operators to their swapped version, e.g. LT --> GT */
     598             : int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
     599             : 
     600             : /* Try a genuine rich comparison, returning an object.  Return:
     601             :    NULL for exception;
     602             :    NotImplemented if this particular rich comparison is not implemented or
     603             :      undefined;
     604             :    some object not equal to NotImplemented if it is implemented
     605             :      (this latter object may not be a Boolean).
     606             : */
     607             : static PyObject *
     608       11021 : try_rich_compare(PyObject *v, PyObject *w, int op)
     609             : {
     610             :     richcmpfunc f;
     611             :     PyObject *res;
     612             : 
     613       21906 :     if (v->ob_type != w->ob_type &&
     614       10885 :         PyType_IsSubtype(w->ob_type, v->ob_type) &&
     615           0 :         (f = RICHCOMPARE(w->ob_type)) != NULL) {
     616           0 :         res = (*f)(w, v, _Py_SwappedOp[op]);
     617           0 :         if (res != Py_NotImplemented)
     618           0 :             return res;
     619           0 :         Py_DECREF(res);
     620             :     }
     621       11021 :     if ((f = RICHCOMPARE(v->ob_type)) != NULL) {
     622        2140 :         res = (*f)(v, w, op);
     623        2140 :         if (res != Py_NotImplemented)
     624         171 :             return res;
     625        1969 :         Py_DECREF(res);
     626             :     }
     627       10850 :     if ((f = RICHCOMPARE(w->ob_type)) != NULL) {
     628        1061 :         return (*f)(w, v, _Py_SwappedOp[op]);
     629             :     }
     630        9789 :     res = Py_NotImplemented;
     631        9789 :     Py_INCREF(res);
     632        9789 :     return res;
     633             : }
     634             : 
     635             : /* Try a genuine rich comparison, returning an int.  Return:
     636             :    -1 for exception (including the case where try_rich_compare() returns an
     637             :       object that's not a Boolean);
     638             :     0 if the outcome is false;
     639             :     1 if the outcome is true;
     640             :     2 if this particular rich comparison is not implemented or undefined.
     641             : */
     642             : static int
     643           0 : try_rich_compare_bool(PyObject *v, PyObject *w, int op)
     644             : {
     645             :     PyObject *res;
     646             :     int ok;
     647             : 
     648           0 :     if (RICHCOMPARE(v->ob_type) == NULL && RICHCOMPARE(w->ob_type) == NULL)
     649           0 :         return 2; /* Shortcut, avoid INCREF+DECREF */
     650           0 :     res = try_rich_compare(v, w, op);
     651           0 :     if (res == NULL)
     652           0 :         return -1;
     653           0 :     if (res == Py_NotImplemented) {
     654           0 :         Py_DECREF(res);
     655           0 :         return 2;
     656             :     }
     657           0 :     ok = PyObject_IsTrue(res);
     658           0 :     Py_DECREF(res);
     659           0 :     return ok;
     660             : }
     661             : 
     662             : /* Try rich comparisons to determine a 3-way comparison.  Return:
     663             :    -2 for an exception;
     664             :    -1 if v  < w;
     665             :     0 if v == w;
     666             :     1 if v  > w;
     667             :     2 if this particular rich comparison is not implemented or undefined.
     668             : */
     669             : static int
     670           0 : try_rich_to_3way_compare(PyObject *v, PyObject *w)
     671             : {
     672             :     static struct { int op; int outcome; } tries[3] = {
     673             :         /* Try this operator, and if it is true, use this outcome: */
     674             :         {Py_EQ, 0},
     675             :         {Py_LT, -1},
     676             :         {Py_GT, 1},
     677             :     };
     678             :     int i;
     679             : 
     680           0 :     if (RICHCOMPARE(v->ob_type) == NULL && RICHCOMPARE(w->ob_type) == NULL)
     681           0 :         return 2; /* Shortcut */
     682             : 
     683           0 :     for (i = 0; i < 3; i++) {
     684           0 :         switch (try_rich_compare_bool(v, w, tries[i].op)) {
     685             :         case -1:
     686           0 :             return -2;
     687             :         case 1:
     688           0 :             return tries[i].outcome;
     689             :         }
     690             :     }
     691             : 
     692           0 :     return 2;
     693             : }
     694             : 
     695             : /* Try a 3-way comparison, returning an int.  Return:
     696             :    -2 for an exception;
     697             :    -1 if v <  w;
     698             :     0 if v == w;
     699             :     1 if v  > w;
     700             :     2 if this particular 3-way comparison is not implemented or undefined.
     701             : */
     702             : static int
     703       10792 : try_3way_compare(PyObject *v, PyObject *w)
     704             : {
     705             :     int c;
     706             :     cmpfunc f;
     707             : 
     708             :     /* Comparisons involving instances are given to instance_compare,
     709             :        which has the same return conventions as this function. */
     710             : 
     711       10792 :     f = v->ob_type->tp_compare;
     712       10792 :     if (PyInstance_Check(v))
     713           9 :         return (*f)(v, w);
     714       10783 :     if (PyInstance_Check(w))
     715           0 :         return (*w->ob_type->tp_compare)(v, w);
     716             : 
     717             :     /* If both have the same (non-NULL) tp_compare, use it. */
     718       10783 :     if (f != NULL && f == w->ob_type->tp_compare) {
     719           0 :         c = (*f)(v, w);
     720           0 :         return adjust_tp_compare(c);
     721             :     }
     722             : 
     723             :     /* If either tp_compare is _PyObject_SlotCompare, that's safe. */
     724       21566 :     if (f == _PyObject_SlotCompare ||
     725       10783 :         w->ob_type->tp_compare == _PyObject_SlotCompare)
     726           0 :         return _PyObject_SlotCompare(v, w);
     727             : 
     728             :     /* If we're here, v and w,
     729             :         a) are not instances;
     730             :         b) have different types or a type without tp_compare; and
     731             :         c) don't have a user-defined tp_compare.
     732             :        tp_compare implementations in C assume that both arguments
     733             :        have their type, so we give up if the coercion fails or if
     734             :        it yields types which are still incompatible (which can
     735             :        happen with a user-defined nb_coerce).
     736             :     */
     737       10783 :     c = PyNumber_CoerceEx(&v, &w);
     738       10783 :     if (c < 0)
     739           0 :         return -2;
     740       10783 :     if (c > 0)
     741        5587 :         return 2;
     742        5196 :     f = v->ob_type->tp_compare;
     743        5196 :     if (f != NULL && f == w->ob_type->tp_compare) {
     744        5196 :         c = (*f)(v, w);
     745        5196 :         Py_DECREF(v);
     746        5196 :         Py_DECREF(w);
     747        5196 :         return adjust_tp_compare(c);
     748             :     }
     749             : 
     750             :     /* No comparison defined */
     751           0 :     Py_DECREF(v);
     752           0 :     Py_DECREF(w);
     753           0 :     return 2;
     754             : }
     755             : 
     756             : /* Final fallback 3-way comparison, returning an int.  Return:
     757             :    -2 if an error occurred;
     758             :    -1 if v <  w;
     759             :     0 if v == w;
     760             :     1 if v >  w.
     761             : */
     762             : static int
     763        5596 : default_3way_compare(PyObject *v, PyObject *w)
     764             : {
     765             :     int c;
     766             :     const char *vname, *wname;
     767             : 
     768        5596 :     if (v->ob_type == w->ob_type) {
     769             :         /* When comparing these pointers, they must be cast to
     770             :          * integer types (i.e. Py_uintptr_t, our spelling of C9X's
     771             :          * uintptr_t).  ANSI specifies that pointer compares other
     772             :          * than == and != to non-related structures are undefined.
     773             :          */
     774         136 :         Py_uintptr_t vv = (Py_uintptr_t)v;
     775         136 :         Py_uintptr_t ww = (Py_uintptr_t)w;
     776         136 :         return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
     777             :     }
     778             : 
     779             :     /* None is smaller than anything */
     780        5460 :     if (v == Py_None)
     781         867 :         return -1;
     782        4593 :     if (w == Py_None)
     783        4593 :         return 1;
     784             : 
     785             :     /* different type: compare type names; numbers are smaller */
     786           0 :     if (PyNumber_Check(v))
     787           0 :         vname = "";
     788             :     else
     789           0 :         vname = v->ob_type->tp_name;
     790           0 :     if (PyNumber_Check(w))
     791           0 :         wname = "";
     792             :     else
     793           0 :         wname = w->ob_type->tp_name;
     794           0 :     c = strcmp(vname, wname);
     795           0 :     if (c < 0)
     796           0 :         return -1;
     797           0 :     if (c > 0)
     798           0 :         return 1;
     799             :     /* Same type name, or (more likely) incomparable numeric types */
     800           0 :     return ((Py_uintptr_t)(v->ob_type) < (
     801           0 :         Py_uintptr_t)(w->ob_type)) ? -1 : 1;
     802             : }
     803             : 
     804             : /* Do a 3-way comparison, by hook or by crook.  Return:
     805             :    -2 for an exception (but see below);
     806             :    -1 if v <  w;
     807             :     0 if v == w;
     808             :     1 if v >  w;
     809             :    BUT: if the object implements a tp_compare function, it returns
     810             :    whatever this function returns (whether with an exception or not).
     811             : */
     812             : static int
     813           0 : do_cmp(PyObject *v, PyObject *w)
     814             : {
     815             :     int c;
     816             :     cmpfunc f;
     817             : 
     818           0 :     if (v->ob_type == w->ob_type
     819           0 :         && (f = v->ob_type->tp_compare) != NULL) {
     820           0 :         c = (*f)(v, w);
     821           0 :         if (PyInstance_Check(v)) {
     822             :             /* Instance tp_compare has a different signature.
     823             :                But if it returns undefined we fall through. */
     824           0 :             if (c != 2)
     825           0 :                 return c;
     826             :             /* Else fall through to try_rich_to_3way_compare() */
     827             :         }
     828             :         else
     829           0 :             return adjust_tp_compare(c);
     830             :     }
     831             :     /* We only get here if one of the following is true:
     832             :        a) v and w have different types
     833             :        b) v and w have the same type, which doesn't have tp_compare
     834             :        c) v and w are instances, and either __cmp__ is not defined or
     835             :           __cmp__ returns NotImplemented
     836             :     */
     837           0 :     c = try_rich_to_3way_compare(v, w);
     838           0 :     if (c < 2)
     839           0 :         return c;
     840           0 :     c = try_3way_compare(v, w);
     841           0 :     if (c < 2)
     842           0 :         return c;
     843           0 :     return default_3way_compare(v, w);
     844             : }
     845             : 
     846             : /* Compare v to w.  Return
     847             :    -1 if v <  w or exception (PyErr_Occurred() true in latter case).
     848             :     0 if v == w.
     849             :     1 if v > w.
     850             :    XXX The docs (C API manual) say the return value is undefined in case
     851             :    XXX of error.
     852             : */
     853             : int
     854           0 : PyObject_Compare(PyObject *v, PyObject *w)
     855             : {
     856             :     int result;
     857             : 
     858           0 :     if (v == NULL || w == NULL) {
     859           0 :         PyErr_BadInternalCall();
     860           0 :         return -1;
     861             :     }
     862           0 :     if (v == w)
     863           0 :         return 0;
     864           0 :     if (Py_EnterRecursiveCall(" in cmp"))
     865           0 :         return -1;
     866           0 :     result = do_cmp(v, w);
     867           0 :     Py_LeaveRecursiveCall();
     868           0 :     return result < 0 ? -1 : result;
     869             : }
     870             : 
     871             : /* Return (new reference to) Py_True or Py_False. */
     872             : static PyObject *
     873       14133 : convert_3way_to_object(int op, int c)
     874             : {
     875             :     PyObject *result;
     876       14133 :     switch (op) {
     877        6015 :     case Py_LT: c = c <  0; break;
     878           0 :     case Py_LE: c = c <= 0; break;
     879        7607 :     case Py_EQ: c = c == 0; break;
     880         127 :     case Py_NE: c = c != 0; break;
     881         381 :     case Py_GT: c = c >  0; break;
     882           3 :     case Py_GE: c = c >= 0; break;
     883             :     }
     884       14133 :     result = c ? Py_True : Py_False;
     885       14133 :     Py_INCREF(result);
     886       14133 :     return result;
     887             : }
     888             : 
     889             : /* We want a rich comparison but don't have one.  Try a 3-way cmp instead.
     890             :    Return
     891             :    NULL      if error
     892             :    Py_True   if v op w
     893             :    Py_False  if not (v op w)
     894             : */
     895             : static PyObject *
     896       10792 : try_3way_to_rich_compare(PyObject *v, PyObject *w, int op)
     897             : {
     898             :     int c;
     899             : 
     900       10792 :     c = try_3way_compare(v, w);
     901       10792 :     if (c >= 2) {
     902             : 
     903             :         /* Py3K warning if types are not equal and comparison isn't == or !=  */
     904        5596 :         if (Py_Py3kWarningFlag &&
     905           0 :             v->ob_type != w->ob_type && op != Py_EQ && op != Py_NE &&
     906           0 :             PyErr_WarnEx(PyExc_DeprecationWarning,
     907             :                        "comparing unequal types not supported "
     908             :                        "in 3.x", 1) < 0) {
     909           0 :             return NULL;
     910             :         }
     911             : 
     912        5596 :         c = default_3way_compare(v, w);
     913             :     }
     914       10792 :     if (c <= -2)
     915           0 :         return NULL;
     916       10792 :     return convert_3way_to_object(op, c);
     917             : }
     918             : 
     919             : /* Do rich comparison on v and w.  Return
     920             :    NULL      if error
     921             :    Else a new reference to an object other than Py_NotImplemented, usually(?):
     922             :    Py_True   if v op w
     923             :    Py_False  if not (v op w)
     924             : */
     925             : static PyObject *
     926       11021 : do_richcmp(PyObject *v, PyObject *w, int op)
     927             : {
     928             :     PyObject *res;
     929             : 
     930       11021 :     res = try_rich_compare(v, w, op);
     931       11021 :     if (res != Py_NotImplemented)
     932         229 :         return res;
     933       10792 :     Py_DECREF(res);
     934             : 
     935       10792 :     return try_3way_to_rich_compare(v, w, op);
     936             : }
     937             : 
     938             : /* Return:
     939             :    NULL for exception;
     940             :    some object not equal to NotImplemented if it is implemented
     941             :      (this latter object may not be a Boolean).
     942             : */
     943             : PyObject *
     944      119473 : PyObject_RichCompare(PyObject *v, PyObject *w, int op)
     945             : {
     946             :     PyObject *res;
     947             : 
     948             :     assert(Py_LT <= op && op <= Py_GE);
     949      119473 :     if (Py_EnterRecursiveCall(" in cmp"))
     950           0 :         return NULL;
     951             : 
     952             :     /* If the types are equal, and not old-style instances, try to
     953             :        get out cheap (don't bother with coercions etc.). */
     954      119473 :     if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
     955             :         cmpfunc fcmp;
     956      108579 :         richcmpfunc frich = RICHCOMPARE(v->ob_type);
     957             :         /* If the type has richcmp, try it first.  try_rich_compare
     958             :            tries it two-sided, which is not needed since we've a
     959             :            single type only. */
     960      108579 :         if (frich != NULL) {
     961      105238 :             res = (*frich)(v, w, op);
     962      105238 :             if (res != Py_NotImplemented)
     963      105111 :                 goto Done;
     964         127 :             Py_DECREF(res);
     965             :         }
     966             :         /* No richcmp, or this particular richmp not implemented.
     967             :            Try 3-way cmp. */
     968        3468 :         fcmp = v->ob_type->tp_compare;
     969        3468 :         if (fcmp != NULL) {
     970        3341 :             int c = (*fcmp)(v, w);
     971        3341 :             c = adjust_tp_compare(c);
     972        3341 :             if (c == -2) {
     973           0 :                 res = NULL;
     974           0 :                 goto Done;
     975             :             }
     976        3341 :             res = convert_3way_to_object(op, c);
     977        3341 :             goto Done;
     978             :         }
     979             :     }
     980             : 
     981             :     /* Fast path not taken, or couldn't deliver a useful result. */
     982       11021 :     res = do_richcmp(v, w, op);
     983             : Done:
     984      119473 :     Py_LeaveRecursiveCall();
     985      119473 :     return res;
     986             : }
     987             : 
     988             : /* Return -1 if error; 1 if v op w; 0 if not (v op w). */
     989             : int
     990      112856 : PyObject_RichCompareBool(PyObject *v, PyObject *w, int op)
     991             : {
     992             :     PyObject *res;
     993             :     int ok;
     994             : 
     995             :     /* Quick result when objects are the same.
     996             :        Guarantees that identity implies equality. */
     997      112856 :     if (v == w) {
     998       35901 :         if (op == Py_EQ)
     999       35654 :             return 1;
    1000         247 :         else if (op == Py_NE)
    1001           0 :             return 0;
    1002             :     }
    1003             : 
    1004       77202 :     res = PyObject_RichCompare(v, w, op);
    1005       77202 :     if (res == NULL)
    1006           0 :         return -1;
    1007       77202 :     if (PyBool_Check(res))
    1008       77202 :         ok = (res == Py_True);
    1009             :     else
    1010           0 :         ok = PyObject_IsTrue(res);
    1011       77202 :     Py_DECREF(res);
    1012       77202 :     return ok;
    1013             : }
    1014             : 
    1015             : /* Set of hash utility functions to help maintaining the invariant that
    1016             :     if a==b then hash(a)==hash(b)
    1017             : 
    1018             :    All the utility functions (_Py_Hash*()) return "-1" to signify an error.
    1019             : */
    1020             : 
    1021             : long
    1022           4 : _Py_HashDouble(double v)
    1023             : {
    1024             :     double intpart, fractpart;
    1025             :     int expo;
    1026             :     long hipart;
    1027             :     long x;             /* the final hash value */
    1028             :     /* This is designed so that Python numbers of different types
    1029             :      * that compare equal hash to the same value; otherwise comparisons
    1030             :      * of mapping keys will turn out weird.
    1031             :      */
    1032             : 
    1033           4 :     if (!Py_IS_FINITE(v)) {
    1034           0 :         if (Py_IS_INFINITY(v))
    1035           0 :             return v < 0 ? -271828 : 314159;
    1036             :         else
    1037           0 :             return 0;
    1038             :     }
    1039           4 :     fractpart = modf(v, &intpart);
    1040           4 :     if (fractpart == 0.0) {
    1041             :         /* This must return the same hash as an equal int or long. */
    1042           0 :         if (intpart > LONG_MAX/2 || -intpart > LONG_MAX/2) {
    1043             :             /* Convert to long and use its hash. */
    1044             :             PyObject *plong;                    /* converted to Python long */
    1045           0 :             plong = PyLong_FromDouble(v);
    1046           0 :             if (plong == NULL)
    1047           0 :                 return -1;
    1048           0 :             x = PyObject_Hash(plong);
    1049           0 :             Py_DECREF(plong);
    1050           0 :             return x;
    1051             :         }
    1052             :         /* Fits in a C long == a Python int, so is its own hash. */
    1053           0 :         x = (long)intpart;
    1054           0 :         if (x == -1)
    1055           0 :             x = -2;
    1056           0 :         return x;
    1057             :     }
    1058             :     /* The fractional part is non-zero, so we don't have to worry about
    1059             :      * making this match the hash of some other type.
    1060             :      * Use frexp to get at the bits in the double.
    1061             :      * Since the VAX D double format has 56 mantissa bits, which is the
    1062             :      * most of any double format in use, each of these parts may have as
    1063             :      * many as (but no more than) 56 significant bits.
    1064             :      * So, assuming sizeof(long) >= 4, each part can be broken into two
    1065             :      * longs; frexp and multiplication are used to do that.
    1066             :      * Also, since the Cray double format has 15 exponent bits, which is
    1067             :      * the most of any double format in use, shifting the exponent field
    1068             :      * left by 15 won't overflow a long (again assuming sizeof(long) >= 4).
    1069             :      */
    1070           4 :     v = frexp(v, &expo);
    1071           4 :     v *= 2147483648.0;          /* 2**31 */
    1072           4 :     hipart = (long)v;           /* take the top 32 bits */
    1073           4 :     v = (v - (double)hipart) * 2147483648.0; /* get the next 32 bits */
    1074           4 :     x = hipart + (long)v + (expo << 15);
    1075           4 :     if (x == -1)
    1076           0 :         x = -2;
    1077           4 :     return x;
    1078             : }
    1079             : 
    1080             : long
    1081       53468 : _Py_HashPointer(void *p)
    1082             : {
    1083             :     long x;
    1084       53468 :     size_t y = (size_t)p;
    1085             :     /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid
    1086             :        excessive hash collisions for dicts and sets */
    1087       53468 :     y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4));
    1088       53468 :     x = (long)y;
    1089       53468 :     if (x == -1)
    1090           0 :         x = -2;
    1091       53468 :     return x;
    1092             : }
    1093             : 
    1094             : long
    1095           0 : PyObject_HashNotImplemented(PyObject *self)
    1096             : {
    1097           0 :     PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
    1098           0 :                  self->ob_type->tp_name);
    1099           0 :     return -1;
    1100             : }
    1101             : 
    1102             : _Py_HashSecret_t _Py_HashSecret;
    1103             : 
    1104             : long
    1105      332869 : PyObject_Hash(PyObject *v)
    1106             : {
    1107      332869 :     PyTypeObject *tp = v->ob_type;
    1108      332869 :     if (tp->tp_hash != NULL)
    1109      332869 :         return (*tp->tp_hash)(v);
    1110             :     /* To keep to the general practice that inheriting
    1111             :      * solely from object in C code should work without
    1112             :      * an explicit call to PyType_Ready, we implicitly call
    1113             :      * PyType_Ready here and then check the tp_hash slot again
    1114             :      */
    1115           0 :     if (tp->tp_dict == NULL) {
    1116           0 :         if (PyType_Ready(tp) < 0)
    1117           0 :             return -1;
    1118           0 :         if (tp->tp_hash != NULL)
    1119           0 :             return (*tp->tp_hash)(v);
    1120             :     }
    1121           0 :     if (tp->tp_compare == NULL && RICHCOMPARE(tp) == NULL) {
    1122           0 :         return _Py_HashPointer(v); /* Use address as hash value */
    1123             :     }
    1124             :     /* If there's a cmp but no hash defined, the object can't be hashed */
    1125           0 :     return PyObject_HashNotImplemented(v);
    1126             : }
    1127             : 
    1128             : PyObject *
    1129        3795 : PyObject_GetAttrString(PyObject *v, const char *name)
    1130             : {
    1131             :     PyObject *w, *res;
    1132             : 
    1133        3795 :     if (Py_TYPE(v)->tp_getattr != NULL)
    1134           0 :         return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
    1135        3795 :     w = PyString_InternFromString(name);
    1136        3795 :     if (w == NULL)
    1137           0 :         return NULL;
    1138        3795 :     res = PyObject_GetAttr(v, w);
    1139        3795 :     Py_XDECREF(w);
    1140        3795 :     return res;
    1141             : }
    1142             : 
    1143             : int
    1144        1809 : PyObject_HasAttrString(PyObject *v, const char *name)
    1145             : {
    1146        1809 :     PyObject *res = PyObject_GetAttrString(v, name);
    1147        1809 :     if (res != NULL) {
    1148        1431 :         Py_DECREF(res);
    1149        1431 :         return 1;
    1150             :     }
    1151         378 :     PyErr_Clear();
    1152         378 :     return 0;
    1153             : }
    1154             : 
    1155             : int
    1156           0 : PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
    1157             : {
    1158             :     PyObject *s;
    1159             :     int res;
    1160             : 
    1161           0 :     if (Py_TYPE(v)->tp_setattr != NULL)
    1162           0 :         return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
    1163           0 :     s = PyString_InternFromString(name);
    1164           0 :     if (s == NULL)
    1165           0 :         return -1;
    1166           0 :     res = PyObject_SetAttr(v, s, w);
    1167           0 :     Py_XDECREF(s);
    1168           0 :     return res;
    1169             : }
    1170             : 
    1171             : PyObject *
    1172      277877 : PyObject_GetAttr(PyObject *v, PyObject *name)
    1173             : {
    1174      277877 :     PyTypeObject *tp = Py_TYPE(v);
    1175             : 
    1176      277877 :     if (!PyString_Check(name)) {
    1177             : #ifdef Py_USING_UNICODE
    1178             :         /* The Unicode to string conversion is done here because the
    1179             :            existing tp_getattro slots expect a string object as name
    1180             :            and we wouldn't want to break those. */
    1181           0 :         if (PyUnicode_Check(name)) {
    1182           0 :             name = _PyUnicode_AsDefaultEncodedString(name, NULL);
    1183           0 :             if (name == NULL)
    1184           0 :                 return NULL;
    1185             :         }
    1186             :         else
    1187             : #endif
    1188             :         {
    1189           0 :             PyErr_Format(PyExc_TypeError,
    1190             :                          "attribute name must be string, not '%.200s'",
    1191           0 :                          Py_TYPE(name)->tp_name);
    1192           0 :             return NULL;
    1193             :         }
    1194             :     }
    1195      277877 :     if (tp->tp_getattro != NULL)
    1196      277877 :         return (*tp->tp_getattro)(v, name);
    1197           0 :     if (tp->tp_getattr != NULL)
    1198           0 :         return (*tp->tp_getattr)(v, PyString_AS_STRING(name));
    1199           0 :     PyErr_Format(PyExc_AttributeError,
    1200             :                  "'%.50s' object has no attribute '%.400s'",
    1201           0 :                  tp->tp_name, PyString_AS_STRING(name));
    1202           0 :     return NULL;
    1203             : }
    1204             : 
    1205             : int
    1206         270 : PyObject_HasAttr(PyObject *v, PyObject *name)
    1207             : {
    1208         270 :     PyObject *res = PyObject_GetAttr(v, name);
    1209         270 :     if (res != NULL) {
    1210         192 :         Py_DECREF(res);
    1211         192 :         return 1;
    1212             :     }
    1213          78 :     PyErr_Clear();
    1214          78 :     return 0;
    1215             : }
    1216             : 
    1217             : int
    1218       50013 : PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
    1219             : {
    1220       50013 :     PyTypeObject *tp = Py_TYPE(v);
    1221             :     int err;
    1222             : 
    1223       50013 :     if (!PyString_Check(name)){
    1224             : #ifdef Py_USING_UNICODE
    1225             :         /* The Unicode to string conversion is done here because the
    1226             :            existing tp_setattro slots expect a string object as name
    1227             :            and we wouldn't want to break those. */
    1228           0 :         if (PyUnicode_Check(name)) {
    1229           0 :             name = PyUnicode_AsEncodedString(name, NULL, NULL);
    1230           0 :             if (name == NULL)
    1231           0 :                 return -1;
    1232             :         }
    1233             :         else
    1234             : #endif
    1235             :         {
    1236           0 :             PyErr_Format(PyExc_TypeError,
    1237             :                          "attribute name must be string, not '%.200s'",
    1238           0 :                          Py_TYPE(name)->tp_name);
    1239           0 :             return -1;
    1240             :         }
    1241             :     }
    1242             :     else
    1243       50013 :         Py_INCREF(name);
    1244             : 
    1245       50013 :     PyString_InternInPlace(&name);
    1246       50013 :     if (tp->tp_setattro != NULL) {
    1247       50013 :         err = (*tp->tp_setattro)(v, name, value);
    1248       50013 :         Py_DECREF(name);
    1249       50013 :         return err;
    1250             :     }
    1251           0 :     if (tp->tp_setattr != NULL) {
    1252           0 :         err = (*tp->tp_setattr)(v, PyString_AS_STRING(name), value);
    1253           0 :         Py_DECREF(name);
    1254           0 :         return err;
    1255             :     }
    1256           0 :     Py_DECREF(name);
    1257           0 :     if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
    1258           0 :         PyErr_Format(PyExc_TypeError,
    1259             :                      "'%.100s' object has no attributes "
    1260             :                      "(%s .%.100s)",
    1261             :                      tp->tp_name,
    1262             :                      value==NULL ? "del" : "assign to",
    1263           0 :                      PyString_AS_STRING(name));
    1264             :     else
    1265           0 :         PyErr_Format(PyExc_TypeError,
    1266             :                      "'%.100s' object has only read-only attributes "
    1267             :                      "(%s .%.100s)",
    1268             :                      tp->tp_name,
    1269             :                      value==NULL ? "del" : "assign to",
    1270           0 :                      PyString_AS_STRING(name));
    1271           0 :     return -1;
    1272             : }
    1273             : 
    1274             : /* Helper to get a pointer to an object's __dict__ slot, if any */
    1275             : 
    1276             : PyObject **
    1277       16366 : _PyObject_GetDictPtr(PyObject *obj)
    1278             : {
    1279             :     Py_ssize_t dictoffset;
    1280       16366 :     PyTypeObject *tp = Py_TYPE(obj);
    1281             : 
    1282       16366 :     if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS))
    1283           0 :         return NULL;
    1284       16366 :     dictoffset = tp->tp_dictoffset;
    1285       16366 :     if (dictoffset == 0)
    1286           0 :         return NULL;
    1287       16366 :     if (dictoffset < 0) {
    1288             :         Py_ssize_t tsize;
    1289             :         size_t size;
    1290             : 
    1291          42 :         tsize = ((PyVarObject *)obj)->ob_size;
    1292          42 :         if (tsize < 0)
    1293           0 :             tsize = -tsize;
    1294          42 :         size = _PyObject_VAR_SIZE(tp, tsize);
    1295             : 
    1296          42 :         dictoffset += (long)size;
    1297             :         assert(dictoffset > 0);
    1298             :         assert(dictoffset % SIZEOF_VOID_P == 0);
    1299             :     }
    1300       16366 :     return (PyObject **) ((char *)obj + dictoffset);
    1301             : }
    1302             : 
    1303             : PyObject *
    1304        2394 : PyObject_SelfIter(PyObject *obj)
    1305             : {
    1306        2394 :     Py_INCREF(obj);
    1307        2394 :     return obj;
    1308             : }
    1309             : 
    1310             : /* Helper used when the __next__ method is removed from a type:
    1311             :    tp_iternext is never NULL and can be safely called without checking
    1312             :    on every iteration.
    1313             :  */
    1314             : 
    1315             : PyObject *
    1316           0 : _PyObject_NextNotImplemented(PyObject *self)
    1317             : {
    1318           0 :     PyErr_Format(PyExc_TypeError,
    1319             :                  "'%.200s' object is not iterable",
    1320           0 :                  Py_TYPE(self)->tp_name);
    1321           0 :     return NULL;
    1322             : }
    1323             : 
    1324             : /* Generic GetAttr functions - put these in your tp_[gs]etattro slot */
    1325             : 
    1326             : PyObject *
    1327       98750 : _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict)
    1328             : {
    1329       98750 :     PyTypeObject *tp = Py_TYPE(obj);
    1330       98750 :     PyObject *descr = NULL;
    1331       98750 :     PyObject *res = NULL;
    1332             :     descrgetfunc f;
    1333             :     Py_ssize_t dictoffset;
    1334             :     PyObject **dictptr;
    1335             : 
    1336       98750 :     if (!PyString_Check(name)){
    1337             : #ifdef Py_USING_UNICODE
    1338             :         /* The Unicode to string conversion is done here because the
    1339             :            existing tp_setattro slots expect a string object as name
    1340             :            and we wouldn't want to break those. */
    1341           0 :         if (PyUnicode_Check(name)) {
    1342           0 :             name = PyUnicode_AsEncodedString(name, NULL, NULL);
    1343           0 :             if (name == NULL)
    1344           0 :                 return NULL;
    1345             :         }
    1346             :         else
    1347             : #endif
    1348             :         {
    1349           0 :             PyErr_Format(PyExc_TypeError,
    1350             :                          "attribute name must be string, not '%.200s'",
    1351           0 :                          Py_TYPE(name)->tp_name);
    1352           0 :             return NULL;
    1353             :         }
    1354             :     }
    1355             :     else
    1356       98750 :         Py_INCREF(name);
    1357             : 
    1358       98750 :     if (tp->tp_dict == NULL) {
    1359           6 :         if (PyType_Ready(tp) < 0)
    1360           0 :             goto done;
    1361             :     }
    1362             : 
    1363             : #if 0 /* XXX this is not quite _PyType_Lookup anymore */
    1364             :     /* Inline _PyType_Lookup */
    1365             :     {
    1366             :         Py_ssize_t i, n;
    1367             :         PyObject *mro, *base, *dict;
    1368             : 
    1369             :         /* Look in tp_dict of types in MRO */
    1370             :         mro = tp->tp_mro;
    1371             :         assert(mro != NULL);
    1372             :         assert(PyTuple_Check(mro));
    1373             :         n = PyTuple_GET_SIZE(mro);
    1374             :         for (i = 0; i < n; i++) {
    1375             :             base = PyTuple_GET_ITEM(mro, i);
    1376             :             if (PyClass_Check(base))
    1377             :                 dict = ((PyClassObject *)base)->cl_dict;
    1378             :             else {
    1379             :                 assert(PyType_Check(base));
    1380             :                 dict = ((PyTypeObject *)base)->tp_dict;
    1381             :             }
    1382             :             assert(dict && PyDict_Check(dict));
    1383             :             descr = PyDict_GetItem(dict, name);
    1384             :             if (descr != NULL)
    1385             :                 break;
    1386             :         }
    1387             :     }
    1388             : #else
    1389       98750 :     descr = _PyType_Lookup(tp, name);
    1390             : #endif
    1391             : 
    1392       98750 :     Py_XINCREF(descr);
    1393             : 
    1394       98750 :     f = NULL;
    1395      164630 :     if (descr != NULL &&
    1396       65880 :         PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) {
    1397       65880 :         f = descr->ob_type->tp_descr_get;
    1398       65880 :         if (f != NULL && PyDescr_IsData(descr)) {
    1399       16058 :             res = f(descr, obj, (PyObject *)obj->ob_type);
    1400       16058 :             Py_DECREF(descr);
    1401       16058 :             goto done;
    1402             :         }
    1403             :     }
    1404             : 
    1405       82692 :     if (dict == NULL) {
    1406             :         /* Inline _PyObject_GetDictPtr */
    1407       82692 :         dictoffset = tp->tp_dictoffset;
    1408       82692 :         if (dictoffset != 0) {
    1409       38569 :             if (dictoffset < 0) {
    1410             :                 Py_ssize_t tsize;
    1411             :                 size_t size;
    1412             : 
    1413           0 :                 tsize = ((PyVarObject *)obj)->ob_size;
    1414           0 :                 if (tsize < 0)
    1415           0 :                     tsize = -tsize;
    1416           0 :                 size = _PyObject_VAR_SIZE(tp, tsize);
    1417             : 
    1418           0 :                 dictoffset += (long)size;
    1419             :                 assert(dictoffset > 0);
    1420             :                 assert(dictoffset % SIZEOF_VOID_P == 0);
    1421             :             }
    1422       38569 :             dictptr = (PyObject **) ((char *)obj + dictoffset);
    1423       38569 :             dict = *dictptr;
    1424             :         }
    1425             :     }
    1426       82692 :     if (dict != NULL) {
    1427       38180 :         Py_INCREF(dict);
    1428       38180 :         res = PyDict_GetItem(dict, name);
    1429       38180 :         if (res != NULL) {
    1430       31715 :             Py_INCREF(res);
    1431       31715 :             Py_XDECREF(descr);
    1432       31715 :             Py_DECREF(dict);
    1433       31715 :             goto done;
    1434             :         }
    1435        6465 :         Py_DECREF(dict);
    1436             :     }
    1437             : 
    1438       50977 :     if (f != NULL) {
    1439       47659 :         res = f(descr, obj, (PyObject *)Py_TYPE(obj));
    1440       47659 :         Py_DECREF(descr);
    1441       47659 :         goto done;
    1442             :     }
    1443             : 
    1444        3318 :     if (descr != NULL) {
    1445        2160 :         res = descr;
    1446             :         /* descr was already increfed above */
    1447        2160 :         goto done;
    1448             :     }
    1449             : 
    1450        1158 :     PyErr_Format(PyExc_AttributeError,
    1451             :                  "'%.50s' object has no attribute '%.400s'",
    1452        1158 :                  tp->tp_name, PyString_AS_STRING(name));
    1453             :   done:
    1454       98750 :     Py_DECREF(name);
    1455       98750 :     return res;
    1456             : }
    1457             : 
    1458             : PyObject *
    1459       98750 : PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
    1460             : {
    1461       98750 :     return _PyObject_GenericGetAttrWithDict(obj, name, NULL);
    1462             : }
    1463             : 
    1464             : int
    1465        6273 : _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
    1466             :                                  PyObject *value, PyObject *dict)
    1467             : {
    1468        6273 :     PyTypeObject *tp = Py_TYPE(obj);
    1469             :     PyObject *descr;
    1470             :     descrsetfunc f;
    1471             :     PyObject **dictptr;
    1472        6273 :     int res = -1;
    1473             : 
    1474        6273 :     if (!PyString_Check(name)){
    1475             : #ifdef Py_USING_UNICODE
    1476             :         /* The Unicode to string conversion is done here because the
    1477             :            existing tp_setattro slots expect a string object as name
    1478             :            and we wouldn't want to break those. */
    1479           0 :         if (PyUnicode_Check(name)) {
    1480           0 :             name = PyUnicode_AsEncodedString(name, NULL, NULL);
    1481           0 :             if (name == NULL)
    1482           0 :                 return -1;
    1483             :         }
    1484             :         else
    1485             : #endif
    1486             :         {
    1487           0 :             PyErr_Format(PyExc_TypeError,
    1488             :                          "attribute name must be string, not '%.200s'",
    1489           0 :                          Py_TYPE(name)->tp_name);
    1490           0 :             return -1;
    1491             :         }
    1492             :     }
    1493             :     else
    1494        6273 :         Py_INCREF(name);
    1495             : 
    1496        6273 :     if (tp->tp_dict == NULL) {
    1497           0 :         if (PyType_Ready(tp) < 0)
    1498           0 :             goto done;
    1499             :     }
    1500             : 
    1501        6273 :     descr = _PyType_Lookup(tp, name);
    1502        6273 :     f = NULL;
    1503        6375 :     if (descr != NULL &&
    1504         102 :         PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) {
    1505         102 :         f = descr->ob_type->tp_descr_set;
    1506         102 :         if (f != NULL && PyDescr_IsData(descr)) {
    1507          99 :             res = f(descr, obj, value);
    1508          99 :             goto done;
    1509             :         }
    1510             :     }
    1511             : 
    1512        6174 :     if (dict == NULL) {
    1513        6174 :         dictptr = _PyObject_GetDictPtr(obj);
    1514        6174 :         if (dictptr != NULL) {
    1515        6174 :             dict = *dictptr;
    1516        6174 :             if (dict == NULL && value != NULL) {
    1517        1636 :                 dict = PyDict_New();
    1518        1636 :                 if (dict == NULL)
    1519           0 :                     goto done;
    1520        1636 :                 *dictptr = dict;
    1521             :             }
    1522             :         }
    1523             :     }
    1524        6174 :     if (dict != NULL) {
    1525        6174 :         Py_INCREF(dict);
    1526        6174 :         if (value == NULL)
    1527           0 :             res = PyDict_DelItem(dict, name);
    1528             :         else
    1529        6174 :             res = PyDict_SetItem(dict, name, value);
    1530        6174 :         if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
    1531           0 :             PyErr_SetObject(PyExc_AttributeError, name);
    1532        6174 :         Py_DECREF(dict);
    1533        6174 :         goto done;
    1534             :     }
    1535             : 
    1536           0 :     if (f != NULL) {
    1537           0 :         res = f(descr, obj, value);
    1538           0 :         goto done;
    1539             :     }
    1540             : 
    1541           0 :     if (descr == NULL) {
    1542           0 :         PyErr_Format(PyExc_AttributeError,
    1543             :                      "'%.100s' object has no attribute '%.200s'",
    1544           0 :                      tp->tp_name, PyString_AS_STRING(name));
    1545           0 :         goto done;
    1546             :     }
    1547             : 
    1548           0 :     PyErr_Format(PyExc_AttributeError,
    1549             :                  "'%.50s' object attribute '%.400s' is read-only",
    1550           0 :                  tp->tp_name, PyString_AS_STRING(name));
    1551             :   done:
    1552        6273 :     Py_DECREF(name);
    1553        6273 :     return res;
    1554             : }
    1555             : 
    1556             : int
    1557        6273 : PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
    1558             : {
    1559        6273 :     return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
    1560             : }
    1561             : 
    1562             : 
    1563             : /* Test a value used as condition, e.g., in a for or if statement.
    1564             :    Return -1 if an error occurred */
    1565             : 
    1566             : int
    1567       77316 : PyObject_IsTrue(PyObject *v)
    1568             : {
    1569             :     Py_ssize_t res;
    1570       77316 :     if (v == Py_True)
    1571       11150 :         return 1;
    1572       66166 :     if (v == Py_False)
    1573        7890 :         return 0;
    1574       58276 :     if (v == Py_None)
    1575       10294 :         return 0;
    1576       89124 :     else if (v->ob_type->tp_as_number != NULL &&
    1577       41142 :              v->ob_type->tp_as_number->nb_nonzero != NULL)
    1578       31014 :         res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
    1579       32565 :     else if (v->ob_type->tp_as_mapping != NULL &&
    1580       15597 :              v->ob_type->tp_as_mapping->mp_length != NULL)
    1581       15542 :         res = (*v->ob_type->tp_as_mapping->mp_length)(v);
    1582        1610 :     else if (v->ob_type->tp_as_sequence != NULL &&
    1583         184 :              v->ob_type->tp_as_sequence->sq_length != NULL)
    1584         129 :         res = (*v->ob_type->tp_as_sequence->sq_length)(v);
    1585             :     else
    1586        1297 :         return 1;
    1587             :     /* if it is negative, it should be either -1 or -2 */
    1588       46685 :     return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int);
    1589             : }
    1590             : 
    1591             : /* equivalent of 'not v'
    1592             :    Return -1 if an error occurred */
    1593             : 
    1594             : int
    1595           0 : PyObject_Not(PyObject *v)
    1596             : {
    1597             :     int res;
    1598           0 :     res = PyObject_IsTrue(v);
    1599           0 :     if (res < 0)
    1600           0 :         return res;
    1601           0 :     return res == 0;
    1602             : }
    1603             : 
    1604             : /* Coerce two numeric types to the "larger" one.
    1605             :    Increment the reference count on each argument.
    1606             :    Return value:
    1607             :    -1 if an error occurred;
    1608             :    0 if the coercion succeeded (and then the reference counts are increased);
    1609             :    1 if no coercion is possible (and no error is raised).
    1610             : */
    1611             : int
    1612       15796 : PyNumber_CoerceEx(PyObject **pv, PyObject **pw)
    1613             : {
    1614       15796 :     register PyObject *v = *pv;
    1615       15796 :     register PyObject *w = *pw;
    1616             :     int res;
    1617             : 
    1618             :     /* Shortcut only for old-style types */
    1619       19424 :     if (v->ob_type == w->ob_type &&
    1620        3628 :         !PyType_HasFeature(v->ob_type, Py_TPFLAGS_CHECKTYPES))
    1621             :     {
    1622        3492 :         Py_INCREF(v);
    1623        3492 :         Py_INCREF(w);
    1624        3492 :         return 0;
    1625             :     }
    1626       12304 :     if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
    1627        5205 :         res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
    1628        5205 :         if (res <= 0)
    1629        3492 :             return res;
    1630             :     }
    1631        8812 :     if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
    1632        3225 :         res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
    1633        3225 :         if (res <= 0)
    1634        1704 :             return res;
    1635             :     }
    1636        7108 :     return 1;
    1637             : }
    1638             : 
    1639             : /* Coerce two numeric types to the "larger" one.
    1640             :    Increment the reference count on each argument.
    1641             :    Return -1 and raise an exception if no coercion is possible
    1642             :    (and then no reference count is incremented).
    1643             : */
    1644             : int
    1645           0 : PyNumber_Coerce(PyObject **pv, PyObject **pw)
    1646             : {
    1647           0 :     int err = PyNumber_CoerceEx(pv, pw);
    1648           0 :     if (err <= 0)
    1649           0 :         return err;
    1650           0 :     PyErr_SetString(PyExc_TypeError, "number coercion failed");
    1651           0 :     return -1;
    1652             : }
    1653             : 
    1654             : 
    1655             : /* Test whether an object can be called */
    1656             : 
    1657             : int
    1658         354 : PyCallable_Check(PyObject *x)
    1659             : {
    1660         354 :     if (x == NULL)
    1661           0 :         return 0;
    1662         354 :     if (PyInstance_Check(x)) {
    1663           0 :         PyObject *call = PyObject_GetAttrString(x, "__call__");
    1664           0 :         if (call == NULL) {
    1665           0 :             PyErr_Clear();
    1666           0 :             return 0;
    1667             :         }
    1668             :         /* Could test recursively but don't, for fear of endless
    1669             :            recursion if some joker sets self.__call__ = self */
    1670           0 :         Py_DECREF(call);
    1671           0 :         return 1;
    1672             :     }
    1673             :     else {
    1674         354 :         return x->ob_type->tp_call != NULL;
    1675             :     }
    1676             : }
    1677             : 
    1678             : /* ------------------------- PyObject_Dir() helpers ------------------------- */
    1679             : 
    1680             : /* Helper for PyObject_Dir.
    1681             :    Merge the __dict__ of aclass into dict, and recursively also all
    1682             :    the __dict__s of aclass's base classes.  The order of merging isn't
    1683             :    defined, as it's expected that only the final set of dict keys is
    1684             :    interesting.
    1685             :    Return 0 on success, -1 on error.
    1686             : */
    1687             : 
    1688             : static int
    1689           0 : merge_class_dict(PyObject* dict, PyObject* aclass)
    1690             : {
    1691             :     PyObject *classdict;
    1692             :     PyObject *bases;
    1693             : 
    1694             :     assert(PyDict_Check(dict));
    1695             :     assert(aclass);
    1696             : 
    1697             :     /* Merge in the type's dict (if any). */
    1698           0 :     classdict = PyObject_GetAttrString(aclass, "__dict__");
    1699           0 :     if (classdict == NULL)
    1700           0 :         PyErr_Clear();
    1701             :     else {
    1702           0 :         int status = PyDict_Update(dict, classdict);
    1703           0 :         Py_DECREF(classdict);
    1704           0 :         if (status < 0)
    1705           0 :             return -1;
    1706             :     }
    1707             : 
    1708             :     /* Recursively merge in the base types' (if any) dicts. */
    1709           0 :     bases = PyObject_GetAttrString(aclass, "__bases__");
    1710           0 :     if (bases == NULL)
    1711           0 :         PyErr_Clear();
    1712             :     else {
    1713             :         /* We have no guarantee that bases is a real tuple */
    1714             :         Py_ssize_t i, n;
    1715           0 :         n = PySequence_Size(bases); /* This better be right */
    1716           0 :         if (n < 0)
    1717           0 :             PyErr_Clear();
    1718             :         else {
    1719           0 :             for (i = 0; i < n; i++) {
    1720             :                 int status;
    1721           0 :                 PyObject *base = PySequence_GetItem(bases, i);
    1722           0 :                 if (base == NULL) {
    1723           0 :                     Py_DECREF(bases);
    1724           0 :                     return -1;
    1725             :                 }
    1726           0 :                 status = merge_class_dict(dict, base);
    1727           0 :                 Py_DECREF(base);
    1728           0 :                 if (status < 0) {
    1729           0 :                     Py_DECREF(bases);
    1730           0 :                     return -1;
    1731             :                 }
    1732             :             }
    1733             :         }
    1734           0 :         Py_DECREF(bases);
    1735             :     }
    1736           0 :     return 0;
    1737             : }
    1738             : 
    1739             : /* Helper for PyObject_Dir.
    1740             :    If obj has an attr named attrname that's a list, merge its string
    1741             :    elements into keys of dict.
    1742             :    Return 0 on success, -1 on error.  Errors due to not finding the attr,
    1743             :    or the attr not being a list, are suppressed.
    1744             : */
    1745             : 
    1746             : static int
    1747           0 : merge_list_attr(PyObject* dict, PyObject* obj, const char *attrname)
    1748             : {
    1749             :     PyObject *list;
    1750           0 :     int result = 0;
    1751             : 
    1752             :     assert(PyDict_Check(dict));
    1753             :     assert(obj);
    1754             :     assert(attrname);
    1755             : 
    1756           0 :     list = PyObject_GetAttrString(obj, attrname);
    1757           0 :     if (list == NULL)
    1758           0 :         PyErr_Clear();
    1759             : 
    1760           0 :     else if (PyList_Check(list)) {
    1761             :         int i;
    1762           0 :         for (i = 0; i < PyList_GET_SIZE(list); ++i) {
    1763           0 :             PyObject *item = PyList_GET_ITEM(list, i);
    1764           0 :             if (PyString_Check(item)) {
    1765           0 :                 result = PyDict_SetItem(dict, item, Py_None);
    1766           0 :                 if (result < 0)
    1767           0 :                     break;
    1768             :             }
    1769             :         }
    1770           0 :         if (Py_Py3kWarningFlag &&
    1771           0 :             (strcmp(attrname, "__members__") == 0 ||
    1772           0 :              strcmp(attrname, "__methods__") == 0)) {
    1773           0 :             if (PyErr_WarnEx(PyExc_DeprecationWarning,
    1774             :                            "__members__ and __methods__ not "
    1775             :                            "supported in 3.x", 1) < 0) {
    1776           0 :                 Py_XDECREF(list);
    1777           0 :                 return -1;
    1778             :             }
    1779             :         }
    1780             :     }
    1781             : 
    1782           0 :     Py_XDECREF(list);
    1783           0 :     return result;
    1784             : }
    1785             : 
    1786             : /* Helper for PyObject_Dir without arguments: returns the local scope. */
    1787             : static PyObject *
    1788           0 : _dir_locals(void)
    1789             : {
    1790             :     PyObject *names;
    1791           0 :     PyObject *locals = PyEval_GetLocals();
    1792             : 
    1793           0 :     if (locals == NULL) {
    1794           0 :         PyErr_SetString(PyExc_SystemError, "frame does not exist");
    1795           0 :         return NULL;
    1796             :     }
    1797             : 
    1798           0 :     names = PyMapping_Keys(locals);
    1799           0 :     if (!names)
    1800           0 :         return NULL;
    1801           0 :     if (!PyList_Check(names)) {
    1802           0 :         PyErr_Format(PyExc_TypeError,
    1803             :             "dir(): expected keys() of locals to be a list, "
    1804           0 :             "not '%.200s'", Py_TYPE(names)->tp_name);
    1805           0 :         Py_DECREF(names);
    1806           0 :         return NULL;
    1807             :     }
    1808             :     /* the locals don't need to be DECREF'd */
    1809           0 :     return names;
    1810             : }
    1811             : 
    1812             : /* Helper for PyObject_Dir of type objects: returns __dict__ and __bases__.
    1813             :    We deliberately don't suck up its __class__, as methods belonging to the
    1814             :    metaclass would probably be more confusing than helpful.
    1815             : */
    1816             : static PyObject *
    1817           0 : _specialized_dir_type(PyObject *obj)
    1818             : {
    1819           0 :     PyObject *result = NULL;
    1820           0 :     PyObject *dict = PyDict_New();
    1821             : 
    1822           0 :     if (dict != NULL && merge_class_dict(dict, obj) == 0)
    1823           0 :         result = PyDict_Keys(dict);
    1824             : 
    1825           0 :     Py_XDECREF(dict);
    1826           0 :     return result;
    1827             : }
    1828             : 
    1829             : /* Helper for PyObject_Dir of module objects: returns the module's __dict__. */
    1830             : static PyObject *
    1831           6 : _specialized_dir_module(PyObject *obj)
    1832             : {
    1833           6 :     PyObject *result = NULL;
    1834           6 :     PyObject *dict = PyObject_GetAttrString(obj, "__dict__");
    1835             : 
    1836           6 :     if (dict != NULL) {
    1837           6 :         if (PyDict_Check(dict))
    1838           6 :             result = PyDict_Keys(dict);
    1839             :         else {
    1840           0 :             char *name = PyModule_GetName(obj);
    1841           0 :             if (name)
    1842           0 :                 PyErr_Format(PyExc_TypeError,
    1843             :                              "%.200s.__dict__ is not a dictionary",
    1844             :                              name);
    1845             :         }
    1846             :     }
    1847             : 
    1848           6 :     Py_XDECREF(dict);
    1849           6 :     return result;
    1850             : }
    1851             : 
    1852             : /* Helper for PyObject_Dir of generic objects: returns __dict__, __class__,
    1853             :    and recursively up the __class__.__bases__ chain.
    1854             : */
    1855             : static PyObject *
    1856           0 : _generic_dir(PyObject *obj)
    1857             : {
    1858           0 :     PyObject *result = NULL;
    1859           0 :     PyObject *dict = NULL;
    1860           0 :     PyObject *itsclass = NULL;
    1861             : 
    1862             :     /* Get __dict__ (which may or may not be a real dict...) */
    1863           0 :     dict = PyObject_GetAttrString(obj, "__dict__");
    1864           0 :     if (dict == NULL) {
    1865           0 :         PyErr_Clear();
    1866           0 :         dict = PyDict_New();
    1867             :     }
    1868           0 :     else if (!PyDict_Check(dict)) {
    1869           0 :         Py_DECREF(dict);
    1870           0 :         dict = PyDict_New();
    1871             :     }
    1872             :     else {
    1873             :         /* Copy __dict__ to avoid mutating it. */
    1874           0 :         PyObject *temp = PyDict_Copy(dict);
    1875           0 :         Py_DECREF(dict);
    1876           0 :         dict = temp;
    1877             :     }
    1878             : 
    1879           0 :     if (dict == NULL)
    1880           0 :         goto error;
    1881             : 
    1882             :     /* Merge in __members__ and __methods__ (if any).
    1883             :      * This is removed in Python 3000. */
    1884           0 :     if (merge_list_attr(dict, obj, "__members__") < 0)
    1885           0 :         goto error;
    1886           0 :     if (merge_list_attr(dict, obj, "__methods__") < 0)
    1887           0 :         goto error;
    1888             : 
    1889             :     /* Merge in attrs reachable from its class. */
    1890           0 :     itsclass = PyObject_GetAttrString(obj, "__class__");
    1891           0 :     if (itsclass == NULL)
    1892             :         /* XXX(tomer): Perhaps fall back to obj->ob_type if no
    1893             :                        __class__ exists? */
    1894           0 :         PyErr_Clear();
    1895             :     else {
    1896           0 :         if (merge_class_dict(dict, itsclass) != 0)
    1897           0 :             goto error;
    1898             :     }
    1899             : 
    1900           0 :     result = PyDict_Keys(dict);
    1901             :     /* fall through */
    1902             : error:
    1903           0 :     Py_XDECREF(itsclass);
    1904           0 :     Py_XDECREF(dict);
    1905           0 :     return result;
    1906             : }
    1907             : 
    1908             : /* Helper for PyObject_Dir: object introspection.
    1909             :    This calls one of the above specialized versions if no __dir__ method
    1910             :    exists. */
    1911             : static PyObject *
    1912           6 : _dir_object(PyObject *obj)
    1913             : {
    1914           6 :     PyObject *result = NULL;
    1915             :     static PyObject *dir_str = NULL;
    1916             :     PyObject *dirfunc;
    1917             : 
    1918             :     assert(obj);
    1919           6 :     if (PyInstance_Check(obj)) {
    1920           0 :         dirfunc = PyObject_GetAttrString(obj, "__dir__");
    1921           0 :         if (dirfunc == NULL) {
    1922           0 :             if (PyErr_ExceptionMatches(PyExc_AttributeError))
    1923           0 :                 PyErr_Clear();
    1924             :             else
    1925           0 :                 return NULL;
    1926             :         }
    1927             :     }
    1928             :     else {
    1929           6 :         dirfunc = _PyObject_LookupSpecial(obj, "__dir__", &dir_str);
    1930           6 :         if (PyErr_Occurred())
    1931           0 :             return NULL;
    1932             :     }
    1933           6 :     if (dirfunc == NULL) {
    1934             :         /* use default implementation */
    1935           6 :         if (PyModule_Check(obj))
    1936           6 :             result = _specialized_dir_module(obj);
    1937           0 :         else if (PyType_Check(obj) || PyClass_Check(obj))
    1938           0 :             result = _specialized_dir_type(obj);
    1939             :         else
    1940           0 :             result = _generic_dir(obj);
    1941             :     }
    1942             :     else {
    1943             :         /* use __dir__ */
    1944           0 :         result = PyObject_CallFunctionObjArgs(dirfunc, NULL);
    1945           0 :         Py_DECREF(dirfunc);
    1946           0 :         if (result == NULL)
    1947           0 :             return NULL;
    1948             : 
    1949             :         /* result must be a list */
    1950             :         /* XXX(gbrandl): could also check if all items are strings */
    1951           0 :         if (!PyList_Check(result)) {
    1952           0 :             PyErr_Format(PyExc_TypeError,
    1953             :                          "__dir__() must return a list, not %.200s",
    1954           0 :                          Py_TYPE(result)->tp_name);
    1955           0 :             Py_DECREF(result);
    1956           0 :             result = NULL;
    1957             :         }
    1958             :     }
    1959             : 
    1960           6 :     return result;
    1961             : }
    1962             : 
    1963             : /* Implementation of dir() -- if obj is NULL, returns the names in the current
    1964             :    (local) scope.  Otherwise, performs introspection of the object: returns a
    1965             :    sorted list of attribute names (supposedly) accessible from the object
    1966             : */
    1967             : PyObject *
    1968           6 : PyObject_Dir(PyObject *obj)
    1969             : {
    1970             :     PyObject * result;
    1971             : 
    1972           6 :     if (obj == NULL)
    1973             :         /* no object -- introspect the locals */
    1974           0 :         result = _dir_locals();
    1975             :     else
    1976             :         /* object -- introspect the object */
    1977           6 :         result = _dir_object(obj);
    1978             : 
    1979             :     assert(result == NULL || PyList_Check(result));
    1980             : 
    1981           6 :     if (result != NULL && PyList_Sort(result) != 0) {
    1982             :         /* sorting the list failed */
    1983           0 :         Py_DECREF(result);
    1984           0 :         result = NULL;
    1985             :     }
    1986             : 
    1987           6 :     return result;
    1988             : }
    1989             : 
    1990             : /*
    1991             : NoObject is usable as a non-NULL undefined value, used by the macro None.
    1992             : There is (and should be!) no way to create other objects of this type,
    1993             : so there is exactly one (which is indestructible, by the way).
    1994             : (XXX This type and the type of NotImplemented below should be unified.)
    1995             : */
    1996             : 
    1997             : /* ARGSUSED */
    1998             : static PyObject *
    1999           0 : none_repr(PyObject *op)
    2000             : {
    2001           0 :     return PyString_FromString("None");
    2002             : }
    2003             : 
    2004             : /* ARGUSED */
    2005             : static void
    2006           0 : none_dealloc(PyObject* ignore)
    2007             : {
    2008             :     /* This should never get called, but we also don't want to SEGV if
    2009             :      * we accidentally decref None out of existence.
    2010             :      */
    2011           0 :     Py_FatalError("deallocating None");
    2012           0 : }
    2013             : 
    2014             : 
    2015             : static PyTypeObject PyNone_Type = {
    2016             :     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    2017             :     "NoneType",
    2018             :     0,
    2019             :     0,
    2020             :     none_dealloc,       /*tp_dealloc*/ /*never called*/
    2021             :     0,                  /*tp_print*/
    2022             :     0,                  /*tp_getattr*/
    2023             :     0,                  /*tp_setattr*/
    2024             :     0,                  /*tp_compare*/
    2025             :     none_repr,          /*tp_repr*/
    2026             :     0,                  /*tp_as_number*/
    2027             :     0,                  /*tp_as_sequence*/
    2028             :     0,                  /*tp_as_mapping*/
    2029             :     (hashfunc)_Py_HashPointer, /*tp_hash */
    2030             : };
    2031             : 
    2032             : PyObject _Py_NoneStruct = {
    2033             :   _PyObject_EXTRA_INIT
    2034             :   1, &PyNone_Type
    2035             : };
    2036             : 
    2037             : /* NotImplemented is an object that can be used to signal that an
    2038             :    operation is not implemented for the given type combination. */
    2039             : 
    2040             : static PyObject *
    2041           0 : NotImplemented_repr(PyObject *op)
    2042             : {
    2043           0 :     return PyString_FromString("NotImplemented");
    2044             : }
    2045             : 
    2046             : static PyTypeObject PyNotImplemented_Type = {
    2047             :     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    2048             :     "NotImplementedType",
    2049             :     0,
    2050             :     0,
    2051             :     none_dealloc,       /*tp_dealloc*/ /*never called*/
    2052             :     0,                  /*tp_print*/
    2053             :     0,                  /*tp_getattr*/
    2054             :     0,                  /*tp_setattr*/
    2055             :     0,                  /*tp_compare*/
    2056             :     NotImplemented_repr, /*tp_repr*/
    2057             :     0,                  /*tp_as_number*/
    2058             :     0,                  /*tp_as_sequence*/
    2059             :     0,                  /*tp_as_mapping*/
    2060             :     0,                  /*tp_hash */
    2061             : };
    2062             : 
    2063             : PyObject _Py_NotImplementedStruct = {
    2064             :     _PyObject_EXTRA_INIT
    2065             :     1, &PyNotImplemented_Type
    2066             : };
    2067             : 
    2068             : void
    2069           3 : _Py_ReadyTypes(void)
    2070             : {
    2071           3 :     if (PyType_Ready(&PyType_Type) < 0)
    2072           0 :         Py_FatalError("Can't initialize type type");
    2073             : 
    2074           3 :     if (PyType_Ready(&_PyWeakref_RefType) < 0)
    2075           0 :         Py_FatalError("Can't initialize weakref type");
    2076             : 
    2077           3 :     if (PyType_Ready(&_PyWeakref_CallableProxyType) < 0)
    2078           0 :         Py_FatalError("Can't initialize callable weakref proxy type");
    2079             : 
    2080           3 :     if (PyType_Ready(&_PyWeakref_ProxyType) < 0)
    2081           0 :         Py_FatalError("Can't initialize weakref proxy type");
    2082             : 
    2083           3 :     if (PyType_Ready(&PyBool_Type) < 0)
    2084           0 :         Py_FatalError("Can't initialize bool type");
    2085             : 
    2086           3 :     if (PyType_Ready(&PyString_Type) < 0)
    2087           0 :         Py_FatalError("Can't initialize str type");
    2088             : 
    2089           3 :     if (PyType_Ready(&PyByteArray_Type) < 0)
    2090           0 :         Py_FatalError("Can't initialize bytearray type");
    2091             : 
    2092           3 :     if (PyType_Ready(&PyList_Type) < 0)
    2093           0 :         Py_FatalError("Can't initialize list type");
    2094             : 
    2095           3 :     if (PyType_Ready(&PyNone_Type) < 0)
    2096           0 :         Py_FatalError("Can't initialize None type");
    2097             : 
    2098           3 :     if (PyType_Ready(&PyNotImplemented_Type) < 0)
    2099           0 :         Py_FatalError("Can't initialize NotImplemented type");
    2100             : 
    2101           3 :     if (PyType_Ready(&PyTraceBack_Type) < 0)
    2102           0 :         Py_FatalError("Can't initialize traceback type");
    2103             : 
    2104           3 :     if (PyType_Ready(&PySuper_Type) < 0)
    2105           0 :         Py_FatalError("Can't initialize super type");
    2106             : 
    2107           3 :     if (PyType_Ready(&PyBaseObject_Type) < 0)
    2108           0 :         Py_FatalError("Can't initialize object type");
    2109             : 
    2110           3 :     if (PyType_Ready(&PyRange_Type) < 0)
    2111           0 :         Py_FatalError("Can't initialize xrange type");
    2112             : 
    2113           3 :     if (PyType_Ready(&PyDict_Type) < 0)
    2114           0 :         Py_FatalError("Can't initialize dict type");
    2115             : 
    2116           3 :     if (PyType_Ready(&PySet_Type) < 0)
    2117           0 :         Py_FatalError("Can't initialize set type");
    2118             : 
    2119             : #ifdef Py_USING_UNICODE
    2120           3 :     if (PyType_Ready(&PyUnicode_Type) < 0)
    2121           0 :         Py_FatalError("Can't initialize unicode type");
    2122             : #endif
    2123             : 
    2124           3 :     if (PyType_Ready(&PySlice_Type) < 0)
    2125           0 :         Py_FatalError("Can't initialize slice type");
    2126             : 
    2127           3 :     if (PyType_Ready(&PyStaticMethod_Type) < 0)
    2128           0 :         Py_FatalError("Can't initialize static method type");
    2129             : 
    2130             : #ifndef WITHOUT_COMPLEX
    2131           3 :     if (PyType_Ready(&PyComplex_Type) < 0)
    2132           0 :         Py_FatalError("Can't initialize complex type");
    2133             : #endif
    2134             : 
    2135           3 :     if (PyType_Ready(&PyFloat_Type) < 0)
    2136           0 :         Py_FatalError("Can't initialize float type");
    2137             : 
    2138           3 :     if (PyType_Ready(&PyBuffer_Type) < 0)
    2139           0 :         Py_FatalError("Can't initialize buffer type");
    2140             : 
    2141           3 :     if (PyType_Ready(&PyLong_Type) < 0)
    2142           0 :         Py_FatalError("Can't initialize long type");
    2143             : 
    2144           3 :     if (PyType_Ready(&PyInt_Type) < 0)
    2145           0 :         Py_FatalError("Can't initialize int type");
    2146             : 
    2147           3 :     if (PyType_Ready(&PyFrozenSet_Type) < 0)
    2148           0 :         Py_FatalError("Can't initialize frozenset type");
    2149             : 
    2150           3 :     if (PyType_Ready(&PyProperty_Type) < 0)
    2151           0 :         Py_FatalError("Can't initialize property type");
    2152             : 
    2153           3 :     if (PyType_Ready(&PyMemoryView_Type) < 0)
    2154           0 :         Py_FatalError("Can't initialize memoryview type");
    2155             : 
    2156           3 :     if (PyType_Ready(&PyTuple_Type) < 0)
    2157           0 :         Py_FatalError("Can't initialize tuple type");
    2158             : 
    2159           3 :     if (PyType_Ready(&PyEnum_Type) < 0)
    2160           0 :         Py_FatalError("Can't initialize enumerate type");
    2161             : 
    2162           3 :     if (PyType_Ready(&PyReversed_Type) < 0)
    2163           0 :         Py_FatalError("Can't initialize reversed type");
    2164             : 
    2165           3 :     if (PyType_Ready(&PyCode_Type) < 0)
    2166           0 :         Py_FatalError("Can't initialize code type");
    2167             : 
    2168           3 :     if (PyType_Ready(&PyFrame_Type) < 0)
    2169           0 :         Py_FatalError("Can't initialize frame type");
    2170             : 
    2171           3 :     if (PyType_Ready(&PyCFunction_Type) < 0)
    2172           0 :         Py_FatalError("Can't initialize builtin function type");
    2173             : 
    2174           3 :     if (PyType_Ready(&PyMethod_Type) < 0)
    2175           0 :         Py_FatalError("Can't initialize method type");
    2176             : 
    2177           3 :     if (PyType_Ready(&PyFunction_Type) < 0)
    2178           0 :         Py_FatalError("Can't initialize function type");
    2179             : 
    2180           3 :     if (PyType_Ready(&PyClass_Type) < 0)
    2181           0 :         Py_FatalError("Can't initialize class type");
    2182             : 
    2183           3 :     if (PyType_Ready(&PyDictProxy_Type) < 0)
    2184           0 :         Py_FatalError("Can't initialize dict proxy type");
    2185             : 
    2186           3 :     if (PyType_Ready(&PyGen_Type) < 0)
    2187           0 :         Py_FatalError("Can't initialize generator type");
    2188             : 
    2189           3 :     if (PyType_Ready(&PyGetSetDescr_Type) < 0)
    2190           0 :         Py_FatalError("Can't initialize get-set descriptor type");
    2191             : 
    2192           3 :     if (PyType_Ready(&PyWrapperDescr_Type) < 0)
    2193           0 :         Py_FatalError("Can't initialize wrapper type");
    2194             : 
    2195           3 :     if (PyType_Ready(&PyInstance_Type) < 0)
    2196           0 :         Py_FatalError("Can't initialize instance type");
    2197             : 
    2198           3 :     if (PyType_Ready(&PyEllipsis_Type) < 0)
    2199           0 :         Py_FatalError("Can't initialize ellipsis type");
    2200             : 
    2201           3 :     if (PyType_Ready(&PyMemberDescr_Type) < 0)
    2202           0 :         Py_FatalError("Can't initialize member descriptor type");
    2203             : 
    2204           3 :     if (PyType_Ready(&PyFile_Type) < 0)
    2205           0 :         Py_FatalError("Can't initialize file type");
    2206             : 
    2207           3 :     if (PyType_Ready(&PyCapsule_Type) < 0)
    2208           0 :         Py_FatalError("Can't initialize capsule type");
    2209             : 
    2210           3 :     if (PyType_Ready(&PyCell_Type) < 0)
    2211           0 :         Py_FatalError("Can't initialize cell type");
    2212             : 
    2213           3 :     if (PyType_Ready(&PyCallIter_Type) < 0)
    2214           0 :         Py_FatalError("Can't initialize call iter type");
    2215             : 
    2216           3 :     if (PyType_Ready(&PySeqIter_Type) < 0)
    2217           0 :         Py_FatalError("Can't initialize sequence iterator type");
    2218           3 : }
    2219             : 
    2220             : 
    2221             : #ifdef Py_TRACE_REFS
    2222             : 
    2223             : void
    2224             : _Py_NewReference(PyObject *op)
    2225             : {
    2226             :     _Py_INC_REFTOTAL;
    2227             :     op->ob_refcnt = 1;
    2228             :     _Py_AddToAllObjects(op, 1);
    2229             :     _Py_INC_TPALLOCS(op);
    2230             : }
    2231             : 
    2232             : void
    2233             : _Py_ForgetReference(register PyObject *op)
    2234             : {
    2235             : #ifdef SLOW_UNREF_CHECK
    2236             :     register PyObject *p;
    2237             : #endif
    2238             :     if (op->ob_refcnt < 0)
    2239             :         Py_FatalError("UNREF negative refcnt");
    2240             :     if (op == &refchain ||
    2241             :         op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
    2242             :         Py_FatalError("UNREF invalid object");
    2243             : #ifdef SLOW_UNREF_CHECK
    2244             :     for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
    2245             :         if (p == op)
    2246             :             break;
    2247             :     }
    2248             :     if (p == &refchain) /* Not found */
    2249             :         Py_FatalError("UNREF unknown object");
    2250             : #endif
    2251             :     op->_ob_next->_ob_prev = op->_ob_prev;
    2252             :     op->_ob_prev->_ob_next = op->_ob_next;
    2253             :     op->_ob_next = op->_ob_prev = NULL;
    2254             :     _Py_INC_TPFREES(op);
    2255             : }
    2256             : 
    2257             : void
    2258             : _Py_Dealloc(PyObject *op)
    2259             : {
    2260             :     destructor dealloc = Py_TYPE(op)->tp_dealloc;
    2261             :     _Py_ForgetReference(op);
    2262             :     (*dealloc)(op);
    2263             : }
    2264             : 
    2265             : /* Print all live objects.  Because PyObject_Print is called, the
    2266             :  * interpreter must be in a healthy state.
    2267             :  */
    2268             : void
    2269             : _Py_PrintReferences(FILE *fp)
    2270             : {
    2271             :     PyObject *op;
    2272             :     fprintf(fp, "Remaining objects:\n");
    2273             :     for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
    2274             :         fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", op, op->ob_refcnt);
    2275             :         if (PyObject_Print(op, fp, 0) != 0)
    2276             :             PyErr_Clear();
    2277             :         putc('\n', fp);
    2278             :     }
    2279             : }
    2280             : 
    2281             : /* Print the addresses of all live objects.  Unlike _Py_PrintReferences, this
    2282             :  * doesn't make any calls to the Python C API, so is always safe to call.
    2283             :  */
    2284             : void
    2285             : _Py_PrintReferenceAddresses(FILE *fp)
    2286             : {
    2287             :     PyObject *op;
    2288             :     fprintf(fp, "Remaining object addresses:\n");
    2289             :     for (op = refchain._ob_next; op != &refchain; op = op->_ob_next)
    2290             :         fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", op,
    2291             :             op->ob_refcnt, Py_TYPE(op)->tp_name);
    2292             : }
    2293             : 
    2294             : PyObject *
    2295             : _Py_GetObjects(PyObject *self, PyObject *args)
    2296             : {
    2297             :     int i, n;
    2298             :     PyObject *t = NULL;
    2299             :     PyObject *res, *op;
    2300             : 
    2301             :     if (!PyArg_ParseTuple(args, "i|O", &n, &t))
    2302             :         return NULL;
    2303             :     op = refchain._ob_next;
    2304             :     res = PyList_New(0);
    2305             :     if (res == NULL)
    2306             :         return NULL;
    2307             :     for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
    2308             :         while (op == self || op == args || op == res || op == t ||
    2309             :                (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) {
    2310             :             op = op->_ob_next;
    2311             :             if (op == &refchain)
    2312             :                 return res;
    2313             :         }
    2314             :         if (PyList_Append(res, op) < 0) {
    2315             :             Py_DECREF(res);
    2316             :             return NULL;
    2317             :         }
    2318             :         op = op->_ob_next;
    2319             :     }
    2320             :     return res;
    2321             : }
    2322             : 
    2323             : #endif
    2324             : 
    2325             : 
    2326             : /* Hack to force loading of capsule.o */
    2327             : PyTypeObject *_Py_capsule_hack = &PyCapsule_Type;
    2328             : 
    2329             : 
    2330             : /* Hack to force loading of cobject.o */
    2331             : PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
    2332             : 
    2333             : 
    2334             : /* Hack to force loading of abstract.o */
    2335             : Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
    2336             : 
    2337             : 
    2338             : /* Python's malloc wrappers (see pymem.h) */
    2339             : 
    2340             : void *
    2341        3390 : PyMem_Malloc(size_t nbytes)
    2342             : {
    2343        3390 :     return PyMem_MALLOC(nbytes);
    2344             : }
    2345             : 
    2346             : void *
    2347         663 : PyMem_Realloc(void *p, size_t nbytes)
    2348             : {
    2349         663 :     return PyMem_REALLOC(p, nbytes);
    2350             : }
    2351             : 
    2352             : void
    2353        4134 : PyMem_Free(void *p)
    2354             : {
    2355        4134 :     PyMem_FREE(p);
    2356        4134 : }
    2357             : 
    2358             : 
    2359             : /* These methods are used to control infinite recursion in repr, str, print,
    2360             :    etc.  Container objects that may recursively contain themselves,
    2361             :    e.g. builtin dictionaries and lists, should use Py_ReprEnter() and
    2362             :    Py_ReprLeave() to avoid infinite recursion.
    2363             : 
    2364             :    Py_ReprEnter() returns 0 the first time it is called for a particular
    2365             :    object and 1 every time thereafter.  It returns -1 if an exception
    2366             :    occurred.  Py_ReprLeave() has no return value.
    2367             : 
    2368             :    See dictobject.c and listobject.c for examples of use.
    2369             : */
    2370             : 
    2371             : #define KEY "Py_Repr"
    2372             : 
    2373             : int
    2374          81 : Py_ReprEnter(PyObject *obj)
    2375             : {
    2376             :     PyObject *dict;
    2377             :     PyObject *list;
    2378             :     Py_ssize_t i;
    2379             : 
    2380          81 :     dict = PyThreadState_GetDict();
    2381          81 :     if (dict == NULL)
    2382           0 :         return 0;
    2383          81 :     list = PyDict_GetItemString(dict, KEY);
    2384          81 :     if (list == NULL) {
    2385           3 :         list = PyList_New(0);
    2386           3 :         if (list == NULL)
    2387           0 :             return -1;
    2388           3 :         if (PyDict_SetItemString(dict, KEY, list) < 0)
    2389           0 :             return -1;
    2390           3 :         Py_DECREF(list);
    2391             :     }
    2392          81 :     i = PyList_GET_SIZE(list);
    2393         162 :     while (--i >= 0) {
    2394           0 :         if (PyList_GET_ITEM(list, i) == obj)
    2395           0 :             return 1;
    2396             :     }
    2397          81 :     PyList_Append(list, obj);
    2398          81 :     return 0;
    2399             : }
    2400             : 
    2401             : void
    2402          81 : Py_ReprLeave(PyObject *obj)
    2403             : {
    2404             :     PyObject *dict;
    2405             :     PyObject *list;
    2406             :     Py_ssize_t i;
    2407             : 
    2408          81 :     dict = PyThreadState_GetDict();
    2409          81 :     if (dict == NULL)
    2410           0 :         return;
    2411          81 :     list = PyDict_GetItemString(dict, KEY);
    2412          81 :     if (list == NULL || !PyList_Check(list))
    2413           0 :         return;
    2414          81 :     i = PyList_GET_SIZE(list);
    2415             :     /* Count backwards because we always expect obj to be list[-1] */
    2416         162 :     while (--i >= 0) {
    2417          81 :         if (PyList_GET_ITEM(list, i) == obj) {
    2418          81 :             PyList_SetSlice(list, i, i + 1, NULL);
    2419          81 :             break;
    2420             :         }
    2421             :     }
    2422             : }
    2423             : 
    2424             : /* Trashcan support. */
    2425             : 
    2426             : /* Current call-stack depth of tp_dealloc calls. */
    2427             : int _PyTrash_delete_nesting = 0;
    2428             : 
    2429             : /* List of objects that still need to be cleaned up, singly linked via their
    2430             :  * gc headers' gc_prev pointers.
    2431             :  */
    2432             : PyObject *_PyTrash_delete_later = NULL;
    2433             : 
    2434             : /* Add op to the _PyTrash_delete_later list.  Called when the current
    2435             :  * call-stack depth gets large.  op must be a currently untracked gc'ed
    2436             :  * object, with refcount 0.  Py_DECREF must already have been called on it.
    2437             :  */
    2438             : void
    2439           0 : _PyTrash_deposit_object(PyObject *op)
    2440             : {
    2441             :     assert(PyObject_IS_GC(op));
    2442             :     assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
    2443             :     assert(op->ob_refcnt == 0);
    2444           0 :     _Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *)_PyTrash_delete_later;
    2445           0 :     _PyTrash_delete_later = op;
    2446           0 : }
    2447             : 
    2448             : /* The equivalent API, using per-thread state recursion info */
    2449             : void
    2450          42 : _PyTrash_thread_deposit_object(PyObject *op)
    2451             : {
    2452          42 :     PyThreadState *tstate = PyThreadState_GET();
    2453             :     assert(PyObject_IS_GC(op));
    2454             :     assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
    2455             :     assert(op->ob_refcnt == 0);
    2456          42 :     _Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *) tstate->trash_delete_later;
    2457          42 :     tstate->trash_delete_later = op;
    2458          42 : }
    2459             : 
    2460             : /* Dealloccate all the objects in the _PyTrash_delete_later list.  Called when
    2461             :  * the call-stack unwinds again.
    2462             :  */
    2463             : void
    2464           0 : _PyTrash_destroy_chain(void)
    2465             : {
    2466           0 :     while (_PyTrash_delete_later) {
    2467           0 :         PyObject *op = _PyTrash_delete_later;
    2468           0 :         destructor dealloc = Py_TYPE(op)->tp_dealloc;
    2469             : 
    2470           0 :         _PyTrash_delete_later =
    2471           0 :             (PyObject*) _Py_AS_GC(op)->gc.gc_prev;
    2472             : 
    2473             :         /* Call the deallocator directly.  This used to try to
    2474             :          * fool Py_DECREF into calling it indirectly, but
    2475             :          * Py_DECREF was already called on this object, and in
    2476             :          * assorted non-release builds calling Py_DECREF again ends
    2477             :          * up distorting allocation statistics.
    2478             :          */
    2479             :         assert(op->ob_refcnt == 0);
    2480           0 :         ++_PyTrash_delete_nesting;
    2481           0 :         (*dealloc)(op);
    2482           0 :         --_PyTrash_delete_nesting;
    2483             :     }
    2484           0 : }
    2485             : 
    2486             : /* The equivalent API, using per-thread state recursion info */
    2487             : void
    2488           6 : _PyTrash_thread_destroy_chain(void)
    2489             : {
    2490           6 :     PyThreadState *tstate = PyThreadState_GET();
    2491          54 :     while (tstate->trash_delete_later) {
    2492          42 :         PyObject *op = tstate->trash_delete_later;
    2493          42 :         destructor dealloc = Py_TYPE(op)->tp_dealloc;
    2494             : 
    2495          42 :         tstate->trash_delete_later =
    2496          42 :             (PyObject*) _Py_AS_GC(op)->gc.gc_prev;
    2497             : 
    2498             :         /* Call the deallocator directly.  This used to try to
    2499             :          * fool Py_DECREF into calling it indirectly, but
    2500             :          * Py_DECREF was already called on this object, and in
    2501             :          * assorted non-release builds calling Py_DECREF again ends
    2502             :          * up distorting allocation statistics.
    2503             :          */
    2504             :         assert(op->ob_refcnt == 0);
    2505          42 :         ++tstate->trash_delete_nesting;
    2506          42 :         (*dealloc)(op);
    2507          42 :         --tstate->trash_delete_nesting;
    2508             :     }
    2509           6 : }
    2510             : 
    2511             : #ifdef __cplusplus
    2512             : }
    2513             : #endif

Generated by: LCOV version 1.10