diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2016-03-24 07:28:29 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2016-03-24 14:23:01 +0100 |
commit | e1cacea86e7ca11b2762bff286246f967452e6d5 (patch) | |
tree | 00a655d3c400a8ebdad50865286644262f8ab2dc | |
parent | 5b14c081d61e399d522f7ad002693b2cb6f8993c (diff) | |
download | cython-e1cacea86e7ca11b2762bff286246f967452e6d5.tar.gz |
fix reference leak in closure when reassigning to "*args" argument
-rw-r--r-- | Cython/Compiler/Nodes.py | 2 | ||||
-rw-r--r-- | tests/run/closure_leak_1.pyx | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 818e46614..ca13d0fc3 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1895,7 +1895,7 @@ class FuncDefNode(StatNode, BlockNode): elif is_cdef and entry.type.is_memoryviewslice and len(entry.cf_assignments) > 1: code.put_incref_memoryviewslice(entry.cname, have_gil=code.funcstate.gil_owned) for entry in lenv.var_entries: - if entry.is_arg and len(entry.cf_assignments) > 1: + if entry.is_arg and len(entry.cf_assignments) > 1 and not entry.in_closure: if entry.xdecref_cleanup: code.put_var_xincref(entry) else: diff --git a/tests/run/closure_leak_1.pyx b/tests/run/closure_leak_1.pyx new file mode 100644 index 000000000..f33e034be --- /dev/null +++ b/tests/run/closure_leak_1.pyx @@ -0,0 +1,11 @@ +# mode: run +# tag: closure + +def reassign_args(x, *args): + """ + >>> reassign_args(1, [1,2,3,4]) + """ + a,args = args[0], args[1:] + b = False + if b: + c = x.map_coefficients(lambda c: c(*args)) |