[pypy-commit] pypy reflex-support: o) finalize stl tests

wlav noreply at buildbot.pypy.org
Wed Mar 20 21:55:01 CET 2013


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r62578:071dc7ce6101
Date: 2013-03-20 13:11 -0700
http://bitbucket.org/pypy/pypy/changeset/071dc7ce6101/

Log:	o) finalize stl tests o) allow pointers to unknown classes to
	execute as void*

diff --git a/pypy/module/cppyy/executor.py b/pypy/module/cppyy/executor.py
--- a/pypy/module/cppyy/executor.py
+++ b/pypy/module/cppyy/executor.py
@@ -259,7 +259,7 @@
         pass
 
     #   2) drop '&': by-ref is pretty much the same as by-value, python-wise
-    if compound and compound[len(compound)-1] == "&":
+    if compound and compound[len(compound)-1] == '&':
         # TODO: this does not actually work with Reflex (?)
         try:
             return _executors[clean_name](space, None)
@@ -273,17 +273,18 @@
         # type check for the benefit of the annotator
         from pypy.module.cppyy.interp_cppyy import W_CPPClass
         cppclass = space.interp_w(W_CPPClass, cppclass, can_be_None=False)
-        if compound == "":
+        if compound == '':
             return InstanceExecutor(space, cppclass)
-        elif compound == "*" or compound == "&":
+        elif compound == '*' or compound == '&':
             return InstancePtrExecutor(space, cppclass)
-        elif compound == "**" or compound == "*&":
+        elif compound == '**' or compound == '*&':
             return InstancePtrPtrExecutor(space, cppclass)
     elif capi.c_is_enum(clean_name):
         return _executors['unsigned int'](space, None)
 
     # 4) additional special cases
-    # ... none for now
+    if compound == '*':
+        return _executors['void*'](space, None)  # allow at least passing of the pointer
 
     # currently used until proper lazy instantiation available in interp_cppyy
     return FunctionExecutor(space, None)
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
@@ -318,15 +318,17 @@
     # global == and != for its iterators are reflected, which is a hassle ...
     if not 'vector' in pyclass.__name__[:11] and \
             ('begin' in pyclass.__dict__ and 'end' in pyclass.__dict__):
-        # TODO: check return type of begin() and end() for existence
-        def __iter__(self):
-            iter = self.begin()
-            while iter != self.end():
-                yield iter.__deref__()
-                iter.__preinc__()
-            iter.destruct()
-            raise StopIteration
-        pyclass.__iter__ = __iter__
+        if cppyy._scope_byname(pyclass.__name__+'::iterator') or \
+                cppyy._scope_byname(pyclass.__name__+'::const_iterator'):
+            def __iter__(self):
+                i = self.begin()
+                while i != self.end():
+                    yield i.__deref__()
+                    i.__preinc__()
+                i.destruct()
+                raise StopIteration
+            pyclass.__iter__ = __iter__
+        # else: rely on numbered iteration
 
     # combine __getitem__ and __len__ to make a pythonized __getitem__
     if '__getitem__' in pyclass.__dict__ and '__len__' in pyclass.__dict__:
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
@@ -49,7 +49,7 @@
 
         assert fragile.B == fragile.B
         assert fragile.B().check() == ord('B')
-        raises(TypeError, fragile.B().gime_no_such)
+        raises(AttributeError, getattr, fragile.B().gime_no_such(), "_cpp_proxy")
 
         assert fragile.C == fragile.C
         assert fragile.C().check() == ord('C')
diff --git a/pypy/module/cppyy/test/test_stltypes.py b/pypy/module/cppyy/test/test_stltypes.py
--- a/pypy/module/cppyy/test/test_stltypes.py
+++ b/pypy/module/cppyy/test/test_stltypes.py
@@ -431,8 +431,20 @@
         assert a["some string" ] == 'string'
         assert a[3.1415] == 'double'
 
+    def test06_STL_like_class_iterators(self):
+        """Test the iterator protocol mapping for an STL like class"""
 
-class AppTestSTLMAP:
+        import cppyy
+        stl_like_class = cppyy.gbl.stl_like_class
+
+        a = stl_like_class(int)()
+        for i in a:
+            pass
+
+        assert i == 3
+
+
+class AppTestSTLITERATOR:
     spaceconfig = dict(usemodules=['cppyy', 'itertools'])
 
     def setup_class(cls):


More information about the pypy-commit mailing list