diff --git a/Examples/test-suite/python/Makefile.in b/Examples/test-suite/python/Makefile.in index f3d89a962..2f66caa89 100644 --- a/Examples/test-suite/python/Makefile.in +++ b/Examples/test-suite/python/Makefile.in @@ -66,6 +66,7 @@ CPP_TEST_CASES += \ python_moduleimport \ python_overload_simple_cast \ python_pickle \ + python_pybuf \ python_pythoncode \ python_richcompare \ python_strict_unicode \ @@ -77,7 +78,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' 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); }