Patch #1638243: the compiler package is now able to correctly compile

a with statement; previously, executing code containing a with statement
compiled by the compiler package crashed the interpreter.
This commit is contained in:
Georg Brandl 2007-01-27 17:43:02 +00:00
parent 7a7cbae77b
commit ab49684f55
4 changed files with 38 additions and 1 deletions

View File

@ -849,6 +849,8 @@ class CodeGenerator:
self.emit('LOAD_CONST', None)
self.nextBlock(final)
self.setups.push((END_FINALLY, final))
self._implicitNameOp('LOAD', exitvar)
self._implicitNameOp('DELETE', exitvar)
self.emit('WITH_CLEANUP')
self.emit('END_FINALLY')
self.setups.pop()

View File

@ -960,7 +960,7 @@ class Transformer:
if nodelist[2][0] == token.COLON:
var = None
else:
var = self.com_node(nodelist[2])
var = self.com_assign(nodelist[2][2], OP_ASSIGN)
return With(expr, var, body, lineno=nodelist[0][2])
def com_with_var(self, nodelist):

View File

@ -7,6 +7,12 @@ from random import random
# How much time in seconds can pass before we print a 'Still working' message.
_PRINT_WORKING_MSG_INTERVAL = 5 * 60
class TrivialContext(object):
def __enter__(self):
return self
def __exit__(self, *exc_info):
pass
class CompilerTest(unittest.TestCase):
def testCompileLibrary(self):
@ -123,6 +129,31 @@ class CompilerTest(unittest.TestCase):
'eval')
self.assertEquals(eval(c), [(0, 3), (1, 3), (2, 3)])
def testWith(self):
# SF bug 1638243
c = compiler.compile('from __future__ import with_statement\n'
'def f():\n'
' with TrivialContext():\n'
' return 1\n'
'result = f()',
'<string>',
'exec' )
dct = {'TrivialContext': TrivialContext}
exec c in dct
self.assertEquals(dct.get('result'), 1)
def testWithAss(self):
c = compiler.compile('from __future__ import with_statement\n'
'def f():\n'
' with TrivialContext() as tc:\n'
' return 1\n'
'result = f()',
'<string>',
'exec' )
dct = {'TrivialContext': TrivialContext}
exec c in dct
self.assertEquals(dct.get('result'), 1)
NOLINENO = (compiler.ast.Module, compiler.ast.Stmt, compiler.ast.Discard)

View File

@ -123,6 +123,10 @@ Core and builtins
Library
-------
- Patch #1638243: the compiler package is now able to correctly compile
a with statement; previously, executing code containing a with statement
compiled by the compiler package crashed the interpreter.
- Bug #1643943: Fix time.strptime's support for the %U directive.
- Patch #1643874: memory leak in ctypes fixed.