Handle generic declared args inside closure
authorVitja Makarov <vitja.makarov@gmail.com>
Wed, 30 Mar 2011 19:28:04 +0000 (21:28 +0200)
committerVitja Makarov <vitja.makarov@gmail.com>
Wed, 30 Mar 2011 19:28:04 +0000 (21:28 +0200)
Cython/Compiler/ModuleNode.py
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/Symtab.py

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