[pypy-svn] r25822 - in pypy/dist/pypy: rpython rpython/lltypesystem rpython/ootypesystem translator/cli/src translator/cli/test

antocuni at codespeak.net antocuni at codespeak.net
Fri Apr 14 00:14:52 CEST 2006


Author: antocuni
Date: Fri Apr 14 00:14:12 2006
New Revision: 25822

Modified:
   pypy/dist/pypy/rpython/lltypesystem/rlist.py
   pypy/dist/pypy/rpython/lltypesystem/rslice.py
   pypy/dist/pypy/rpython/ootypesystem/ootype.py
   pypy/dist/pypy/rpython/ootypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/rslice.py
   pypy/dist/pypy/rpython/rlist.py
   pypy/dist/pypy/rpython/rslice.py
   pypy/dist/pypy/translator/cli/src/pypylib.cs
   pypy/dist/pypy/translator/cli/test/compile.py
   pypy/dist/pypy/translator/cli/test/test_list.py
Log:
- Added support for basic slice operations on ootypesystem.rlist
- Added some tests for basic slice operations in the CLI backend


Modified: pypy/dist/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rlist.py	Fri Apr 14 00:14:12 2006
@@ -51,6 +51,10 @@
         # setup() needs to be called to finish this initialization
         self.ll_concat = ll_concat
         self.ll_extend = ll_extend
+        self.ll_listslice_startonly = ll_listslice_startonly
+        self.ll_listslice = ll_listslice
+        self.ll_listslice_minusone = ll_listslice_minusone
+        self.ll_listsetslice = ll_listsetslice
         self.list_builder = ListBuilder()
 
     def _setup_repr_final(self):
@@ -263,7 +267,7 @@
         v_res = hop.gendirectcall(llfn, v_func, *args)
         return self.recast(hop.llops, v_res)
 
-class FixedSizeListRepr(BaseListRepr):
+class FixedSizeListRepr(AbstractListRepr, BaseListRepr):
 
     def _setup_repr(self):
         if 'item_repr' not in self.__dict__:
@@ -351,30 +355,6 @@
         v_lst, v_factor = hop.inputargs(r_lst, Signed)
         return hop.gendirectcall(ll_inplace_mul, v_lst, v_factor)
 
-class __extend__(pairtype(BaseListRepr, SliceRepr)):
-
-    def rtype_getitem((r_lst, r_slic), hop):
-        cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
-        if r_slic == startonly_slice_repr:
-            v_lst, v_start = hop.inputargs(r_lst, startonly_slice_repr)
-            return hop.gendirectcall(ll_listslice_startonly, cRESLIST, v_lst, v_start)
-        if r_slic == startstop_slice_repr:
-            v_lst, v_slice = hop.inputargs(r_lst, startstop_slice_repr)
-            return hop.gendirectcall(ll_listslice, cRESLIST, v_lst, v_slice)
-        if r_slic == minusone_slice_repr:
-            v_lst, v_ignored = hop.inputargs(r_lst, minusone_slice_repr)
-            return hop.gendirectcall(ll_listslice_minusone, cRESLIST, v_lst)
-        raise TyperError('getitem does not support slices with %r' % (r_slic,))
-
-    def rtype_setitem((r_lst, r_slic), hop):
-        #if r_slic == startonly_slice_repr:
-        #    not implemented
-        if r_slic == startstop_slice_repr:
-            v_lst, v_slice, v_lst2 = hop.inputargs(r_lst, startstop_slice_repr,
-                                                   hop.args_r[2])
-            hop.gendirectcall(ll_listsetslice, v_lst, v_slice, v_lst2)
-            return
-        raise TyperError('setitem does not support slices with %r' % (r_slic,))
 
 class __extend__(pairtype(ListRepr, SliceRepr)):
 

Modified: pypy/dist/pypy/rpython/lltypesystem/rslice.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rslice.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rslice.py	Fri Apr 14 00:14:12 2006
@@ -1,4 +1,4 @@
-from pypy.rpython.rmodel import Repr
+from pypy.rpython.rslice import AbstractSliceRepr
 from pypy.rpython.lltypesystem.lltype import \
      GcStruct, Signed, Ptr, Void, malloc
 
@@ -18,7 +18,7 @@
 SLICE = GcStruct("slice", ("start", Signed), ("stop", Signed))
 
 
