Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r56241:f42fb7b18dcf Date: 2012-07-19 11:27 -0700 http://bitbucket.org/pypy/pypy/changeset/f42fb7b18dcf/
Log: allow arrays through void** arguments diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py --- a/pypy/module/cppyy/converter.py +++ b/pypy/module/cppyy/converter.py @@ -353,7 +353,7 @@ try: buf = space.buffer_w(w_obj) x[0] = rffi.cast(rffi.VOIDP, buf.get_raw_address()) - except (OperationError, ValueError): + except (OperationError, ValueError), e: x[0] = rffi.cast(rffi.VOIDP, get_rawobject(space, w_obj)) ba[capi.c_function_arg_typeoffset()] = 'o' @@ -365,17 +365,23 @@ uses_local = True def convert_argument(self, space, w_obj, address, call_local): + x = rffi.cast(rffi.VOIDPP, address) + ba = rffi.cast(rffi.CCHARP, address) r = rffi.cast(rffi.VOIDPP, call_local) - r[0] = rffi.cast(rffi.VOIDP, get_rawobject(space, w_obj)) - x = rffi.cast(rffi.VOIDPP, address) + try: + buf = space.buffer_w(w_obj) + r[0] = rffi.cast(rffi.VOIDP, buf.get_raw_address()) + except (OperationError, ValueError), e: + r[0] = rffi.cast(rffi.VOIDP, get_rawobject(space, w_obj)) x[0] = rffi.cast(rffi.VOIDP, call_local) - address = rffi.cast(capi.C_OBJECT, address) - ba = rffi.cast(rffi.CCHARP, address) ba[capi.c_function_arg_typeoffset()] = 'a' def finalize_call(self, space, w_obj, call_local): r = rffi.cast(rffi.VOIDPP, call_local) - set_rawobject(space, w_obj, r[0]) + try: + set_rawobject(space, w_obj, r[0]) + except OperationError: + pass # no set on buffer/array class VoidPtrRefConverter(TypeConverter): _immutable_ = True diff --git a/pypy/module/cppyy/test/test_advancedcpp.py b/pypy/module/cppyy/test/test_advancedcpp.py --- a/pypy/module/cppyy/test/test_advancedcpp.py +++ b/pypy/module/cppyy/test/test_advancedcpp.py @@ -7,7 +7,7 @@ currpath = py.path.local(__file__).dirpath() test_dct = str(currpath.join("advancedcppDict.so")) -space = gettestobjspace(usemodules=['cppyy']) +space = gettestobjspace(usemodules=['cppyy', 'array']) def setup_module(mod): if sys.platform == 'win32': @@ -383,6 +383,10 @@ assert cppyy.addressof(o) == pp.gime_address_ptr_ptr(o) assert cppyy.addressof(o) == pp.gime_address_ptr_ref(o) + import array + addressofo = array.array('l', [cppyy.addressof(o)]) + assert addressofo.buffer_info()[0] == pp.gime_address_ptr_ptr(addressofo) + def test09_opaque_pointer_assing(self): """Test passing around of opaque pointers""" _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit