From e89ad8c867ae03319eef9fbec96fbf0518620779 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 23 Apr 2011 20:27:25 +0200 Subject: [PATCH] fix 'with' statement at module scope by reactivating old temp code for it --- Cython/Compiler/ParseTreeTransforms.py | 2 +- Cython/Compiler/TreeFragment.py | 16 +++++------ tests/bugs.txt | 1 - .../run/with_statement_module_level_T536.pyx | 27 ++++++++++++++----- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index f6bf584c..79d6e369 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -958,7 +958,7 @@ class WithTransform(CythonTransform, SkipDeclarations): }, pos=node.pos) # Set except excinfo target to EXCINFO - try_except = result.stats[-1].body.stats[-1] + try_except = result.body.stats[-1].body.stats[-1] try_except.except_clauses[0].excinfo_target = exc_info return result diff --git a/Cython/Compiler/TreeFragment.py b/Cython/Compiler/TreeFragment.py index c50f4f95..6ab0bf70 100644 --- a/Cython/Compiler/TreeFragment.py +++ b/Cython/Compiler/TreeFragment.py @@ -121,16 +121,15 @@ class TemplateTransform(VisitorTransform): temphandles = [] for temp in temps: TemplateTransform.temp_name_counter += 1 - handle = "__tmpvar_%d" % TemplateTransform.temp_name_counter -# handle = UtilNodes.TempHandle(PyrexTypes.py_object_type) + handle = UtilNodes.TempHandle(PyrexTypes.py_object_type) tempmap[temp] = handle -# temphandles.append(handle) + temphandles.append(handle) self.tempmap = tempmap result = super(TemplateTransform, self).__call__(node) -# if temps: -# result = UtilNodes.TempsBlockNode(self.get_pos(node), -# temps=temphandles, -# body=result) + if temps: + result = UtilNodes.TempsBlockNode(self.get_pos(node), + temps=temphandles, + body=result) return result def get_pos(self, node): @@ -161,9 +160,8 @@ class TemplateTransform(VisitorTransform): def visit_NameNode(self, node): temphandle = self.tempmap.get(node.name) if temphandle: - return NameNode(pos=node.pos, name=temphandle) # Replace name with temporary - #return temphandle.ref(self.get_pos(node)) + return temphandle.ref(self.get_pos(node)) else: return self.try_substitution(node, node.name) diff --git a/tests/bugs.txt b/tests/bugs.txt index c6fa8fe9..c586868e 100644 --- a/tests/bugs.txt +++ b/tests/bugs.txt @@ -10,7 +10,6 @@ cfunc_call_tuple_args_T408 compile.cpp_operators cpp_templated_ctypedef cpp_structs -with_statement_module_level_T536 function_as_method_T494 closure_inside_cdef_T554 pure_mode_cmethod_inheritance_T583 diff --git a/tests/run/with_statement_module_level_T536.pyx b/tests/run/with_statement_module_level_T536.pyx index bc163b56..563fb32c 100644 --- a/tests/run/with_statement_module_level_T536.pyx +++ b/tests/run/with_statement_module_level_T536.pyx @@ -3,17 +3,32 @@ __doc__ = """ >>> inner_result ['ENTER'] ->>> result +>>> result # doctest: +ELLIPSIS +['ENTER', "EXIT (, ValueError('TEST',), >> inner_result_no_exc +['ENTER'] +>>> result_no_exc ['ENTER', 'EXIT (None, None, None)'] """ -result = [] - class ContextManager(object): + def __init__(self, result): + self.result = result def __enter__(self): - result.append("ENTER") + self.result.append("ENTER") def __exit__(self, *values): - result.append("EXIT %r" % (values,)) + self.result.append("EXIT %r" % (values,)) + return True + +result_no_exc = [] + +with ContextManager(result_no_exc) as c: + inner_result_no_exc = result_no_exc[:] + +result = [] -with ContextManager() as c: +with ContextManager(result) as c: inner_result = result[:] + raise ValueError('TEST') + -- 2.26.2