From 5a8c4fde4cbb9a962e6c8eb1aff180ffcdda99a3 Mon Sep 17 00:00:00 2001 From: Giacomo Mazzamuto Date: Wed, 4 Jul 2018 10:48:06 +0200 Subject: [PATCH 1/2] Enable test case for python_pybuf --- Examples/test-suite/python/Makefile.in | 2 +- ..._pybuf_runme3.py => python_pybuf_runme.py} | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) rename Examples/test-suite/python/{python_pybuf_runme3.py => python_pybuf_runme.py} (65%) diff --git a/Examples/test-suite/python/Makefile.in b/Examples/test-suite/python/Makefile.in index e2aad7c8b..fee14afb0 100644 --- a/Examples/test-suite/python/Makefile.in +++ b/Examples/test-suite/python/Makefile.in @@ -67,6 +67,7 @@ CPP_TEST_CASES += \ python_nondynamic \ python_overload_simple_cast \ python_pickle \ + python_pybuf \ python_pythoncode \ python_richcompare \ python_strict_unicode \ @@ -78,7 +79,6 @@ CPP_TEST_CASES += \ # li_std_carray # director_profile -# python_pybuf CPP11_TEST_CASES = \ cpp11_hash_tables \ diff --git a/Examples/test-suite/python/python_pybuf_runme3.py b/Examples/test-suite/python/python_pybuf_runme.py similarity index 65% rename from Examples/test-suite/python/python_pybuf_runme3.py rename to Examples/test-suite/python/python_pybuf_runme.py index f5ab0ec66..58efe78bd 100644 --- a/Examples/test-suite/python/python_pybuf_runme3.py +++ b/Examples/test-suite/python/python_pybuf_runme.py @@ -1,8 +1,10 @@ # run: -# python python_pybuf_runme3.py benchmark +# python python_pybuf_runme.py benchmark # for the benchmark, other wise the test case will be run import python_pybuf import sys + + if len(sys.argv) >= 2 and sys.argv[1] == "benchmark": # run the benchmark import time @@ -11,31 +13,31 @@ if len(sys.argv) >= 2 and sys.argv[1] == "benchmark": t = time.time() a = bytearray(b'hello world') for i in range(k): - pybuf.title1(a) - print("Time used by bytearray:", time.time() - t) + python_pybuf.title1(a) + print "Time used by bytearray:", time.time() - t t = time.time() b = 'hello world' for i in range(k): - pybuf.title2(b) - print("Time used by string:", time.time() - t) + python_pybuf.title2(b) + print "Time used by string:", time.time() - t else: # run the test case buf1 = bytearray(10) buf2 = bytearray(50) - pybuf.func1(buf1) + python_pybuf.func1(buf1) assert buf1 == b'a' * 10 - pybuf.func2(buf2) + python_pybuf.func2(buf2) assert buf2.startswith(b"Hello world!\x00") - count = pybuf.func3(buf2) + count = python_pybuf.func3(buf2) assert count == 10 # number of alpha and number in 'Hello world!' - length = pybuf.func4(buf2) + length = python_pybuf.func4(buf2) assert length == 12 buf3 = bytearray(b"hello") - pybuf.title1(buf3) + python_pybuf.title1(buf3) assert buf3 == b'Hello' From 3594e54f7edb364369971b12a395ad2eff617515 Mon Sep 17 00:00:00 2001 From: Giacomo Mazzamuto Date: Wed, 4 Jul 2018 18:03:09 +0200 Subject: [PATCH 2/2] pybuffer: don't use the old deprecated buffer protocol for Python 3 --- Lib/python/pybuffer.i | 48 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/Lib/python/pybuffer.i b/Lib/python/pybuffer.i index 121cd709f..f4e08716e 100644 --- a/Lib/python/pybuffer.i +++ b/Lib/python/pybuffer.i @@ -13,9 +13,17 @@ */ %define %pybuffer_mutable_binary(TYPEMAP, SIZE) -%typemap(in) (TYPEMAP, SIZE) - (int res, Py_ssize_t size = 0, void *buf = 0) { +%typemap(in) (TYPEMAP, SIZE) { + int res; Py_ssize_t size = 0; void *buf = 0; +%#if PY_VERSION_HEX < 0x03000000 res = PyObject_AsWriteBuffer($input, &buf, &size); +%#else + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif if (res<0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); @@ -39,9 +47,17 @@ */ %define %pybuffer_mutable_string(TYPEMAP) -%typemap(in) (TYPEMAP) - (int res, Py_ssize_t size = 0, void *buf = 0) { +%typemap(in) (TYPEMAP) { + int res; Py_ssize_t size = 0; void *buf = 0; +%#if PY_VERSION_HEX < 0x03000000 res = PyObject_AsWriteBuffer($input, &buf, &size); +%#else + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif if (res<0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); @@ -65,9 +81,17 @@ */ %define %pybuffer_binary(TYPEMAP, SIZE) -%typemap(in) (TYPEMAP, SIZE) - (int res, Py_ssize_t size = 0, const void *buf = 0) { +%typemap(in) (TYPEMAP, SIZE) { + int res; Py_ssize_t size = 0; const void *buf = 0; +%#if PY_VERSION_HEX < 0x03000000 res = PyObject_AsReadBuffer($input, &buf, &size); +%#else + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif if (res<0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); @@ -93,9 +117,17 @@ */ %define %pybuffer_string(TYPEMAP) -%typemap(in) (TYPEMAP) - (int res, Py_ssize_t size = 0, const void *buf = 0) { +%typemap(in) (TYPEMAP) { + int res; Py_ssize_t size = 0; const void *buf = 0; +%#if PY_VERSION_HEX < 0x03000000 res = PyObject_AsReadBuffer($input, &buf, &size); +%#else + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif if (res<0) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); }