From: Stefan Behnel Date: Thu, 8 Aug 2013 17:49:11 +0000 (+0200) Subject: make the NULL-instead-of-None change in tp_clear() optional and off by default -... X-Git-Tag: 0.20b1~415 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b274ea0bfc89ac062cdcd408c8ae49bb06ad883d;p=platform%2Fupstream%2Fpython-cython.git make the NULL-instead-of-None change in tp_clear() optional and off by default - breaks too much code for now --- diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index d1cc241..d4a9833 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -1366,6 +1366,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.putln("") code.putln("static int %s(%sPyObject *o) {" % (slot_func, unused)) + if py_attrs and Options.clear_to_none: + code.putln("PyObject* tmp;") + if py_attrs or py_buffers: self.generate_self_cast(scope, code) @@ -1389,8 +1392,18 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.globalstate.use_utility_code( UtilityCode.load_cached("CallNextTpClear", "ExtensionTypes.c")) - for entry in py_attrs: - code.putln("Py_CLEAR(p->%s);" % entry.cname) + if Options.clear_to_none: + for entry in py_attrs: + name = "p->%s" % entry.cname + code.putln("tmp = ((PyObject*)%s);" % name) + if entry.is_declared_generic: + code.put_init_to_py_none(name, py_object_type, nanny=False) + else: + code.put_init_to_py_none(name, entry.type, nanny=False) + code.putln("Py_XDECREF(tmp);") + else: + for entry in py_attrs: + code.putln("Py_CLEAR(p->%s);" % entry.cname) for entry in py_buffers: # Note: shouldn't this call __Pyx_ReleaseBuffer ?? diff --git a/Cython/Compiler/Options.py b/Cython/Compiler/Options.py index 64f845a..472dfdc 100644 --- a/Cython/Compiler/Options.py +++ b/Cython/Compiler/Options.py @@ -68,7 +68,6 @@ old_style_globals = False # Allows cimporting from a pyx file without a pxd file. cimport_from_pyx = False - # max # of dims for buffers -- set lower than number of dimensions in numpy, as # slices are passed by value and involve a lot of copying buffer_max_dims = 8 @@ -76,6 +75,10 @@ buffer_max_dims = 8 # Number of function closure instances to keep in a freelist (0: no freelists) closure_freelist_size = 8 +# Should tp_clear() set object fields to None instead of clearing them to NULL? +clear_to_none = True + + # Declare compiler directives directive_defaults = { 'boundscheck' : True, diff --git a/runtests.py b/runtests.py index 2a60844..e2eeab0 100755 --- a/runtests.py +++ b/runtests.py @@ -523,6 +523,7 @@ class CythonCompileTestCase(unittest.TestCase): from Cython.Compiler import Options self._saved_options = [ (name, getattr(Options, name)) for name in ('warning_errors', + 'clear_to_none', 'error_on_unknown_names', 'error_on_uninitialized') ] self._saved_default_directives = Options.directive_defaults.items() @@ -784,6 +785,11 @@ class CythonCompileTestCase(unittest.TestCase): return so_path class CythonRunTestCase(CythonCompileTestCase): + def setUp(self): + CythonCompileTestCase.setUp(self) + from Cython.Compiler import Options + Options.clear_to_none = False + def shortDescription(self): if self.cython_only: return CythonCompileTestCase.shortDescription(self)