From: Stefan Behnel Date: Mon, 23 Feb 2009 20:42:43 +0000 (+0100) Subject: merge and fixes X-Git-Tag: 0.11.rc~47 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=52d9fdb8d55002f3f1fd0727b5100da72926942e;p=cython.git merge and fixes --- 52d9fdb8d55002f3f1fd0727b5100da72926942e diff --cc Cython/Compiler/ModuleNode.py index d6d8f4ca,3967f8dd..bd15729b --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@@ -1706,6 -1706,10 +1706,9 @@@ class ModuleNode(Nodes.Node, Nodes.Bloc code.put_decref_clear(entry.pystring_cname, PyrexTypes.py_object_type, nanny=False) + for entry in env.default_entries: + if entry.type.is_pyobject and entry.used: - code.putln("Py_DECREF(%s); %s = 0;" % ( - code.entry_as_pyobject(entry), entry.cname)) ++ code.put_var_decref_clear(entry) code.putln("Py_INCREF(Py_None); return Py_None;") code.putln('}') diff --cc Cython/Compiler/Nodes.py index 01eb070a,b1c850ab..57dce96a --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@@ -1231,16 -1233,14 +1233,17 @@@ class FuncDefNode(StatNode, BlockNode) if default: if not default.is_literal: default.generate_evaluation_code(code) - assign_code = "%s = %s;" % ( - arg.default_entry.cname, - default.result_as(arg.default_entry.type)) - if default.type.is_pyobject: - assign_code += " Py_INCREF(%s);" % \ - arg.type.as_pyobject(arg.default_entry.cname) - code.putln(assign_code) - default.generate_disposal_code(code) + default.make_owned_reference(code) ++ if default.is_temp and default.type.is_pyobject: ++ cleanup = " %s = 0;" % default.result() ++ else: ++ cleanup = '' + code.putln( - "%s = %s;" % ( ++ "%s = %s;%s" % ( + arg.default_entry.cname, - default.result_as(arg.default_entry.type))) - if default.is_temp and default.type.is_pyobject: - code.putln( - "%s = 0;" % - default.result()) ++ default.result_as(arg.default_entry.type), ++ cleanup)) + code.put_giveref(arg.default_entry.cname) default.free_temps(code) # For Python class methods, create and store function object if self.assmt: diff --cc tests/run/argdefault.pyx index 00000000,6ef1faaa..d1cdf7b4 mode 000000,100644..100644 --- a/tests/run/argdefault.pyx +++ b/tests/run/argdefault.pyx @@@ -1,0 -1,78 +1,78 @@@ + __doc__ = """ + >>> f0() + (1, 2) + >>> g0() + (1, 2) + + >>> f1() + [1, 2] + >>> g1() + [1, 2] + + >>> f2() + {1: 2} + >>> g2() + {1: 2} + + >>> f3() #doctest: +ELLIPSIS - ++ + >>> g3() #doctest: +ELLIPSIS - ++ + + >>> f4() #doctest: +ELLIPSIS - ++ + >>> g4() #doctest: +ELLIPSIS - ++ + + >>> f5() #doctest: +ELLIPSIS - ++ + >>> g5() #doctest: +ELLIPSIS - ++ + """ + + GLB0 = (1, 2) + def f0(arg=GLB0): + return arg + def g0(arg=(1, 2)): + return arg + + + GLB1 = [1, 2] + def f1(arg=GLB1): + return arg + def g1(arg=[1, 2]): + return arg + + + cdef GLB2 = {1: 2} + def f2(arg=GLB2): + return arg + def g2(arg={1: 2}): + return arg + + + class Foo(object): + pass + cdef GLB3 = Foo() + def f3(arg=GLB3): + return arg + def g3(arg=Foo()): + return arg + + + cdef class Bar: + pass + cdef Bar GLB4 = Bar() + def f4(arg=GLB4): + return arg + def g4(arg=Bar()): + return arg + + + cdef class Bla: + pass + cdef Bla GLB5 = Bla() + def f5(Bla arg=GLB5): + return arg + def g5(Bla arg=Bla()): + return arg