diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2016-08-28 19:29:33 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2016-08-28 19:35:46 +0200 |
commit | 66c059d8221f1393a53aef815ca77b3f5bff82b9 (patch) | |
tree | d9e96fc63ca8045d8e133a83b0d23d9b7f56e88f /Cython/Compiler/ParseTreeTransforms.py | |
parent | 1b401b3048853a20856cd46ee3629a8110d41239 (diff) | |
download | cython-66c059d8221f1393a53aef815ca77b3f5bff82b9.tar.gz |
repair analysis scope and qualified name of cpdef wrapper node
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r-- | Cython/Compiler/ParseTreeTransforms.py | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 71c228df0..c293e9aa8 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -1697,6 +1697,8 @@ if VALUE is not None: def visit_DefNode(self, node): node = self.visit_FuncDefNode(node) env = self.current_env() + if node.is_wrapper: + env = env.parent_scope if (not isinstance(node, Nodes.DefNode) or node.fused_py_func or node.is_generator_body or not node.needs_assignment_synthesis(env)): @@ -1949,13 +1951,29 @@ class CalculateQualifiedNamesTransform(EnvTransform): return node def visit_PyCFunctionNode(self, node): - self._set_qualname(node, node.def_node.name) + orig_qualified_name = self.qualified_name[:] + if node.def_node.is_wrapper and self.qualified_name: + assert self.qualified_name[-1] == '<locals>', self.qualified_name + self.qualified_name.pop() + self._set_qualname(node) + else: + self._set_qualname(node, node.def_node.name) self.visitchildren(node) + self.qualified_name = orig_qualified_name return node def visit_DefNode(self, node): - self._set_qualname(node, node.name) - return self.visit_FuncDefNode(node) + if node.is_wrapper and self.qualified_name: + assert self.qualified_name[-1] == '<locals>', self.qualified_name + orig_qualified_name = self.qualified_name[:] + self.qualified_name.pop() + self._set_qualname(node) + self._super_visit_FuncDefNode(node) + self.qualified_name = orig_qualified_name + else: + self._set_qualname(node, node.name) + self.visit_FuncDefNode(node) + return node def visit_FuncDefNode(self, node): orig_qualified_name = self.qualified_name[:] |