Author: Brian Kearns <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit