[pypy-svn] r68235 - in pypy/branch/gc-compress/pypy/rpython/lltypesystem: . test

arigo at codespeak.net arigo at codespeak.net
Wed Oct 7 16:28:30 CEST 2009


Author: arigo
Date: Wed Oct  7 16:28:30 2009
New Revision: 68235

Modified:
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/llgroup.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/lloperation.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/opimpl.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llgroup.py
Log:
An ad-hoc extension.


Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/llgroup.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/llgroup.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/llgroup.py	Wed Oct  7 16:28:30 2009
@@ -26,6 +26,7 @@
         assert TYPE.TO._gckind == 'raw'
         struct = structptr._as_obj()
         assert struct not in _membership,"cannot be a member of several groups"
+        assert struct._parentstructure() is None
         self.members.append(struct)
         _membership[struct] = self
 
@@ -48,10 +49,20 @@
 
     def __init__(self, grp, member):
         assert lltype.typeOf(grp) == Group
-        assert member._as_obj() in grp.members
         self.grpptr = grp._as_ptr()
         self.member = member._as_ptr()
+        self.index = grp.members.index(member._as_obj())
 
     def _get_group_member(self, grpptr):
         assert grpptr == self.grpptr, "get_group_member: wrong group!"
         return self.member
+
+    def _get_next_group_member(self, grpptr, skipoffset):
+        # ad-hoc: returns a pointer to the group member that follows this one,
+        # given information in 'skipoffset' about how much to skip -- which
+        # is the size of the current member.
+        assert grpptr == self.grpptr, "get_next_group_member: wrong group!"
+        assert isinstance(skipoffset, llmemory.ItemOffset)
+        assert skipoffset.TYPE == lltype.typeOf(self.member).TO
+        assert skipoffset.repeat == 1
+        return self.grpptr._as_obj().members[self.index + 1]._as_ptr()

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/lloperation.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/lloperation.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/lloperation.py	Wed Oct  7 16:28:30 2009
@@ -411,6 +411,7 @@
     'cast_adr_to_int':      LLOp(sideeffects=False),
     'cast_int_to_adr':      LLOp(canfold=True),   # not implemented in llinterp
     'get_group_member':     LLOp(canfold=True),
+    'get_next_group_member':LLOp(canfold=True),
 
     # __________ used by the JIT ________
 

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/opimpl.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/opimpl.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/opimpl.py	Wed Oct  7 16:28:30 2009
@@ -395,6 +395,13 @@
     return lltype.cast_pointer(TYPE, member)
 op_get_group_member.need_result_type = True
 
+def op_get_next_group_member(TYPE, grpptr, memberoffset, skipoffset):
+    from pypy.rpython.lltypesystem import llgroup
+    assert isinstance(memberoffset, llgroup.GroupMemberOffset)
+    member = memberoffset._get_next_group_member(grpptr, skipoffset)
+    return lltype.cast_pointer(TYPE, member)
+op_get_next_group_member.need_result_type = True
+
 # ____________________________________________________________
 
 def get_op_impl(opname):

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llgroup.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llgroup.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llgroup.py	Wed Oct  7 16:28:30 2009
@@ -55,6 +55,24 @@
         pnew = lltype.malloc(self.S2, immortal=True)
         assert member_of_group(pnew) is None
 
+    def test_next_group_member(self):
+        self.build()
+        grpptr = self.grpptr
+        S1 = self.S1
+        S2 = self.S2
+        Ptr = lltype.Ptr
+        p = llop.get_next_group_member(Ptr(S2), grpptr,
+                                       self.g1a, llmemory.sizeof(S1))
+        assert p == self.p2a
+        #
+        p = llop.get_next_group_member(Ptr(S2), grpptr,
+                                       self.g2a, llmemory.sizeof(S2))
+        assert p == self.p2b
+        #
+        p = llop.get_next_group_member(Ptr(S1), grpptr,
+                                       self.g2b, llmemory.sizeof(S2))
+        assert p == self.p1b
+
     def test_rpython(self):
         self.build()
         grpptr = self.grpptr



More information about the Pypy-commit mailing list