Author: Matti Picus <[email protected]>
Branch: win32-cleanup2
Changeset: r54948:ef88f94f3f2b
Date: 2012-05-07 23:05 +0300
http://bitbucket.org/pypy/pypy/changeset/ef88f94f3f2b/

Log:    rework fread, fwrite, feof and PyRun_File

diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -26,7 +26,7 @@
 from pypy.module.__builtin__.interp_classobj import W_ClassObject
 from pypy.module.__builtin__.interp_memoryview import W_MemoryView
 from pypy.rlib.entrypoint import entrypoint
-from pypy.rlib.rposix import is_valid_fd
+from pypy.rlib.rposix import is_valid_fd, validate_fd
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rlib.objectmodel import specialize
 from pypy.rlib.exports import export_struct
@@ -82,7 +82,7 @@
 FILEP = rffi.COpaquePtr('FILE')
 
 if sys.platform == 'win32':
-    fileno = rffi.llexternal('_fileno', [FILEP], rffi.INT)
+    _fileno = rffi.llexternal('_fileno', [FILEP], rffi.INT)
 else:
     fileno = rffi.llexternal('fileno', [FILEP], rffi.INT)
 
@@ -94,13 +94,24 @@
         return -1
     return _fclose(fp)
 
-fwrite = rffi.llexternal('fwrite',
+_fwrite = rffi.llexternal('fwrite',
                          [rffi.VOIDP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
                          rffi.SIZE_T)
-fread = rffi.llexternal('fread',
+def fwrite(buf, sz, n, fp):
+    validate_fd(fileno(fp))
+    return _fwrite(buf, sz, n, fp)
+
+_fread = rffi.llexternal('fread',
                         [rffi.VOIDP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
                         rffi.SIZE_T)
-feof = rffi.llexternal('feof', [FILEP], rffi.INT)
+def fread(buf, sz, n, fp):
+    validate_fd(fileno(fp))
+    return _fread(buf, sz, n, fp)
+
+_feof = rffi.llexternal('feof', [FILEP], rffi.INT)
+def feof(fp):
+    validate_fd(fileno(fp))
+    return _feof(fp)
 
 
 constant_names = """
diff --git a/pypy/module/cpyext/eval.py b/pypy/module/cpyext/eval.py
--- a/pypy/module/cpyext/eval.py
+++ b/pypy/module/cpyext/eval.py
@@ -2,15 +2,13 @@
 from pypy.interpreter.astcompiler import consts
 from pypy.rpython.lltypesystem import rffi, lltype
 from pypy.module.cpyext.api import (
-    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fileno, feof, Py_ssize_tP,
+    cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fread, feof, Py_ssize_tP,
     cpython_struct)
 from pypy.module.cpyext.pyobject import PyObject, borrow_from
 from pypy.module.cpyext.pyerrors import PyErr_SetFromErrno
 from pypy.module.cpyext.funcobject import PyCodeObject
 from pypy.module.__builtin__ import compiling
 
-import os
-
 PyCompilerFlags = cpython_struct(
     "PyCompilerFlags", (("cf_flags", rffi.INT),))
 PyCompilerFlagsPtr = lltype.Ptr(PyCompilerFlags)
@@ -154,23 +152,19 @@
     closeit set to 0 and flags set to NULL."""
     BUF_SIZE = 8192
     source = ""
+    filename = rffi.charp2str(filename)
+    buf = lltype.malloc(rffi.CCHARP.TO, BUF_SIZE, flavor='raw')
     try:
-        fd = fileno(fp)
-        count = os.fstat(fd).st_size
-        while len(source) < count:
-            buf = os.read(fd, BUF_SIZE)
-            source += buf
-            if len(buf) < BUF_SIZE:
-                break
-        else:
-            PyErr_SetFromErrno(space, space.w_IOError)
-    except:
-        PyErr_SetFromErrno(space, space.w_IOError)
-        return None
+        while True:
+            count = fread(buf, 1, BUF_SIZE, fp)
+            count = rffi.cast(lltype.Signed, count)
+            source += rffi.charpsize2str(buf, count)
+            if count < BUF_SIZE:
+                if feof(fp):
+                    break
+                PyErr_SetFromErrno(space, space.w_IOError)
     finally:
-        pass
-        #lltype.free(buf, flavor='raw')
-    filename = rffi.charp2str(filename)
+        lltype.free(buf, flavor='raw')
     return run_string(space, source, filename, start, w_globals, w_locals)
 
 # Undocumented function!
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to