Commit 52d9fdb8 authored by Stefan Behnel's avatar Stefan Behnel

merge and fixes

parents 5612dcc5 3a17b1cd
...@@ -1706,6 +1706,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1706,6 +1706,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.put_decref_clear(entry.pystring_cname, code.put_decref_clear(entry.pystring_cname,
PyrexTypes.py_object_type, PyrexTypes.py_object_type,
nanny=False) nanny=False)
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("Py_INCREF(Py_None); return Py_None;")
code.putln('}') code.putln('}')
......
...@@ -992,6 +992,8 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -992,6 +992,8 @@ class FuncDefNode(StatNode, BlockNode):
else: else:
arg.default.allocate_temps(genv) arg.default.allocate_temps(genv)
arg.default_entry = genv.add_default_value(arg.type) 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_entry.used = 1
arg.default_result_code = arg.default_entry.cname arg.default_result_code = arg.default_entry.cname
else: else:
...@@ -1232,14 +1234,15 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -1232,14 +1234,15 @@ class FuncDefNode(StatNode, BlockNode):
if not default.is_literal: if not default.is_literal:
default.generate_evaluation_code(code) default.generate_evaluation_code(code)
default.make_owned_reference(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: if default.is_temp and default.type.is_pyobject:
cleanup = " %s = 0;" % default.result()
else:
cleanup = ''
code.putln( code.putln(
"%s = 0;" % "%s = %s;%s" % (
default.result()) arg.default_entry.cname,
default.result_as(arg.default_entry.type),
cleanup))
code.put_giveref(arg.default_entry.cname) code.put_giveref(arg.default_entry.cname)
default.free_temps(code) default.free_temps(code)
# For Python class methods, create and store function object # For Python class methods, create and store function object
......
__doc__ = """
>>> f0()
(1, 2)
>>> g0()
(1, 2)
>>> f1()
[1, 2]
>>> g1()
[1, 2]
>>> f2()
{1: 2}
>>> g2()
{1: 2}
>>> f3() #doctest: +ELLIPSIS
<argdefault.Foo object at ...>
>>> g3() #doctest: +ELLIPSIS
<argdefault.Foo object at ...>
>>> f4() #doctest: +ELLIPSIS
<argdefault.Bar object at ...>
>>> g4() #doctest: +ELLIPSIS
<argdefault.Bar object at ...>
>>> f5() #doctest: +ELLIPSIS
<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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment