summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2016-03-24 07:28:29 +0100
committerStefan Behnel <stefan_ml@behnel.de>2016-03-24 14:23:01 +0100
commite1cacea86e7ca11b2762bff286246f967452e6d5 (patch)
tree00a655d3c400a8ebdad50865286644262f8ab2dc
parent5b14c081d61e399d522f7ad002693b2cb6f8993c (diff)
downloadcython-e1cacea86e7ca11b2762bff286246f967452e6d5.tar.gz
fix reference leak in closure when reassigning to "*args" argument
-rw-r--r--Cython/Compiler/Nodes.py2
-rw-r--r--tests/run/closure_leak_1.pyx11
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))