summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ParseTreeTransforms.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2016-08-28 19:29:33 +0200
committerStefan Behnel <stefan_ml@behnel.de>2016-08-28 19:35:46 +0200
commit66c059d8221f1393a53aef815ca77b3f5bff82b9 (patch)
treed9e96fc63ca8045d8e133a83b0d23d9b7f56e88f /Cython/Compiler/ParseTreeTransforms.py
parent1b401b3048853a20856cd46ee3629a8110d41239 (diff)
downloadcython-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.py24
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[:]