Author: Matti Picus <[email protected]>
Branch: msvc14
Changeset: r93787:024b40ba48bf
Date: 2018-02-08 23:56 -0500
http://bitbucket.org/pypy/pypy/changeset/024b40ba48bf/
Log: tweak checks of file descriptors for lack of is_valid_fd, update
tests
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
@@ -115,13 +115,6 @@
with FdValidator(c_fileno(fp)):
return _feof(fp)
-def is_valid_fp(fp):
- try:
- with FdValidator(c_fileno(fp)):
- return 1
- except IOError:
- return 0
-
pypy_decl = 'pypy_decl.h'
udir.join(pypy_decl).write("/* Will be filled later */\n")
udir.join('pypy_structmember_decl.h').write("/* Will be filled later */\n")
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
@@ -5,7 +5,7 @@
from rpython.rlib.rarithmetic import widen
from pypy.module.cpyext.api import (
cpython_api, CANNOT_FAIL, CONST_STRING, FILEP, fread, feof, Py_ssize_tP,
- cpython_struct, is_valid_fp)
+ cpython_struct)
from pypy.module.cpyext.pyobject import PyObject
from pypy.module.cpyext.pyerrors import PyErr_SetFromErrno
from pypy.module.cpyext.funcobject import PyCodeObject
@@ -155,22 +155,19 @@
BUF_SIZE = 8192
source = ""
filename = rffi.charp2str(filename)
- buf = lltype.malloc(rffi.CCHARP.TO, BUF_SIZE, flavor='raw')
- if not is_valid_fp(fp):
- lltype.free(buf, flavor='raw')
- PyErr_SetFromErrno(space, space.w_IOError)
- return None
- try:
+ with rffi.scoped_alloc_buffer(BUF_SIZE) as buf:
while True:
- count = fread(buf, 1, BUF_SIZE, fp)
+ try:
+ count = fread(buf.raw, 1, BUF_SIZE, fp)
+ except OSError:
+ PyErr_SetFromErrno(space, space.w_IOError)
+ return
count = rffi.cast(lltype.Signed, count)
- source += rffi.charpsize2str(buf, count)
+ source += rffi.charpsize2str(buf.raw, count)
if count < BUF_SIZE:
if feof(fp):
break
PyErr_SetFromErrno(space, space.w_IOError)
- finally:
- lltype.free(buf, flavor='raw')
return run_string(space, source, filename, start, w_globals, w_locals)
# Undocumented function!
diff --git a/pypy/module/cpyext/test/test_eval.py
b/pypy/module/cpyext/test/test_eval.py
--- a/pypy/module/cpyext/test/test_eval.py
+++ b/pypy/module/cpyext/test/test_eval.py
@@ -13,7 +13,7 @@
PyEval_GetBuiltins, PyEval_GetLocals, PyEval_GetGlobals,
_PyEval_SliceIndex)
from pypy.module.cpyext.api import (
- c_fopen, c_fclose, c_fileno, Py_ssize_tP, is_valid_fd)
+ c_fopen, c_fclose, c_fileno, Py_ssize_tP)
from pypy.module.cpyext.pyobject import get_w_obj_and_decref
from pypy.interpreter.gateway import interp2app
from pypy.interpreter.error import OperationError
@@ -150,7 +150,6 @@
os.close(c_fileno(fp))
with raises_w(space, IOError):
PyRun_File(space, fp, filename, Py_file_input, w_globals, w_locals)
- if is_valid_fd(c_fileno(fp)):
c_fclose(fp)
rffi.free_charp(filename)
diff --git a/pypy/module/posix/app_posix.py b/pypy/module/posix/app_posix.py
--- a/pypy/module/posix/app_posix.py
+++ b/pypy/module/posix/app_posix.py
@@ -99,9 +99,7 @@
"""fdopen(fd [, mode='r' [, buffering]]) -> file_object
Return an open file object connected to a file descriptor."""
- from rpython.rlib.rposix import FdValidator
- with FdValidator(fd):
- return _fdopen(fd, mode, buffering)
+ return _fdopen(fd, mode, buffering)
def tmpfile():
"""Create a temporary file.
diff --git a/pypy/module/posix/test/test_posix2.py
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -18,7 +18,7 @@
USEMODULES += ['fcntl']
else:
# On windows, os.popen uses the subprocess module
- USEMODULES += ['_rawffi', 'thread', 'signal']
+ USEMODULES += ['_rawffi', 'thread', 'signal', '_cffi_backend']
def setup_module(mod):
mod.space = gettestobjspace(usemodules=USEMODULES)
@@ -300,8 +300,13 @@
# There used to be code here to ensure that fcntl is not faked
# but we can't do that cleanly any more
- exc = raises(OSError, posix.fdopen, fd)
- assert exc.value.errno == errno.EBADF
+ try:
+ fid = posix.fdopen(fd)
+ fid.read(10)
+ except IOError as e:
+ assert e.errno == errno.EBADF
+ else:
+ assert False, "using result of fdopen(fd) on closed file must
raise"
def test_fdopen_hackedbuiltins(self):
"Same test, with __builtins__.file removed"
@@ -331,8 +336,17 @@
path = self.path
posix = self.posix
fd = posix.open(path, posix.O_RDONLY)
- exc = raises(OSError, posix.fdopen, fd, 'w')
- assert str(exc.value) == "[Errno 22] Invalid argument"
+ # compatability issue - using Visual Studio 10 and above no
+ # longer raises on fid creation, only when _using_ fid
+ # win32 python2 raises IOError on flush(), win32 python3 raises OSError
+ try:
+ fid = posix.fdopen(fd, 'w')
+ fid.write('abc')
+ fid.flush()
+ except (OSError, IOError) as e:
+ assert e.errno in (9, 22)
+ else:
+ assert False, "expected OSError"
posix.close(fd) # fd should not be closed
def test_getcwd(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit