Author: Armin Rigo <ar...@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]; };") _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit