[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