[pypy-svn] r25394 - in pypy/dist/pypy/rpython: . lltypesystem ootypesystem test

nik at codespeak.net nik at codespeak.net
Wed Apr 5 17:05:25 CEST 2006


Author: nik
Date: Wed Apr  5 17:05:23 2006
New Revision: 25394

Modified:
   pypy/dist/pypy/rpython/lltypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/rlist.py
   pypy/dist/pypy/rpython/rlist.py
   pypy/dist/pypy/rpython/test/test_rlist.py
Log:
implement rtyping of list concatenation and extenion for ootypes. this
introduces a slightly convoluted multiple inheritance setup for ListReprs
to allow for maximum code sharing between lltype and ootype.


Modified: pypy/dist/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rlist.py	Wed Apr  5 17:05:23 2006
@@ -4,8 +4,8 @@
 from pypy.rpython.error import TyperError
 from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst
 from pypy.rpython.rmodel import externalvsinternal
-from pypy.rpython.rlist import AbstractListRepr, AbstractListIteratorRepr, \
-        rtype_newlist
+from pypy.rpython.rlist import AbstractBaseListRepr, AbstractListRepr, \
+        AbstractListIteratorRepr, rtype_newlist
 from pypy.rpython.rlist import dum_nocheck, dum_checkidx
 from pypy.rpython.rslice import SliceRepr
 from pypy.rpython.rslice import startstop_slice_repr, startonly_slice_repr
@@ -35,7 +35,7 @@
 #    item_t list_items[]
 #
 
-class BaseListRepr(AbstractListRepr):
+class BaseListRepr(AbstractBaseListRepr):
 
     def __init__(self, rtyper, item_repr, listitem=None):
         self.rtyper = rtyper
@@ -49,6 +49,8 @@
         self.listitem = listitem
         self.list_cache = {}
         # setup() needs to be called to finish this initialization
+        self.ll_concat = ll_concat
+        self.ll_extend = ll_extend
         self.list_builder = ListBuilder()
 
     def _setup_repr_final(self):
@@ -184,7 +186,7 @@
         return 1 # bad but not used alone
 
 
-class ListRepr(BaseListRepr):
+class ListRepr(AbstractListRepr, BaseListRepr):
 
     def _setup_repr(self):
         if 'item_repr' not in self.__dict__:
@@ -403,11 +405,6 @@
 
         return pairtype(Repr, Repr).rtype_is_(pair(r_lst1, r_lst2), hop)
 
-    def rtype_add((r_lst1, r_lst2), hop):
-        v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
-        cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
-        return hop.gendirectcall(ll_concat, cRESLIST, v_lst1, v_lst2)
-
     def rtype_eq((r_lst1, r_lst2), hop):
         assert r_lst1.item_repr == r_lst2.item_repr
         v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
@@ -422,14 +419,6 @@
 def ll_both_none(lst1, lst2):
     return not lst1 and not lst2
 
-class __extend__(pairtype(ListRepr, BaseListRepr)):
-
-    def rtype_inplace_add((r_lst1, r_lst2), hop):
-        v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
-        hop.gendirectcall(ll_extend, v_lst1, v_lst2)
-        return v_lst1
-
-
 # ____________________________________________________________
 #
 #  Low-level methods.  These can be run for testing, but are meant to

Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py	Wed Apr  5 17:05:23 2006
@@ -1,27 +1,28 @@
 from pypy.annotation.pairtype import pairtype
-from pypy.rpython.rlist import AbstractListRepr, AbstractListIteratorRepr, \
-        rtype_newlist
+from pypy.rpython.rlist import AbstractBaseListRepr, AbstractListRepr, \
+        AbstractListIteratorRepr, rtype_newlist
 from pypy.rpython.rmodel import Repr, IntegerRepr
 from pypy.rpython.rmodel import inputconst, externalvsinternal
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.ootypesystem.riterable import iterator_type
 
-class BaseListRepr(AbstractListRepr):
+class BaseListRepr(AbstractBaseListRepr):
 
     def __init__(self, rtyper, item_repr, listitem=None):
         self.rtyper = rtyper
-        # XXX do we need something like this for ootypes?
-        #self.LIST = GcForwardReference()
         if not isinstance(item_repr, Repr):  # not computed yet, done by setup()
             assert callable(item_repr)
             self._item_repr_computer = item_repr
-            self.lowleveltype = ootype.ForwardReference()
+            self.LIST = ootype.ForwardReference()
         else:
-            self.lowleveltype = ootype.List(item_repr.lowleveltype)
+            self.LIST = ootype.List(item_repr.lowleveltype)
             self.external_item_repr, self.item_repr = \
                     externalvsinternal(rtyper, item_repr)
+        self.lowleveltype = self.LIST
         self.listitem = listitem
         self.list_cache = {}
+        self.ll_concat = ll_concat
+        self.ll_extend = ll_extend
         # setup() needs to be called to finish this initialization
 
     def _setup_repr(self):
@@ -48,8 +49,11 @@
     def make_iterator_repr(self):
         return ListIteratorRepr(self)
 
