[pypy-commit] pypy default: add failing test - cpyext uses a buffered FILE* but W_File uses a non-bufferd int fid

mattip pypy.commits at gmail.com
Thu Aug 4 16:09:16 EDT 2016


Author: Matti Picus <matti.picus at gmail.com>
Branch: 
Changeset: r86021:700c5913e7ea
Date: 2016-08-04 21:35 +0300
http://bitbucket.org/pypy/pypy/changeset/700c5913e7ea/

Log:	add failing test - cpyext uses a buffered FILE* but W_File uses a
	non-bufferd int fid

diff --git a/pypy/module/cpyext/pyfile.py b/pypy/module/cpyext/pyfile.py
--- a/pypy/module/cpyext/pyfile.py
+++ b/pypy/module/cpyext/pyfile.py
@@ -1,6 +1,6 @@
 from rpython.rtyper.lltypesystem import rffi, lltype
 from pypy.module.cpyext.api import (
-    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, build_type_checkers, fdopen)
+    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, build_type_checkers, c_fdopen)
 from pypy.module.cpyext.pyobject import PyObject
 from pypy.module.cpyext.object import Py_PRINT_RAW
 from pypy.interpreter.error import (OperationError, oefmt, 
@@ -64,7 +64,7 @@
     if (fd < 0 or not mode or mode[0] not in ['r', 'w', 'a', 'U'] or
         ('U' in mode and ('w' in mode or 'a' in mode))):
         raise oefmt(space.w_IOError, 'invalid fileno or mode') 
-    ret = fdopen(fd, mode)
+    ret = c_fdopen(fd, mode)
     if not ret:
         raise exception_from_saved_errno(space, space.w_IOError)
     return ret
diff --git a/pypy/module/cpyext/test/test_pyfile.py b/pypy/module/cpyext/test/test_pyfile.py
--- a/pypy/module/cpyext/test/test_pyfile.py
+++ b/pypy/module/cpyext/test/test_pyfile.py
@@ -1,5 +1,4 @@
 from pypy.conftest import option
-from pypy.module.cpyext.api import fopen, fclose, fwrite
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
 from pypy.module.cpyext.object import Py_PRINT_RAW
@@ -133,6 +132,15 @@
                     return PyLong_FromLong(0);
                 return PyLong_FromLong(ftell(fp));
              """),
+            ("read_10", "METH_O",
+             """
+                char s[10];
+                FILE * fp = PyFile_AsFile(args);
+                if (fp == NULL)
+                    return PyLong_FromLong(0);
+                fread(s, 1, 10, fp);
+                return PyLong_FromLong(ftell(fp));
+             """),
             ])
         filename = self.udir + "/_test_file"
         with open(filename, 'w') as fid:
@@ -142,5 +150,12 @@
             t_py = fid.tell()
             assert t_py == 80
             t_c = module.get_c_tell(fid)
-        assert t_c == t_py
+            assert t_c == t_py
+            print '-------- tell ',t_c
+            t_c = module.read_10(fid)
+            assert t_c == t_py + 10
+            print '-------- tell ',t_c
+            t_py = fid.tell()
+            assert t_c == t_py, 'after a fread, c level ftell(fp) %d but PyFile.tell() %d' % (t_c, t_py)
 
+


More information about the pypy-commit mailing list