Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r45814:d3333099ce6f Date: 2011-07-21 05:15 -0700 http://bitbucket.org/pypy/pypy/changeset/d3333099ce6f/
Log: improved error reporting for unknown typed data members 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 @@ -43,22 +43,22 @@ fieldptr = rffi.cast(rffi.CCHARP, offset) return fieldptr - def _is_abstract(self): - raise NotImplementedError( - "abstract base class" ) # more detailed part is not rpython: (actual: %s)" % type(self).__name__) + def _is_abstract(self, space): + raise OperationError(space.w_NotImplementedError, + space.wrap("no converter available")) # more detailed part is not rpython: (actual: %s)" % type(self).__name__)) def convert_argument(self, space, w_obj, address): - self._is_abstract() + self._is_abstract(space) def convert_argument_libffi(self, space, w_obj, argchain): from pypy.module.cppyy.interp_cppyy import FastCallNotPossible raise FastCallNotPossible def from_memory(self, space, w_obj, w_type, offset): - self._is_abstract() + self._is_abstract(space) def to_memory(self, space, w_obj, w_value, offset): - self._is_abstract() + self._is_abstract(space) def free_argument(self, arg): pass diff --git a/pypy/module/cppyy/pythonify.py b/pypy/module/cppyy/pythonify.py --- a/pypy/module/cppyy/pythonify.py +++ b/pypy/module/cppyy/pythonify.py @@ -74,7 +74,13 @@ if not rettype: # return builtin type cppclass = None else: # return instance + try: cppclass = get_cppclass(rettype) + except AttributeError, e: + import warnings + warnings.warn("class %s unknown: no data member access" % rettype, + RuntimeWarning) + cppclass = None if cppdm.is_static(): def binder(obj): return cppdm.get(None, cppclass) diff --git a/pypy/module/cppyy/test/fragile.h b/pypy/module/cppyy/test/fragile.h --- a/pypy/module/cppyy/test/fragile.h +++ b/pypy/module/cppyy/test/fragile.h @@ -28,4 +28,15 @@ void overload(int, no_such_class* p = 0) {} }; +class E { +public: + E() : m_pp_no_such(0), m_pp_a(0) {} + + virtual int check() { return (int)'E'; } + void overload(no_such_class**) {} + + no_such_class** m_pp_no_such; + A** m_pp_a; +}; + } // namespace fragile diff --git a/pypy/module/cppyy/test/fragile.xml b/pypy/module/cppyy/test/fragile.xml --- a/pypy/module/cppyy/test/fragile.xml +++ b/pypy/module/cppyy/test/fragile.xml @@ -2,9 +2,6 @@ <namespace name="fragile" /> - <class name="fragile::A" /> - <class name="fragile::B" /> - <class name="fragile::C" /> - <class name="fragile::D" /> + <class pattern="fragile::[A-Z]" /> </lcgdict> diff --git a/pypy/module/cppyy/test/test_fragile.py b/pypy/module/cppyy/test/test_fragile.py --- a/pypy/module/cppyy/test/test_fragile.py +++ b/pypy/module/cppyy/test/test_fragile.py @@ -14,7 +14,7 @@ if err: raise OSError("'make' failed (see stderr)") -class AppTestSTL: +class AppTestFRAGILE: def setup_class(cls): cls.space = space env = os.environ @@ -65,3 +65,24 @@ d = fragile.D() raises(TypeError, d.overload, None) + raises(TypeError, d.overload, None, None, None) + + # TODO: the following fails in the fast path, b/c the default + # arguments are not properly filled + #d.overload('a') + #d.overload(1) + + def test04_unsupported_arguments(self): + """Test arguments that are yet unsupported""" + + import cppyy + + assert cppyy.gbl.fragile == cppyy.gbl.fragile + fragile = cppyy.gbl.fragile + + assert fragile.E == fragile.E + assert fragile.E().check() == ord('E') + + e = fragile.E() + raises(TypeError, e.overload, None) + raises(NotImplementedError, getattr, e, 'm_pp_no_such') _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit