Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r68862:8e2e375941a4 Date: 2014-01-22 19:11 -0800 http://bitbucket.org/pypy/pypy/changeset/8e2e375941a4/
Log: allow bind_object() to cast diff --git a/pypy/module/cppyy/interp_cppyy.py b/pypy/module/cppyy/interp_cppyy.py --- a/pypy/module/cppyy/interp_cppyy.py +++ b/pypy/module/cppyy/interp_cppyy.py @@ -1217,8 +1217,8 @@ address = _addressof(space, w_obj) return space.wrap(address) -@unwrap_spec(owns=bool) -def bind_object(space, w_obj, w_pycppclass, owns=False): +@unwrap_spec(owns=bool, cast=bool) +def bind_object(space, w_obj, w_pycppclass, owns=False, cast=False): """Takes an address and a bound C++ class proxy, returns a bound instance.""" try: # attempt address from array or C++ instance @@ -1233,4 +1233,4 @@ raise OperationError(space.w_TypeError, space.wrap("no such class: %s" % space.str_w(w_pycppclass))) cppclass = space.interp_w(W_CPPClass, w_cppclass, can_be_None=False) - return wrap_cppobject(space, rawobject, cppclass, do_cast=False, python_owns=owns) + return wrap_cppobject(space, rawobject, cppclass, do_cast=cast, python_owns=owns) diff --git a/pypy/module/cppyy/test/advancedcpp.h b/pypy/module/cppyy/test/advancedcpp.h --- a/pypy/module/cppyy/test/advancedcpp.h +++ b/pypy/module/cppyy/test/advancedcpp.h @@ -35,6 +35,8 @@ virtual base_class* cycle(base_class* b) { return b; } virtual base_class* clone() { return new base_class; } + virtual void* mask(void* p) { return p; } + public: int m_b; double m_db; 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 @@ -517,6 +517,20 @@ assert isinstance(b.clone(), base_class) # TODO: clone() leaks assert isinstance(d.clone(), derived_class) # TODO: clone() leaks + # special case when round-tripping through a void* ptr + voidp = b.mask(d) + assert not isinstance(voidp, base_class) + assert not isinstance(voidp, derived_class) + + d1 = cppyy.bind_object(voidp, base_class, cast=True) + assert isinstance(d1, derived_class) + assert d1 is d + + b1 = cppyy.bind_object(voidp, base_class) + assert isinstance(b1, base_class) + assert cppyy.addressof(b1) == cppyy.addressof(d) + assert not (b1 is d) + def test13_actual_type_virtual_multi(self): """Test auto-downcast in adverse inheritance situation""" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit