Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r70976:82cb77058ff2 Date: 2014-04-25 13:07 -0400 http://bitbucket.org/pypy/pypy/changeset/82cb77058ff2/
Log: check types in file.writelines before writing diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py --- a/pypy/module/_file/interp_file.py +++ b/pypy/module/_file/interp_file.py @@ -460,20 +460,18 @@ space = self.space self.check_closed() - w_iterator = space.iter(w_lines) - while True: - try: - w_line = space.next(w_iterator) - except OperationError, e: - if not e.match(space, space.w_StopIteration): - raise - break # done - try: - line = w_line.charbuf_w(space) - except TypeError: - raise OperationError(space.w_TypeError, space.wrap( - "writelines() argument must be a sequence of strings")) - self.file_write(space.wrap(line)) + lines = space.fixedview(w_lines) + for i, w_line in enumerate(lines): + if not space.isinstance_w(w_line, space.w_str): + try: + line = w_line.charbuf_w(space) + except TypeError: + raise OperationError(space.w_TypeError, space.wrap( + "writelines() argument must be a sequence of strings")) + else: + lines[i] = space.wrap(line) + for w_line in lines: + self.file_write(w_line) def file_readinto(self, w_rwbuffer): """readinto() -> Undocumented. Don't use this; it may go away.""" diff --git a/pypy/module/_file/test/test_file_extra.py b/pypy/module/_file/test/test_file_extra.py --- a/pypy/module/_file/test/test_file_extra.py +++ b/pypy/module/_file/test/test_file_extra.py @@ -407,6 +407,11 @@ assert str(exc.value) == "writelines() argument must be a sequence of strings" assert open(fn, 'rb').readlines() == ['abcdef'] + with file(fn, 'wb') as f: + exc = raises(TypeError, f.writelines, ['abc', memoryview('def')]) + assert str(exc.value) == "writelines() argument must be a sequence of strings" + assert open(fn, 'rb').readlines() == [] + def test_nasty_writelines(self): # The stream lock should be released between writes fn = self.temptestfile _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit