From: Robert Bradshaw Date: Fri, 23 Oct 2009 06:21:40 +0000 (-0700) Subject: Fix #250, Traceback method name is wrong for exceptions caught in methods X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=af67b788a520587d59ab3ed231e43e23dc70d4b0;p=cython.git Fix #250, Traceback method name is wrong for exceptions caught in methods --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 7d22f885..8b37eb86 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1019,12 +1019,12 @@ class FuncDefNode(StatNode, BlockNode): def create_local_scope(self, env): genv = env - while env.is_py_class_scope or env.is_c_class_scope: - env = env.outer_scope + while genv.is_py_class_scope or genv.is_c_class_scope: + genv = env.outer_scope if self.needs_closure: - lenv = GeneratorLocalScope(name = self.entry.name, outer_scope = genv) + lenv = GeneratorLocalScope(name = self.entry.name, outer_scope = genv, parent_scope = env) else: - lenv = LocalScope(name = self.entry.name, outer_scope = genv) + lenv = LocalScope(name = self.entry.name, outer_scope = genv, parent_scope = env) lenv.return_type = self.return_type type = self.entry.type if type.is_cfunction: @@ -2730,7 +2730,7 @@ class CClassDefNode(ClassDefNode): buffer_defaults = buffer_defaults) if home_scope is not env and self.visibility == 'extern': env.add_imported_entry(self.class_name, self.entry, pos) - scope = self.entry.type.scope + self.scope = scope = self.entry.type.scope if scope is not None: scope.directives = env.directives diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 93bf4bc2..34883967 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -698,6 +698,12 @@ property NAME: self.visitchildren(node) self.seen_vars_stack.pop() return node + + def visit_ClassDefNode(self, node): + self.env_stack.append(node.scope) + self.visitchildren(node) + self.env_stack.pop() + return node def visit_FuncDefNode(self, node): self.seen_vars_stack.append(set()) diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index bb96dd45..5bc9c3c5 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -1066,8 +1066,10 @@ class ModuleScope(Scope): class LocalScope(Scope): - def __init__(self, name, outer_scope): - Scope.__init__(self, name, outer_scope, outer_scope) + def __init__(self, name, outer_scope, parent_scope = None): + if parent_scope is None: + parent_scope = outer_scope + Scope.__init__(self, name, outer_scope, parent_scope) def mangle(self, prefix, name): return prefix + name