Commit 426999c6 authored by Stefan Behnel's avatar Stefan Behnel

fix temp handling in 'with' transform

parent 571e3b08
...@@ -457,6 +457,7 @@ class WithTransform(CythonTransform): ...@@ -457,6 +457,7 @@ class WithTransform(CythonTransform):
EXIT = MGR.__exit__ EXIT = MGR.__exit__
MGR.__enter__() MGR.__enter__()
EXC = True EXC = True
EXCINFO = None
try: try:
try: try:
BODY BODY
...@@ -475,6 +476,7 @@ class WithTransform(CythonTransform): ...@@ -475,6 +476,7 @@ class WithTransform(CythonTransform):
EXIT = MGR.__exit__ EXIT = MGR.__exit__
VALUE = MGR.__enter__() VALUE = MGR.__enter__()
EXC = True EXC = True
EXCINFO = None
try: try:
try: try:
TARGET = VALUE TARGET = VALUE
...@@ -490,7 +492,9 @@ class WithTransform(CythonTransform): ...@@ -490,7 +492,9 @@ class WithTransform(CythonTransform):
pipeline=[NormalizeTree(None)]) pipeline=[NormalizeTree(None)])
def visit_WithStatNode(self, node): 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: if node.target is not None:
result = self.template_with_target.substitute({ result = self.template_with_target.substitute({
u'EXPR' : node.manager, u'EXPR' : node.manager,
...@@ -498,18 +502,16 @@ class WithTransform(CythonTransform): ...@@ -498,18 +502,16 @@ class WithTransform(CythonTransform):
u'TARGET' : node.target, u'TARGET' : node.target,
u'EXCINFO' : excinfo_temp.ref(node.pos) u'EXCINFO' : excinfo_temp.ref(node.pos)
}, pos=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: else:
result = self.template_without_target.substitute({ result = self.template_without_target.substitute({
u'EXPR' : node.manager, u'EXPR' : node.manager,
u'BODY' : node.body, u'BODY' : node.body,
u'EXCINFO' : excinfo_temp.ref(node.pos) u'EXCINFO' : excinfo_temp.ref(node.pos)
}, pos=node.pos) }, pos=node.pos)
# Set except excinfo target to EXCINFO
result.body.stats[4].body.stats[0].except_clauses[0].excinfo_target = ( # Set except excinfo target to EXCINFO
excinfo_temp.ref(node.pos)) 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) return TempsBlockNode(node.pos, temps=[excinfo_temp], body=result)
......
...@@ -99,6 +99,7 @@ class TestWithTransform(TransformTest): ...@@ -99,6 +99,7 @@ class TestWithTransform(TransformTest):
$1_2 = $1_0.__exit__ $1_2 = $1_0.__exit__
$1_0.__enter__() $1_0.__enter__()
$1_1 = True $1_1 = True
$0_0 = None
try: try:
try: try:
y = z ** 3 y = z ** 3
...@@ -123,6 +124,7 @@ class TestWithTransform(TransformTest): ...@@ -123,6 +124,7 @@ class TestWithTransform(TransformTest):
$1_2 = $1_0.__exit__ $1_2 = $1_0.__exit__
$1_3 = $1_0.__enter__() $1_3 = $1_0.__enter__()
$1_1 = True $1_1 = True
$0_0 = None
try: try:
try: try:
y = $1_3 y = $1_3
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment