[pypy-commit] cffi default: issue35: meh, Python 2.7 decided to drop complete support for 'buffer'
arigo
noreply at buildbot.pypy.org
Sun Oct 28 16:18:39 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r1014:14eff35bfad7
Date: 2012-10-28 16:18 +0100
http://bitbucket.org/cffi/cffi/changeset/14eff35bfad7/
Log: issue35: meh, Python 2.7 decided to drop complete support for
'buffer' object at the same time that 'memoryview' was added. Work
around.
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -4275,7 +4275,7 @@
return NULL;
}
/*WRITE(cd->c_data, size)*/
-#if PY_MAJOR_VERSION < 3
+#if PY_MAJOR_VERSION < 3 && !defined(PyMemoryView_Check) /* Python 2.6 */
return PyBuffer_FromReadWriteMemory(cd->c_data, size);
#else
{
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -9,7 +9,7 @@
type_or_class = "type"
mandatory_b_prefix = ''
mandatory_u_prefix = 'u'
- readbuf = str
+ readbuf = lambda buf: buf[:]
bufchar = lambda x: x
bytechr = chr
class U(object):
@@ -1839,7 +1839,7 @@
c[2] = b'-'
buf[:2] = b'HI'
assert string(c) == b'HI-there'
- if sys.version_info < (3,) or sys.version_info >= (3, 3):
+ if sys.version_info < (2, 7) or sys.version_info >= (3, 3):
assert buf[:4:2] == b'H-'
if '__pypy__' not in sys.builtin_module_names:
# XXX pypy doesn't support the following assignment so far
diff --git a/cffi/backend_ctypes.py b/cffi/backend_ctypes.py
--- a/cffi/backend_ctypes.py
+++ b/cffi/backend_ctypes.py
@@ -980,7 +980,7 @@
return b._to_string(maxlen)
def buffer(self, bptr, size=-1):
- if sys.version_info >= (3,):
+ if sys.version_info >= (2, 7):
# buf = bptr._as_ctype_ptr
# return memoryview(buf.contents)
if isinstance(bptr, CTypesGenericPtr):
diff --git a/testing/backend_tests.py b/testing/backend_tests.py
--- a/testing/backend_tests.py
+++ b/testing/backend_tests.py
@@ -1074,7 +1074,7 @@
b = ffi.buffer(a)
except NotImplementedError as e:
py.test.skip(str(e))
- if sys.version < '3':
+ if sys.version_info < (2, 7):
assert type(b) is buffer
content = str(b)
else:
@@ -1098,7 +1098,7 @@
b = ffi.buffer(a)
except NotImplementedError as e:
py.test.skip(str(e))
- if sys.version < '3':
+ if sys.version_info < (2, 7):
assert type(b) is buffer
content = str(b)
else:
@@ -1120,7 +1120,7 @@
b = ffi.buffer(a, 1)
except NotImplementedError as e:
py.test.skip(str(e))
- if sys.version < '3':
+ if sys.version_info < (2, 7):
assert type(b) is buffer
content = str(b)
else:
@@ -1144,8 +1144,8 @@
ffi.buffer(a1)
except NotImplementedError as e:
py.test.skip(str(e))
- if sys.version < '3':
- assert str(ffi.buffer(a1)) == str(ffi.buffer(a2, 4*10))
+ if sys.version_info < (3,):
+ assert ffi.buffer(a1)[:] == ffi.buffer(a2, 4*10)[:]
else:
assert ffi.buffer(a1).tobytes() == ffi.buffer(a2, 4*10).tobytes()
@@ -1169,6 +1169,24 @@
f.close()
os.unlink(filename)
+ def test_ffi_buffer_with_io(self):
+ ffi = FFI(backend=self.Backend())
+ import io, array
+ f = io.BytesIO()
+ a = ffi.new("int[]", list(range(1005)))
+ try:
+ ffi.buffer(a, 512)
+ except NotImplementedError as e:
+ py.test.skip(str(e))
+ f.write(ffi.buffer(a, 1000 * ffi.sizeof("int")))
+ f.seek(0)
+ assert f.read() == array.array('i', range(1000)).tostring()
+ f.seek(0)
+ b = ffi.new("int[]", 1005)
+ f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int")))
+ assert list(a)[:1000] + [0] * (len(a)-1000) == list(b)
+ f.close()
+
def test_array_in_struct(self):
ffi = FFI(backend=self.Backend())
ffi.cdef("struct foo_s { int len; short data[5]; };")
More information about the pypy-commit
mailing list