From: Stefan Behnel Date: Wed, 29 Dec 2010 22:34:13 +0000 (+0100) Subject: fix closure handling for decorated methods X-Git-Tag: 0.14.1rc0~37 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=00c78163376bc057fbda14f4c642b40ab9d124f2;p=cython.git fix closure handling for decorated methods --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 0e7af2d4..00db4151 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1881,6 +1881,7 @@ class DefNode(FuncDefNode): # when the def statement is inside a Python class definition. # # assmt AssignmentNode Function construction/assignment + # py_cfunc_node PyCFunctionNode/InnerFunctionNode The PyCFunction to create and assign child_attrs = ["args", "star_arg", "starstar_arg", "body", "decorators"] @@ -1895,6 +1896,7 @@ class DefNode(FuncDefNode): entry = None acquire_gil = 0 self_in_stararg = 0 + py_cfunc_node = None def __init__(self, pos, **kwds): FuncDefNode.__init__(self, pos, **kwds) @@ -2242,16 +2244,17 @@ class DefNode(FuncDefNode): genv = genv.outer_scope if genv.is_closure_scope: - rhs = ExprNodes.InnerFunctionNode( + self.py_cfunc_node = ExprNodes.InnerFunctionNode( self.pos, pymethdef_cname = self.entry.pymethdef_cname) else: - rhs = ExprNodes.PyCFunctionNode( + self.py_cfunc_node = ExprNodes.PyCFunctionNode( self.pos, pymethdef_cname = self.entry.pymethdef_cname, binding = env.directives['binding']) if env.is_py_class_scope: if not self.is_staticmethod and not self.is_classmethod: - rhs.binding = True + self.py_cfunc_node.binding = True + rhs = self.py_cfunc_node if self.decorators: for decorator in self.decorators[::-1]: rhs = ExprNodes.SimpleCallNode( diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 166ceec7..6ea7cc02 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -957,7 +957,7 @@ class DecoratorTransform(ScopeTrackingTransform, SkipDeclarations): def visit_DefNode(self, func_node): scope_type = self.scope_type func_node = self.visit_FuncDefNode(func_node) - if scope_type is not 'cclass' or not func_node.decorators: + if scope_type != 'cclass' or not func_node.decorators: return func_node return self._handle_decorators( func_node, func_node.name) @@ -1359,9 +1359,9 @@ class CreateClosureClasses(CythonTransform): if not from_closure and (self.path or inner_node): if not inner_node: - if not node.assmt: + if not node.py_cfunc_node: raise InternalError, "DefNode does not have assignment node" - inner_node = node.assmt.rhs + inner_node = node.py_cfunc_node inner_node.needs_self_code = False node.needs_outer_scope = False # Simple cases