[pypy-commit] pypy use-file-star-for-file: test/fix rfile buffering
bdkearns
noreply at buildbot.pypy.org
Fri Aug 29 00:06:12 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73125:be91fae57988
Date: 2014-08-28 18:05 -0400
http://bitbucket.org/pypy/pypy/changeset/be91fae57988/
Log: test/fix rfile buffering
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -32,6 +32,7 @@
_IONBF = platform.DefinedConstantInteger('_IONBF')
_IOLBF = platform.DefinedConstantInteger('_IOLBF')
_IOFBF = platform.DefinedConstantInteger('_IOFBF')
+ BUFSIZ = platform.DefinedConstantInteger('BUFSIZ')
config = platform.configure(CConfig)
@@ -40,6 +41,7 @@
_IONBF = config['_IONBF']
_IOLBF = config['_IOLBF']
_IOFBF = config['_IOFBF']
+BUFSIZ = config['BUFSIZ']
c_fopen = llexternal('fopen', [rffi.CCHARP, rffi.CCHARP], FILEP)
c_fclose = llexternal('fclose', [FILEP], rffi.INT, releasegil=False)
@@ -65,7 +67,7 @@
c_popen = llexternal('popen', [rffi.CCHARP, rffi.CCHARP], FILEP)
c_pclose = llexternal('pclose', [FILEP], rffi.INT, releasegil=False)
-c_setvbuf = llexternal('setvbuf', [FILEP, rffi.CCHARP, rffi.INT, rffi.SIZE_T], lltype.Void)
+c_setvbuf = llexternal('setvbuf', [FILEP, rffi.CCHARP, rffi.INT, rffi.SIZE_T], rffi.INT)
BASE_BUF_SIZE = 4096
BASE_LINE_SIZE = 100
@@ -92,8 +94,13 @@
lltype.free(ll_mode, flavor='raw')
finally:
lltype.free(ll_name, flavor='raw')
- if buffering != -1:
- c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOFBF, buffering)
+ if buffering >= 0:
+ if buffering == 0:
+ c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IONBF, 0)
+ elif buffering == 1:
+ c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOLBF, BUFSIZ)
+ else:
+ c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOFBF, buffering)
return RFile(ll_f)
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -20,18 +20,36 @@
self.interpret(f, [])
assert open(fname, "r").read() == "dupa"
- def test_open_buffering(self):
+ def test_open_buffering_line(self):
fname = str(self.tmpdir.join('file_1a'))
def f():
- f = open(fname, 'w', 3)
+ f = open(fname, 'w', 1)
+ f.write('dupa\ndupb')
+ f2 = open(fname, 'r')
+ assert f2.read() == 'dupa\n'
+ f.close()
+ assert f2.read() == 'dupb'
+ f2.close()
+
+ f()
+ self.interpret(f, [])
+
+ def test_open_buffering_full(self):
+ fname = str(self.tmpdir.join('file_1b'))
+
+ def f():
+ f = open(fname, 'w', 128)
f.write('dupa')
f2 = open(fname, 'r')
assert f2.read() == ''
+ f.write('z' * 5000)
+ assert f2.read() != ''
f.close()
- f2 = open(fname, 'r')
- assert f2.read() == 'dupa'
+ assert f2.read() != ''
+ f2.close()
+ f()
self.interpret(f, [])
def test_read_write(self):
More information about the pypy-commit
mailing list