diff options
author | Anton Samokhvalov <pg83@yandex.ru> | 2022-02-10 16:45:15 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:15 +0300 |
commit | 72cb13b4aff9bc9cf22e49251bc8fd143f82538f (patch) | |
tree | da2c34829458c7d4e74bdfbdf85dff449e9e7fb8 /contrib/tools/cython/Cython/Runtime | |
parent | 778e51ba091dc39e7b7fcab2b9cf4dbedfb6f2b5 (diff) | |
download | ydb-72cb13b4aff9bc9cf22e49251bc8fd143f82538f.tar.gz |
Restoring authorship annotation for Anton Samokhvalov <pg83@yandex.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/tools/cython/Cython/Runtime')
-rw-r--r-- | contrib/tools/cython/Cython/Runtime/__init__.py | 2 | ||||
-rw-r--r-- | contrib/tools/cython/Cython/Runtime/refnanny.pyx | 370 |
2 files changed, 186 insertions, 186 deletions
diff --git a/contrib/tools/cython/Cython/Runtime/__init__.py b/contrib/tools/cython/Cython/Runtime/__init__.py index fa81adaff6..4a2889e8e1 100644 --- a/contrib/tools/cython/Cython/Runtime/__init__.py +++ b/contrib/tools/cython/Cython/Runtime/__init__.py @@ -1 +1 @@ -# empty file +# empty file diff --git a/contrib/tools/cython/Cython/Runtime/refnanny.pyx b/contrib/tools/cython/Cython/Runtime/refnanny.pyx index d4b873fe97..7342f7c0ac 100644 --- a/contrib/tools/cython/Cython/Runtime/refnanny.pyx +++ b/contrib/tools/cython/Cython/Runtime/refnanny.pyx @@ -1,194 +1,194 @@ # cython: language_level=3, auto_pickle=False -from cpython.ref cimport PyObject, Py_INCREF, Py_DECREF, Py_XDECREF, Py_XINCREF -from cpython.exc cimport PyErr_Fetch, PyErr_Restore -from cpython.pystate cimport PyThreadState_Get - -cimport cython - -loglevel = 0 -reflog = [] - -cdef log(level, action, obj, lineno): - if loglevel >= level: - reflog.append((lineno, action, id(obj))) - -LOG_NONE, LOG_ALL = range(2) - -@cython.final -cdef class Context(object): - cdef readonly object name, filename - cdef readonly dict refs - cdef readonly list errors - cdef readonly Py_ssize_t start - - def __cinit__(self, name, line=0, filename=None): - self.name = name - self.start = line - self.filename = filename - self.refs = {} # id -> (count, [lineno]) - self.errors = [] - - cdef regref(self, obj, lineno, bint is_null): - log(LOG_ALL, u'regref', u"<NULL>" if is_null else obj, lineno) - if is_null: +from cpython.ref cimport PyObject, Py_INCREF, Py_DECREF, Py_XDECREF, Py_XINCREF +from cpython.exc cimport PyErr_Fetch, PyErr_Restore +from cpython.pystate cimport PyThreadState_Get + +cimport cython + +loglevel = 0 +reflog = [] + +cdef log(level, action, obj, lineno): + if loglevel >= level: + reflog.append((lineno, action, id(obj))) + +LOG_NONE, LOG_ALL = range(2) + +@cython.final +cdef class Context(object): + cdef readonly object name, filename + cdef readonly dict refs + cdef readonly list errors + cdef readonly Py_ssize_t start + + def __cinit__(self, name, line=0, filename=None): + self.name = name + self.start = line + self.filename = filename + self.refs = {} # id -> (count, [lineno]) + self.errors = [] + + cdef regref(self, obj, lineno, bint is_null): + log(LOG_ALL, u'regref', u"<NULL>" if is_null else obj, lineno) + if is_null: self.errors.append(f"NULL argument on line {lineno}") - return - id_ = id(obj) - count, linenumbers = self.refs.get(id_, (0, [])) - self.refs[id_] = (count + 1, linenumbers) - linenumbers.append(lineno) - - cdef bint delref(self, obj, lineno, bint is_null) except -1: - # returns whether it is ok to do the decref operation - log(LOG_ALL, u'delref', u"<NULL>" if is_null else obj, lineno) - if is_null: + return + id_ = id(obj) + count, linenumbers = self.refs.get(id_, (0, [])) + self.refs[id_] = (count + 1, linenumbers) + linenumbers.append(lineno) + + cdef bint delref(self, obj, lineno, bint is_null) except -1: + # returns whether it is ok to do the decref operation + log(LOG_ALL, u'delref', u"<NULL>" if is_null else obj, lineno) + if is_null: self.errors.append(f"NULL argument on line {lineno}") - return False - id_ = id(obj) - count, linenumbers = self.refs.get(id_, (0, [])) - if count == 0: + return False + id_ = id(obj) + count, linenumbers = self.refs.get(id_, (0, [])) + if count == 0: self.errors.append(f"Too many decrefs on line {lineno}, reference acquired on lines {linenumbers!r}") - return False - elif count == 1: - del self.refs[id_] - return True - else: - self.refs[id_] = (count - 1, linenumbers) - return True - - cdef end(self): - if self.refs: - msg = u"References leaked:" - for count, linenos in self.refs.itervalues(): + return False + elif count == 1: + del self.refs[id_] + return True + else: + self.refs[id_] = (count - 1, linenumbers) + return True + + cdef end(self): + if self.refs: + msg = u"References leaked:" + for count, linenos in self.refs.itervalues(): msg += f"\n ({count}) acquired on lines: {u', '.join([f'{x}' for x in linenos])}" - self.errors.append(msg) - if self.errors: - return u"\n".join([u'REFNANNY: '+error for error in self.errors]) - else: - return None - -cdef void report_unraisable(object e=None): - try: - if e is None: - import sys - e = sys.exc_info()[1] + self.errors.append(msg) + if self.errors: + return u"\n".join([u'REFNANNY: '+error for error in self.errors]) + else: + return None + +cdef void report_unraisable(object e=None): + try: + if e is None: + import sys + e = sys.exc_info()[1] print(f"refnanny raised an exception: {e}") - except: - pass # We absolutely cannot exit with an exception - -# All Python operations must happen after any existing -# exception has been fetched, in case we are called from -# exception-handling code. - -cdef PyObject* SetupContext(char* funcname, int lineno, char* filename) except NULL: - if Context is None: - # Context may be None during finalize phase. - # In that case, we don't want to be doing anything fancy - # like caching and resetting exceptions. - return NULL - cdef (PyObject*) type = NULL, value = NULL, tb = NULL, result = NULL - PyThreadState_Get() - PyErr_Fetch(&type, &value, &tb) - try: - ctx = Context(funcname, lineno, filename) - Py_INCREF(ctx) - result = <PyObject*>ctx - except Exception, e: - report_unraisable(e) - PyErr_Restore(type, value, tb) - return result - -cdef void GOTREF(PyObject* ctx, PyObject* p_obj, int lineno): - if ctx == NULL: return - cdef (PyObject*) type = NULL, value = NULL, tb = NULL - PyErr_Fetch(&type, &value, &tb) - try: - try: - if p_obj is NULL: - (<Context>ctx).regref(None, lineno, True) - else: - (<Context>ctx).regref(<object>p_obj, lineno, False) - except: - report_unraisable() - except: - # __Pyx_GetException may itself raise errors - pass - PyErr_Restore(type, value, tb) - -cdef int GIVEREF_and_report(PyObject* ctx, PyObject* p_obj, int lineno): - if ctx == NULL: return 1 - cdef (PyObject*) type = NULL, value = NULL, tb = NULL - cdef bint decref_ok = False - PyErr_Fetch(&type, &value, &tb) - try: - try: - if p_obj is NULL: - decref_ok = (<Context>ctx).delref(None, lineno, True) - else: - decref_ok = (<Context>ctx).delref(<object>p_obj, lineno, False) - except: - report_unraisable() - except: - # __Pyx_GetException may itself raise errors - pass - PyErr_Restore(type, value, tb) - return decref_ok - -cdef void GIVEREF(PyObject* ctx, PyObject* p_obj, int lineno): - GIVEREF_and_report(ctx, p_obj, lineno) - -cdef void INCREF(PyObject* ctx, PyObject* obj, int lineno): - Py_XINCREF(obj) - PyThreadState_Get() - GOTREF(ctx, obj, lineno) - -cdef void DECREF(PyObject* ctx, PyObject* obj, int lineno): - if GIVEREF_and_report(ctx, obj, lineno): - Py_XDECREF(obj) - PyThreadState_Get() - -cdef void FinishContext(PyObject** ctx): - if ctx == NULL or ctx[0] == NULL: return - cdef (PyObject*) type = NULL, value = NULL, tb = NULL - cdef object errors = None - cdef Context context - PyThreadState_Get() - PyErr_Fetch(&type, &value, &tb) - try: - try: - context = <Context>ctx[0] - errors = context.end() - if errors: + except: + pass # We absolutely cannot exit with an exception + +# All Python operations must happen after any existing +# exception has been fetched, in case we are called from +# exception-handling code. + +cdef PyObject* SetupContext(char* funcname, int lineno, char* filename) except NULL: + if Context is None: + # Context may be None during finalize phase. + # In that case, we don't want to be doing anything fancy + # like caching and resetting exceptions. + return NULL + cdef (PyObject*) type = NULL, value = NULL, tb = NULL, result = NULL + PyThreadState_Get() + PyErr_Fetch(&type, &value, &tb) + try: + ctx = Context(funcname, lineno, filename) + Py_INCREF(ctx) + result = <PyObject*>ctx + except Exception, e: + report_unraisable(e) + PyErr_Restore(type, value, tb) + return result + +cdef void GOTREF(PyObject* ctx, PyObject* p_obj, int lineno): + if ctx == NULL: return + cdef (PyObject*) type = NULL, value = NULL, tb = NULL + PyErr_Fetch(&type, &value, &tb) + try: + try: + if p_obj is NULL: + (<Context>ctx).regref(None, lineno, True) + else: + (<Context>ctx).regref(<object>p_obj, lineno, False) + except: + report_unraisable() + except: + # __Pyx_GetException may itself raise errors + pass + PyErr_Restore(type, value, tb) + +cdef int GIVEREF_and_report(PyObject* ctx, PyObject* p_obj, int lineno): + if ctx == NULL: return 1 + cdef (PyObject*) type = NULL, value = NULL, tb = NULL + cdef bint decref_ok = False + PyErr_Fetch(&type, &value, &tb) + try: + try: + if p_obj is NULL: + decref_ok = (<Context>ctx).delref(None, lineno, True) + else: + decref_ok = (<Context>ctx).delref(<object>p_obj, lineno, False) + except: + report_unraisable() + except: + # __Pyx_GetException may itself raise errors + pass + PyErr_Restore(type, value, tb) + return decref_ok + +cdef void GIVEREF(PyObject* ctx, PyObject* p_obj, int lineno): + GIVEREF_and_report(ctx, p_obj, lineno) + +cdef void INCREF(PyObject* ctx, PyObject* obj, int lineno): + Py_XINCREF(obj) + PyThreadState_Get() + GOTREF(ctx, obj, lineno) + +cdef void DECREF(PyObject* ctx, PyObject* obj, int lineno): + if GIVEREF_and_report(ctx, obj, lineno): + Py_XDECREF(obj) + PyThreadState_Get() + +cdef void FinishContext(PyObject** ctx): + if ctx == NULL or ctx[0] == NULL: return + cdef (PyObject*) type = NULL, value = NULL, tb = NULL + cdef object errors = None + cdef Context context + PyThreadState_Get() + PyErr_Fetch(&type, &value, &tb) + try: + try: + context = <Context>ctx[0] + errors = context.end() + if errors: print(f"{context.filename.decode('latin1')}: {context.name.decode('latin1')}()") print(errors) - context = None - except: - report_unraisable() - except: - # __Pyx_GetException may itself raise errors - pass - Py_XDECREF(ctx[0]) - ctx[0] = NULL - PyErr_Restore(type, value, tb) - -ctypedef struct RefNannyAPIStruct: - void (*INCREF)(PyObject*, PyObject*, int) - void (*DECREF)(PyObject*, PyObject*, int) - void (*GOTREF)(PyObject*, PyObject*, int) - void (*GIVEREF)(PyObject*, PyObject*, int) - PyObject* (*SetupContext)(char*, int, char*) except NULL - void (*FinishContext)(PyObject**) - -cdef RefNannyAPIStruct api -api.INCREF = INCREF -api.DECREF = DECREF -api.GOTREF = GOTREF -api.GIVEREF = GIVEREF -api.SetupContext = SetupContext -api.FinishContext = FinishContext - -cdef extern from "Python.h": - object PyLong_FromVoidPtr(void*) - -RefNannyAPI = PyLong_FromVoidPtr(<void*>&api) + context = None + except: + report_unraisable() + except: + # __Pyx_GetException may itself raise errors + pass + Py_XDECREF(ctx[0]) + ctx[0] = NULL + PyErr_Restore(type, value, tb) + +ctypedef struct RefNannyAPIStruct: + void (*INCREF)(PyObject*, PyObject*, int) + void (*DECREF)(PyObject*, PyObject*, int) + void (*GOTREF)(PyObject*, PyObject*, int) + void (*GIVEREF)(PyObject*, PyObject*, int) + PyObject* (*SetupContext)(char*, int, char*) except NULL + void (*FinishContext)(PyObject**) + +cdef RefNannyAPIStruct api +api.INCREF = INCREF +api.DECREF = DECREF +api.GOTREF = GOTREF +api.GIVEREF = GIVEREF +api.SetupContext = SetupContext +api.FinishContext = FinishContext + +cdef extern from "Python.h": + object PyLong_FromVoidPtr(void*) + +RefNannyAPI = PyLong_FromVoidPtr(<void*>&api) |