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.putln("Py_INCREF(Py_None); return Py_None;")
code.putln('}')
else:
arg.default.allocate_temps(genv)
arg.default_entry = genv.add_default_value(arg.type)
+ if arg.type.is_pyobject:
+ arg.default_entry.init = 0
arg.default_entry.used = 1
arg.default_result_code = arg.default_entry.cname
else:
if default:
if not default.is_literal:
default.generate_evaluation_code(code)
- default.make_owned_reference(code)
- code.putln(
- "%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())
+ 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.free_temps(code)
# For Python class methods, create and store function object
if self.assmt:
--- /dev/null
+__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 ...>
+>>> g3() #doctest: +ELLIPSIS
+<argdefaultglb.Foo object at ...>
+
+>>> f4() #doctest: +ELLIPSIS
+<argdefaultglb.Bar object at ...>
+>>> g4() #doctest: +ELLIPSIS
+<argdefaultglb.Bar object at ...>
+
+>>> f5() #doctest: +ELLIPSIS
+<argdefaultglb.Bla object at ...>
+>>> g5() #doctest: +ELLIPSIS
+<argdefaultglb.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