Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r70978:0b124540057c Date: 2014-04-25 13:33 -0400 http://bitbucket.org/pypy/pypy/changeset/0b124540057c/
Log: test/fix some compile() behaviors diff --git a/lib-python/2.7/test/test_builtin.py b/lib-python/2.7/test/test_builtin.py --- a/lib-python/2.7/test/test_builtin.py +++ b/lib-python/2.7/test/test_builtin.py @@ -250,14 +250,12 @@ self.assertRaises(TypeError, compile) self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode') self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff) - if check_impl_detail(cpython=True): - self.assertRaises(TypeError, compile, chr(0), 'f', 'exec') + self.assertRaises(TypeError, compile, chr(0), 'f', 'exec') self.assertRaises(TypeError, compile, 'pass', '?', 'exec', mode='eval', source='0', filename='tmp') if have_unicode: compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec') - if check_impl_detail(cpython=True): - self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec') + self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec') self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad') diff --git a/pypy/module/__builtin__/compiling.py b/pypy/module/__builtin__/compiling.py --- a/pypy/module/__builtin__/compiling.py +++ b/pypy/module/__builtin__/compiling.py @@ -22,22 +22,6 @@ compile; if absent or zero these statements do influence the compilation, in addition to any features explicitly specified. """ - - ast_node = None - w_ast_type = space.gettypeobject(ast.AST.typedef) - str_ = None - if space.isinstance_w(w_source, w_ast_type): - ast_node = space.interp_w(ast.mod, w_source) - ast_node.sync_app_attrs(space) - elif space.isinstance_w(w_source, space.w_unicode): - w_utf_8_source = space.call_method(w_source, "encode", - space.wrap("utf-8")) - str_ = space.str_w(w_utf_8_source) - # This flag tells the parser to reject any coding cookies it sees. - flags |= consts.PyCF_SOURCE_IS_UTF8 - else: - str_ = space.str_w(w_source) - ec = space.getexecutioncontext() if flags & ~(ec.compiler.compiler_flags | consts.PyCF_ONLY_AST | consts.PyCF_DONT_IMPLY_DEDENT | consts.PyCF_SOURCE_IS_UTF8): @@ -53,14 +37,30 @@ space.wrap("compile() arg 3 must be 'exec' " "or 'eval' or 'single'")) - if ast_node is None: - if flags & consts.PyCF_ONLY_AST: - mod = ec.compiler.compile_to_ast(str_, filename, mode, flags) - return space.wrap(mod) - else: - code = ec.compiler.compile(str_, filename, mode, flags) + w_ast_type = space.gettypeobject(ast.AST.typedef) + if space.isinstance_w(w_source, w_ast_type): + ast_node = space.interp_w(ast.mod, w_source) + ast_node.sync_app_attrs(space) + code = ec.compiler.compile_ast(ast_node, filename, mode, flags) + return space.wrap(code) + + if space.isinstance_w(w_source, space.w_unicode): + w_utf_8_source = space.call_method(w_source, "encode", + space.wrap("utf-8")) + str_ = space.str_w(w_utf_8_source) + # This flag tells the parser to reject any coding cookies it sees. + flags |= consts.PyCF_SOURCE_IS_UTF8 else: - code = ec.compiler.compile_ast(ast_node, filename, mode, flags) + str_ = space.readbuf_w(w_source).as_str() + + if '\x00' in str_: + raise OperationError(space.w_TypeError, space.wrap( + "compile() expected string without null bytes")) + + if flags & consts.PyCF_ONLY_AST: + code = ec.compiler.compile_to_ast(str_, filename, mode, flags) + else: + code = ec.compiler.compile(str_, filename, mode, flags) return space.wrap(code) diff --git a/pypy/module/__builtin__/test/test_builtin.py b/pypy/module/__builtin__/test/test_builtin.py --- a/pypy/module/__builtin__/test/test_builtin.py +++ b/pypy/module/__builtin__/test/test_builtin.py @@ -490,6 +490,14 @@ def test_compile(self): co = compile('1+2', '?', 'eval') assert eval(co) == 3 + co = compile(buffer('1+2'), '?', 'eval') + assert eval(co) == 3 + exc = raises(TypeError, compile, chr(0), '?', 'eval') + assert str(exc.value) == "compile() expected string without null bytes" + exc = raises(TypeError, compile, unichr(0), '?', 'eval') + assert str(exc.value) == "compile() expected string without null bytes" + exc = raises(TypeError, compile, memoryview('1+2'), '?', 'eval') + assert str(exc.value) == "expected a readable buffer object" compile("from __future__ import with_statement", "<test>", "exec") raises(SyntaxError, compile, '-', '?', 'eval') raises(ValueError, compile, '"\\xt"', '?', 'eval') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit