Author: Wim Lavrijsen <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit