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

Reply via email to