Merge branch 'gmazzamuto-pybuf_test'

* gmazzamuto-pybuf_test:
  pybuffer: don't use the old deprecated buffer protocol for Python 3
  Enable test case for python_pybuf
This commit is contained in:
William S Fulton 2018-08-12 14:19:40 +01:00
commit 33f3dbb005
3 changed files with 53 additions and 19 deletions

View file

@ -66,6 +66,7 @@ CPP_TEST_CASES += \
python_moduleimport \ python_moduleimport \
python_overload_simple_cast \ python_overload_simple_cast \
python_pickle \ python_pickle \
python_pybuf \
python_pythoncode \ python_pythoncode \
python_richcompare \ python_richcompare \
python_strict_unicode \ python_strict_unicode \
@ -77,7 +78,6 @@ CPP_TEST_CASES += \
# li_std_carray # li_std_carray
# director_profile # director_profile
# python_pybuf
CPP11_TEST_CASES = \ CPP11_TEST_CASES = \
cpp11_hash_tables \ cpp11_hash_tables \

View file

@ -1,8 +1,10 @@
# run: # run:
# python python_pybuf_runme3.py benchmark # python python_pybuf_runme.py benchmark
# for the benchmark, other wise the test case will be run # for the benchmark, other wise the test case will be run
import python_pybuf import python_pybuf
import sys import sys
if len(sys.argv) >= 2 and sys.argv[1] == "benchmark": if len(sys.argv) >= 2 and sys.argv[1] == "benchmark":
# run the benchmark # run the benchmark
import time import time
@ -11,31 +13,31 @@ if len(sys.argv) >= 2 and sys.argv[1] == "benchmark":
t = time.time() t = time.time()
a = bytearray(b'hello world') a = bytearray(b'hello world')
for i in range(k): for i in range(k):
pybuf.title1(a) python_pybuf.title1(a)
print("Time used by bytearray:", time.time() - t) print "Time used by bytearray:", time.time() - t
t = time.time() t = time.time()
b = 'hello world' b = 'hello world'
for i in range(k): for i in range(k):
pybuf.title2(b) python_pybuf.title2(b)
print("Time used by string:", time.time() - t) print "Time used by string:", time.time() - t
else: else:
# run the test case # run the test case
buf1 = bytearray(10) buf1 = bytearray(10)
buf2 = bytearray(50) buf2 = bytearray(50)
pybuf.func1(buf1) python_pybuf.func1(buf1)
assert buf1 == b'a' * 10 assert buf1 == b'a' * 10
pybuf.func2(buf2) python_pybuf.func2(buf2)
assert buf2.startswith(b"Hello world!\x00") 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!' assert count == 10 # number of alpha and number in 'Hello world!'
length = pybuf.func4(buf2) length = python_pybuf.func4(buf2)
assert length == 12 assert length == 12
buf3 = bytearray(b"hello") buf3 = bytearray(b"hello")
pybuf.title1(buf3) python_pybuf.title1(buf3)
assert buf3 == b'Hello' assert buf3 == b'Hello'

View file

@ -13,9 +13,17 @@
*/ */
%define %pybuffer_mutable_binary(TYPEMAP, SIZE) %define %pybuffer_mutable_binary(TYPEMAP, SIZE)
%typemap(in) (TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) {
(int res, Py_ssize_t size = 0, void *buf = 0) { int res; Py_ssize_t size = 0; void *buf = 0;
%#if PY_VERSION_HEX < 0x03000000
res = PyObject_AsWriteBuffer($input, &buf, &size); 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) { if (res<0) {
PyErr_Clear(); PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
@ -39,9 +47,17 @@
*/ */
%define %pybuffer_mutable_string(TYPEMAP) %define %pybuffer_mutable_string(TYPEMAP)
%typemap(in) (TYPEMAP) %typemap(in) (TYPEMAP) {
(int res, Py_ssize_t size = 0, void *buf = 0) { int res; Py_ssize_t size = 0; void *buf = 0;
%#if PY_VERSION_HEX < 0x03000000
res = PyObject_AsWriteBuffer($input, &buf, &size); 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) { if (res<0) {
PyErr_Clear(); PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
@ -65,9 +81,17 @@
*/ */
%define %pybuffer_binary(TYPEMAP, SIZE) %define %pybuffer_binary(TYPEMAP, SIZE)
%typemap(in) (TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) {
(int res, Py_ssize_t size = 0, const void *buf = 0) { int res; Py_ssize_t size = 0; const void *buf = 0;
%#if PY_VERSION_HEX < 0x03000000
res = PyObject_AsReadBuffer($input, &buf, &size); 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) { if (res<0) {
PyErr_Clear(); PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
@ -93,9 +117,17 @@
*/ */
%define %pybuffer_string(TYPEMAP) %define %pybuffer_string(TYPEMAP)
%typemap(in) (TYPEMAP) %typemap(in) (TYPEMAP) {
(int res, Py_ssize_t size = 0, const void *buf = 0) { int res; Py_ssize_t size = 0; const void *buf = 0;
%#if PY_VERSION_HEX < 0x03000000
res = PyObject_AsReadBuffer($input, &buf, &size); 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) { if (res<0) {
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
} }