# 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"]
entry = None
acquire_gil = 0
self_in_stararg = 0
+ py_cfunc_node = None
def __init__(self, pos, **kwds):
FuncDefNode.__init__(self, pos, **kwds)
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(
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)
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