Commit 62567a26 authored by Vitja Makarov's avatar Vitja Makarov

Handle generic declared args inside closure

parent 3060b7f1
...@@ -942,9 +942,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -942,9 +942,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
type.vtabstruct_cname, type.vtabstruct_cname,
type.vtabslot_cname)) type.vtabslot_cname))
for attr in type.scope.var_entries: for attr in type.scope.var_entries:
if attr.is_declared_generic:
attr_type = py_object_type
else:
attr_type = attr.type
code.putln( code.putln(
"%s;" % "%s;" %
attr.type.declaration_code(attr.cname)) attr_type.declaration_code(attr.cname))
code.putln(footer) code.putln(footer)
if type.objtypedef_cname is not None: if type.objtypedef_cname is not None:
# Only for exposing public typedef name. # Only for exposing public typedef name.
...@@ -1241,6 +1245,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1241,6 +1245,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
for entry in py_attrs: for entry in py_attrs:
name = "p->%s" % entry.cname name = "p->%s" % entry.cname
code.putln("tmp = ((PyObject*)%s);" % name) code.putln("tmp = ((PyObject*)%s);" % name)
if entry.is_declared_generic:
code.put_init_to_py_none(name, py_object_type, nanny=False)
else:
code.put_init_to_py_none(name, entry.type, nanny=False) code.put_init_to_py_none(name, entry.type, nanny=False)
code.putln("Py_XDECREF(tmp);") code.putln("Py_XDECREF(tmp);")
code.putln( code.putln(
......
...@@ -1636,11 +1636,13 @@ class CreateClosureClasses(CythonTransform): ...@@ -1636,11 +1636,13 @@ class CreateClosureClasses(CythonTransform):
is_cdef=True) is_cdef=True)
node.needs_outer_scope = True node.needs_outer_scope = True
for name, entry in in_closure: for name, entry in in_closure:
class_scope.declare_var(pos=entry.pos, closure_entry = class_scope.declare_var(pos=entry.pos,
name=entry.name, name=entry.name,
cname=entry.cname, cname=entry.cname,
type=entry.type, type=entry.type,
is_cdef=True) is_cdef=True)
if entry.is_declared_generic:
closure_entry.is_declared_generic = 1
node.needs_closure = True node.needs_closure = True
# Do it here because other classes are already checked # Do it here because other classes are already checked
target_module_scope.check_c_class(func_scope.scope_class) target_module_scope.check_c_class(func_scope.scope_class)
......
...@@ -1331,6 +1331,7 @@ class LocalScope(Scope): ...@@ -1331,6 +1331,7 @@ class LocalScope(Scope):
inner_entry.is_variable = True inner_entry.is_variable = True
inner_entry.outer_entry = entry inner_entry.outer_entry = entry
inner_entry.from_closure = True inner_entry.from_closure = True
inner_entry.is_declared_generic = entry.is_declared_generic
self.entries[name] = inner_entry self.entries[name] = inner_entry
return inner_entry return inner_entry
return entry return entry
......
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