code.put_decref_clear(entry.pystring_cname,
PyrexTypes.py_object_type,
nanny=False)
- code.putln("Py_DECREF(%s); %s = 0;" % (
- code.entry_as_pyobject(entry), entry.cname))
+ for entry in env.default_entries:
+ if entry.type.is_pyobject and entry.used:
++ code.put_var_decref_clear(entry)
code.putln("Py_INCREF(Py_None); return Py_None;")
code.putln('}')
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:
--- /dev/null
-<argdefaultglb.Foo object at ...>
+ __doc__ = """
+ >>> f0()
+ (1, 2)
+ >>> g0()
+ (1, 2)
+
+ >>> f1()
+ [1, 2]
+ >>> g1()
+ [1, 2]
+
+ >>> f2()
+ {1: 2}
+ >>> g2()
+ {1: 2}
+
+ >>> f3() #doctest: +ELLIPSIS
-<argdefaultglb.Foo object at ...>
++<argdefault.Foo object at ...>
+ >>> g3() #doctest: +ELLIPSIS
-<argdefaultglb.Bar object at ...>
++<argdefault.Foo object at ...>
+
+ >>> f4() #doctest: +ELLIPSIS
-<argdefaultglb.Bar object at ...>
++<argdefault.Bar object at ...>
+ >>> g4() #doctest: +ELLIPSIS
-<argdefaultglb.Bla object at ...>
++<argdefault.Bar object at ...>
+
+ >>> f5() #doctest: +ELLIPSIS
-<argdefaultglb.Bla object at ...>
++<argdefault.Bla object at ...>
+ >>> g5() #doctest: +ELLIPSIS
++<argdefault.Bla object at ...>
+ """
+
+ 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