-class SliceRepr(Repr):
+class SliceRepr(AbstractSliceRepr):
     pass
 
 startstop_slice_repr = SliceRepr()

Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py	Fri Apr 14 00:14:12 2006
@@ -206,6 +206,9 @@
             "append": Meth([self.ITEMTYPE_T], Void),
             "getitem_nonneg": Meth([Signed], self.ITEMTYPE_T),
             "setitem_nonneg": Meth([Signed, self.ITEMTYPE_T], Void),
+##            "getslice_startonly": Meth([Signed], self.SELFTYPE_T),
+##            "getslice_startstop": Meth([Signed, Signed], self.SELFTYPE_T),
+##            "reverse": Meth([], self.SELFTYPE_T),
             "extend": Meth([self.SELFTYPE_T], Void),
         })
 

Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py	Fri Apr 14 00:14:12 2006
@@ -3,7 +3,7 @@
         AbstractListIteratorRepr, rtype_newlist
 from pypy.rpython.rmodel import Repr, IntegerRepr
 from pypy.rpython.rmodel import inputconst, externalvsinternal
-from pypy.rpython.lltypesystem.lltype import Signed
+from pypy.rpython.lltypesystem.lltype import Signed, Void
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.ootypesystem.riterable import iterator_type
 from pypy.rpython.ootypesystem.rslice import SliceRepr, \
@@ -27,6 +27,10 @@
         self.list_cache = {}
         self.ll_concat = ll_concat
         self.ll_extend = ll_extend
+        self.ll_listslice_startonly = ll_listslice_startonly
+        self.ll_listslice = ll_listslice
+        self.ll_listslice_minusone = ll_listslice_minusone
+        self.ll_listsetslice = ll_listsetslice        
         # setup() needs to be called to finish this initialization
 
     def _setup_repr(self):
@@ -36,8 +40,9 @@
         if isinstance(self.lowleveltype, ootype.ForwardReference):
             self.lowleveltype.become(ootype.List(self.item_repr.lowleveltype))
 
-    def send_message(self, hop, message, can_raise=False):
-        v_args = hop.inputargs(self, *hop.args_r[1:])
+    def send_message(self, hop, message, can_raise=False, v_args=None):
+        if v_args is None:
+            v_args = hop.inputargs(self, *hop.args_r[1:])
         c_name = hop.inputconst(ootype.Void, message)
         if can_raise:
             hop.exception_is_here()
@@ -80,34 +85,7 @@
             v_list, v_index, v_item = hop.inputargs(r_list, Signed, r_list.item_repr)
             hop.exception_is_here()
             return hop.gendirectcall(ll_setitem, v_list, v_index, v_item)
-            
 
-class __extend__(pairtype(BaseListRepr, SliceRepr)):
-
-    def rtype_getitem((r_list, r_slic), hop):
-        raise NotImplementedError # TODO
-##        cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
-##        if r_slic == startonly_slice_repr:
-##            v_lst, v_start = hop.inputargs(r_lst, startonly_slice_repr)
-##            return hop.gendirectcall(ll_listslice_startonly, cRESLIST, v_lst, v_start)
-##        if r_slic == startstop_slice_repr:
-##            v_lst, v_slice = hop.inputargs(r_lst, startstop_slice_repr)
-##            return hop.gendirectcall(ll_listslice, cRESLIST, v_lst, v_slice)
-##        if r_slic == minusone_slice_repr:
-##            v_lst, v_ignored = hop.inputargs(r_lst, minusone_slice_repr)
-##            return hop.gendirectcall(ll_listslice_minusone, cRESLIST, v_lst)
-##        raise TyperError('getitem does not support slices with %r' % (r_slic,))
-            
-
-def ll_getitem(lst, index):
-    if index < 0:
-        index += lst.length()
-    return lst.getitem_nonneg(index)
-
-def ll_setitem(lst, index, item):
-    if index < 0:
-        index += lst.length()
-    return lst.setitem_nonneg(index, item)
 
 def newlist(llops, r_list, items_v):
     c_1ist = inputconst(ootype.Void, r_list.lowleveltype)
@@ -124,6 +102,16 @@
 def ll_newlist(LIST):
     return ootype.new(LIST)
 
