From d63cef62ec0c72e04d240ce17de7a91f82f23774 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Fri, 1 Feb 2008 11:43:33 -0800 Subject: [PATCH] Mangle naming for cleanup function. --- Cython/Compiler/CmdLine.py | 2 ++ Cython/Compiler/ModuleNode.py | 10 ++++++---- Cython/Compiler/Naming.py | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Cython/Compiler/CmdLine.py b/Cython/Compiler/CmdLine.py index 1689b21f..703ea2c1 100644 --- a/Cython/Compiler/CmdLine.py +++ b/Cython/Compiler/CmdLine.py @@ -24,6 +24,8 @@ Options: "from import *" at the top of the file. --incref-local-binop Force local an extra incref on local variables before performing any binary operations. + --cleanup Release interned objects on python exit, for memory debugging. + Level indicates aggressiveness, default 0 releases nothing. -D, --no-docstrings Remove docstrings. -a, --annotate Produce an colorized version of the source. --convert-range Convert for loops using range() function to for...from loops. diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index 55bbbda6..5e529b59 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -1339,10 +1339,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): env.use_utility_code(import_module_utility_code) env.use_utility_code(register_cleanup_utility_code) code.putln() - code.putln('static PyObject* cleanup(PyObject *self, PyObject *unused) {') + code.putln('static PyObject* %s(PyObject *self, PyObject *unused) {' % Naming.cleanup_cname) if Options.generate_cleanup_code >= 2: code.putln("/*--- Global cleanup code ---*/") - for entry in reversed(env.var_entries): + rev_entries = list(env.var_entries) + rev_entries.reverse() + for entry in rev_entries: if entry.visibility != 'extern': if entry.type.is_pyobject: code.put_var_decref_clear(entry) @@ -1790,8 +1792,8 @@ bad: register_cleanup_utility_code = [ """ static int __Pyx_RegisterCleanup(void); /*proto*/ -static PyObject* cleanup(PyObject *self, PyObject *unused); /*proto*/ -static PyMethodDef cleanup_def = {"__cleanup", (PyCFunction)&cleanup, METH_NOARGS, 0}; +static PyObject* __pyx_module_cleanup(PyObject *self, PyObject *unused); /*proto*/ +static PyMethodDef cleanup_def = {"__cleanup", (PyCFunction)&__pyx_module_cleanup, METH_NOARGS, 0}; """,""" static int __Pyx_RegisterCleanup(void) { /* Don't use Py_AtExit because that has a 32-call limit diff --git a/Cython/Compiler/Naming.py b/Cython/Compiler/Naming.py index acdd674f..c273d73f 100644 --- a/Cython/Compiler/Naming.py +++ b/Cython/Compiler/Naming.py @@ -59,6 +59,7 @@ c_api_tab_cname = pyrex_prefix + "c_api_tab" gilstate_cname = pyrex_prefix + "state" skip_dispatch_cname = pyrex_prefix + "skip_dispatch" empty_tuple = pyrex_prefix + "empty_tuple" +cleanup_cname = pyrex_prefix + "module_cleanup" extern_c_macro = pyrex_prefix.upper() + "EXTERN_C" -- 2.26.2