-ListRepr = BaseListRepr
-FixedSizeListRepr = BaseListRepr
+class ListRepr(AbstractListRepr, BaseListRepr):
+
+    pass
+
+FixedSizeListRepr = ListRepr
 
 class __extend__(pairtype(BaseListRepr, IntegerRepr)):
 
@@ -71,7 +75,7 @@
                 resulttype=ootype.Void)
     return v_result
 
-# These helpers are trivial but help encapsulation
+# These helpers are sometimes trivial but help encapsulation
 
 def ll_newlist(LIST):
     return ootype.new(LIST)
@@ -79,6 +83,28 @@
 def ll_append(lst, item):
     lst.append(item)
 
+def ll_extend(l1, l2):
+    # This is a bit inefficient, could also add extend to the list interface
+    len2 = l2.length()
+    i = 0
+    while i < len2:
+        l1.append(l2.getitem(i))
+        i += 1
+
+def ll_concat(RESLIST, l1, l2):
+    len1 = l1.length()
+    len2 = l2.length()
+    l = ootype.new(RESLIST)
+    i = 0
+    while i < len1:
+        l.append(l1.getitem(i))
+        i += 1
+    i = 0
+    while i < len2:
+        l.append(l2.getitem(i))
+        i += 1
+    return l
+
 # ____________________________________________________________
 #
 #  Iteration.

Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py	(original)
+++ pypy/dist/pypy/rpython/rlist.py	Wed Apr  5 17:05:23 2006
@@ -1,3 +1,4 @@
+from pypy.annotation.pairtype import pairtype
 from pypy.annotation import model as annmodel
 from pypy.rpython.rmodel import Repr, IteratorRepr, inputconst
 from pypy.rpython.lltypesystem import lltype
@@ -28,11 +29,15 @@
         return self.__class__, self.listdef.listitem
 
 
-class AbstractListRepr(Repr):
+class AbstractBaseListRepr(Repr):
 
     def recast(self, llops, v):
         return llops.convertvar(v, self.item_repr, self.external_item_repr)
 
+class AbstractListRepr(AbstractBaseListRepr):
+    
+    pass
+
 def rtype_newlist(hop):
     nb_args = hop.nb_args
     r_list = hop.r_result
@@ -53,6 +58,21 @@
 def dum_checkidx(): pass
 def dum_nocheck(): pass
 
+
+class __extend__(pairtype(AbstractBaseListRepr, AbstractBaseListRepr)):
+
+    def rtype_add((r_lst1, r_lst2), hop):
+        v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+        cRESLIST = hop.inputconst(lltype.Void, hop.r_result.LIST)
+        return hop.gendirectcall(hop.r_result.ll_concat, cRESLIST, v_lst1, v_lst2)
+
+class __extend__(pairtype(AbstractListRepr, AbstractBaseListRepr)):
+
+    def rtype_inplace_add((r_lst1, r_lst2), hop):
+        v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+        hop.gendirectcall(r_lst1.ll_extend, v_lst1, v_lst2)
+        return v_lst1
+
 # ____________________________________________________________
 #
 #  Iteration.

Modified: pypy/dist/pypy/rpython/test/test_rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rlist.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rlist.py	Wed Apr  5 17:05:23 2006
@@ -234,25 +234,22 @@
         res = interpret(dummyfn, [5])
         assert res == 5
 
-def tolst(l):
-    return map(None, l.ll_items())[:l.ll_length()]
-
-def test_add():
-    def dummyfn():
-        l = [5]
-        l += [6,7]
-        return l + [8]
-    res = interpret(dummyfn, [])
-    assert tolst(res) == [5, 6, 7, 8]
-
-    def dummyfn():
-        l = [5]
-        l += [6,7]
-        l2 =  l + [8]
-        l2.append(9)
-        return l2
-    res = interpret(dummyfn, [])
-    assert tolst(res) == [5, 6, 7, 8, 9]
+    def test_add(self):
+        def dummyfn():
+            l = [5]
+            l += [6,7]
+            return l + [8]
+        res = interpret(dummyfn, [], type_system=self.ts)
+        assert self.ll_to_list(res) == [5, 6, 7, 8]
+
+        def dummyfn():
+            l = [5]
+            l += [6,7]
+            l2 =  l + [8]
+            l2.append(9)
+            return l2
+        res = interpret(dummyfn, [], type_system=self.ts)
+        assert self.ll_to_list(res) == [5, 6, 7, 8, 9]
 
 def test_slice():
     def dummyfn():
@@ -303,6 +300,9 @@
     res = interpret(dummyfn, [])
     assert res == 0
 
+def tolst(l):
+    return map(None, l.ll_items())[:l.ll_length()]
+
 def test_setslice():
     def dummyfn():
         l = [10, 9, 8, 7]
@@ -1053,7 +1053,12 @@
 
     ts = "lltype"
 
+    def ll_to_list(self, l):
+        return map(None, l.ll_items())[:l.ll_length()]
+
 class TestOotypeRtyping(BaseTestListRtyping):
 
     ts = "ootype"
 
+    def ll_to_list(self, l):
+        return l._list[:]



More information about the Pypy-commit mailing list