+def ll_getitem(lst, index):
+    if index < 0:
+        index += lst.length()
+    return lst.getitem_nonneg(index)
+
+def ll_setitem(lst, index, item):
+    if index < 0:
+        index += lst.length()
+    return lst.setitem_nonneg(index, item)
+
 def ll_append(lst, item):
     lst.append(item)
 
@@ -149,6 +137,54 @@
         i += 1
     return l
 
+def ll_listslice_startonly(RESLIST, lst, start):
+    len1 = lst.length()
+    #newlength = len1 - start
+    res = ootype.new(RESLIST) # TODO: pre-allocate newlength elements
+    i = start
+    while i < len1:
+        res.append(lst.getitem_nonneg(i))
+        i += 1
+    return res
+
+def ll_listslice(RESLIST, lst, slice):
+    start = slice.start
+    stop = slice.stop
+    length = lst.length()
+    if stop > length:
+        stop = length
+    #newlength = stop - start
+    res = ootype.new(RESLIST) # TODO: pre-allocate newlength elements
+    i = start
+    while i < stop:
+        res.append(lst.getitem_nonneg(i))
+        i += 1
+    return res
+
+def ll_listslice_minusone(RESLIST, lst):
+    newlength = lst.length() - 1
+    #assert newlength >= 0 # TODO: asserts seems to have problems with ootypesystem
+    res = ootype.new(RESLIST) # TODO: pre-allocate newlength elements
+    i = 0
+    while i < newlength:
+        res.append(lst.getitem_nonneg(i))
+        i += 1
+    return res
+
+def ll_listsetslice(l1, slice, l2):
+    count = l2.length()
+##    assert count == slice.stop - slice.start, (    # TODO: see above
+##        "setslice cannot resize lists in RPython")
+    # XXX but it should be easy enough to support, soon
+    start = slice.start
+    j = start
+    i = 0
+    while i < count:
+        l1.setitem_nonneg(j, l2.getitem_nonneg(i))
+        i += 1
+        j += 1
+
+
 # ____________________________________________________________
 #
 #  Iteration.
@@ -161,6 +197,7 @@
         self.ll_listiter = ll_listiter
         self.ll_listnext = ll_listnext
 
+
 def ll_listiter(ITER, lst):
     iter = ootype.new(ITER)
     iter.iterable = lst

Modified: pypy/dist/pypy/rpython/ootypesystem/rslice.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rslice.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rslice.py	Fri Apr 14 00:14:12 2006
@@ -1,10 +1,10 @@
-from pypy.rpython.rmodel import Repr
+from pypy.rpython.rslice import AbstractSliceRepr
 from pypy.rpython.lltypesystem.lltype import Void, Signed
 from pypy.rpython.ootypesystem import ootype
 
 SLICE = ootype.Instance('Slice', ootype.ROOT, {'start': Signed, 'stop': Signed})
 
-class SliceRepr(Repr):
+class SliceRepr(AbstractSliceRepr):
     pass
 
 startstop_slice_repr = SliceRepr()

Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py	(original)
+++ pypy/dist/pypy/rpython/rlist.py	Fri Apr 14 00:14:12 2006
@@ -1,6 +1,7 @@
 from pypy.annotation.pairtype import pairtype
 from pypy.annotation import model as annmodel
 from pypy.rpython.rmodel import Repr, IteratorRepr, inputconst
+from pypy.rpython.rslice import AbstractSliceRepr
 from pypy.rpython.lltypesystem import lltype
 from pypy.rpython import robject
 
@@ -73,6 +74,35 @@
         hop.gendirectcall(r_lst1.ll_extend, v_lst1, v_lst2)
         return v_lst1
 
