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