fix temp handling in 'with' transform
authorStefan Behnel <scoder@users.berlios.de>
Thu, 27 Nov 2008 08:10:12 +0000 (09:10 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Thu, 27 Nov 2008 08:10:12 +0000 (09:10 +0100)
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/Tests/TestParseTreeTransforms.py

index f4b02fdeff257bb6d9efca536039a2db07b77e2b..94689d6c2146434af168e5bb395197a7bf39325b 100644 (file)
@@ -457,6 +457,7 @@ class WithTransform(CythonTransform):
         EXIT = MGR.__exit__
         MGR.__enter__()
         EXC = True
+        EXCINFO = None
         try:
             try:
                 BODY
@@ -475,6 +476,7 @@ class WithTransform(CythonTransform):
         EXIT = MGR.__exit__
         VALUE = MGR.__enter__()
         EXC = True
+        EXCINFO = None
         try:
             try:
                 TARGET = VALUE
@@ -490,7 +492,9 @@ class WithTransform(CythonTransform):
     pipeline=[NormalizeTree(None)])
 
     def visit_WithStatNode(self, node):
-        excinfo_temp = TempHandle(PyrexTypes.py_object_type)
+        # FIXME: excinfo_temp should be more local to the except
+        # clause that uses it, to avoid the presetting to None
+        excinfo_temp = TempHandle(Builtin.tuple_type)
         if node.target is not None:
             result = self.template_with_target.substitute({
                 u'EXPR' : node.manager,
@@ -498,18 +502,16 @@ class WithTransform(CythonTransform):
                 u'TARGET' : node.target,
                 u'EXCINFO' : excinfo_temp.ref(node.pos)
                 }, pos=node.pos)
-            # Set except excinfo target to EXCINFO
-            result.body.stats[4].body.stats[0].except_clauses[0].excinfo_target = (
-                excinfo_temp.ref(node.pos))
         else:
             result = self.template_without_target.substitute({
                 u'EXPR' : node.manager,
                 u'BODY' : node.body,
                 u'EXCINFO' : excinfo_temp.ref(node.pos)
                 }, pos=node.pos)
-            # Set except excinfo target to EXCINFO
-            result.body.stats[4].body.stats[0].except_clauses[0].excinfo_target = (
-                excinfo_temp.ref(node.pos))
+
+        # Set except excinfo target to EXCINFO
+        result.body.stats[5].body.stats[0].except_clauses[0].excinfo_target = (
+            excinfo_temp.ref(node.pos))
 
         return TempsBlockNode(node.pos, temps=[excinfo_temp], body=result)
 
index 93e3d45257aafa6d4bb27795be23748b945101c8..e79b1d6bb24886cb8ea45bb1f572c8b22e20f3c4 100644 (file)
@@ -99,6 +99,7 @@ class TestWithTransform(TransformTest):
         $1_2 = $1_0.__exit__
         $1_0.__enter__()
         $1_1 = True
+        $0_0 = None
         try:
             try:
                 y = z ** 3
@@ -123,6 +124,7 @@ class TestWithTransform(TransformTest):
         $1_2 = $1_0.__exit__
         $1_3 = $1_0.__enter__()
         $1_1 = True
+        $0_0 = None
         try:
             try:
                 y = $1_3