+
+class __extend__(pairtype(AbstractListRepr, AbstractSliceRepr)):
+
+    def rtype_getitem((r_lst, r_slic), hop):
+        rs = r_lst.rtyper.type_system.rslice
+        cRESLIST = hop.inputconst(lltype.Void, hop.r_result.LIST)
+        if r_slic == rs.startonly_slice_repr:
+            v_lst, v_start = hop.inputargs(r_lst, rs.startonly_slice_repr)
+            return hop.gendirectcall(r_lst.ll_listslice_startonly, cRESLIST, v_lst, v_start)
+        if r_slic == rs.startstop_slice_repr:
+            v_lst, v_slice = hop.inputargs(r_lst, rs.startstop_slice_repr)
+            return hop.gendirectcall(r_lst.ll_listslice, cRESLIST, v_lst, v_slice)
+        if r_slic == rs.minusone_slice_repr:
+            v_lst, v_ignored = hop.inputargs(r_lst, rs.minusone_slice_repr)
+            return hop.gendirectcall(r_lst.ll_listslice_minusone, cRESLIST, v_lst)
+        raise TyperError('getitem does not support slices with %r' % (r_slic,))
+
+    def rtype_setitem((r_lst, r_slic), hop):
+        #if r_slic == startonly_slice_repr:
+        #    not implemented
+        rs = r_lst.rtyper.type_system.rslice        
+        if r_slic == rs.startstop_slice_repr:
+            v_lst, v_slice, v_lst2 = hop.inputargs(r_lst, rs.startstop_slice_repr,
+                                                   hop.args_r[2])
+            hop.gendirectcall(r_lst.ll_listsetslice, v_lst, v_slice, v_lst2)
+            return
+        raise TyperError('setitem does not support slices with %r' % (r_slic,))
+
+
 # ____________________________________________________________
 #
 #  Iteration.

Modified: pypy/dist/pypy/rpython/rslice.py
==============================================================================
--- pypy/dist/pypy/rpython/rslice.py	(original)
+++ pypy/dist/pypy/rpython/rslice.py	Fri Apr 14 00:14:12 2006
@@ -1,8 +1,13 @@
+from pypy.rpython.rmodel import Repr
 from pypy.rpython.lltypesystem.lltype import Signed, Void
 from pypy.objspace.flow.model import Constant
 from pypy.annotation import model as annmodel
 from pypy.rpython.error import TyperError
 
+class AbstractSliceRepr(Repr):
+    pass
+
+
 def select_slice_repr(self):
     # Select which one of the three prebuilt reprs to use.
     # Return a name.

Modified: pypy/dist/pypy/translator/cli/src/pypylib.cs
==============================================================================
--- pypy/dist/pypy/translator/cli/src/pypylib.cs	(original)
+++ pypy/dist/pypy/translator/cli/src/pypylib.cs	Fri Apr 14 00:14:12 2006
@@ -10,6 +10,8 @@
         }
     }
 
+    //The public interface List must implement is defined in
+    // rpython.ootypesystem.ootype.List.GENERIC_METHODS
     public class List<T>: System.Collections.Generic.List<T>
     {
         public int length()
@@ -17,6 +19,11 @@
             return this.Count;
         }
 
+        public void append(T item)
+        {
+            this.Add(item);
+        }
+
         public T getitem_nonneg(int index)
         {
             return this[index];
@@ -27,11 +34,6 @@
             this[index] = value_;
         }
 
-        public void append(T item)
-        {
-            this.Add(item);
-        }
-
         public void extend(List<T> other)
         {
             this.AddRange(other);

Modified: pypy/dist/pypy/translator/cli/test/compile.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/compile.py	(original)
+++ pypy/dist/pypy/translator/cli/test/compile.py	Fri Apr 14 00:14:12 2006
@@ -24,10 +24,17 @@
         print 'OK'
 
 
+def sum_(lst):
+    total = 0
+    i = 0
+    while i < len(lst):
+        total += lst[i]
+        i += 1
+    return total    
+
 def bar(x, y):
     lst = [1,2,3,x,y]
-    lst[-1] = 42
-    return lst[-1]
+    return sum_(lst[:-1])
 
 f = compile_function(bar, [int, int])
 

Modified: pypy/dist/pypy/translator/cli/test/test_list.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_list.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_list.py	Fri Apr 14 00:14:12 2006
@@ -46,3 +46,18 @@
     lst += [y, y*2]
     lst.extend([x, y])
     return sum_(lst)
+
+def list_negative_index(x, y):
+    lst = create(x, y)
+    lst[-1] = 4321
+    lst[-2] = lst[-1]
+    return sum_(lst)
+
+def list_getslice(x, y):
+    lst = create(x, y)
+    return sum_(lst[1:3]) * sum_(lst[3:]) * sum_(lst[:-1])
+
+def list_setslice(x, y):
+    lst = create(x, y)
+    lst[1:3] = [1234, 5678]
+    return sum_(lst)



More information about the Pypy-commit mailing list