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

antocuni at codespeak.net antocuni at codespeak.net
Thu Apr 13 11:39:04 CEST 2006


Author: antocuni
Date: Thu Apr 13 11:38:58 2006
New Revision: 25774

Modified:
   pypy/dist/pypy/rpython/ootypesystem/ootype.py
   pypy/dist/pypy/rpython/ootypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py
Log:
Added support for negative indexes in list.


Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py	Thu Apr 13 11:38:58 2006
@@ -204,8 +204,8 @@
             # "name": Meth([ARGUMENT1_TYPE, ARGUMENT2_TYPE, ...], RESULT_TYPE)
             "length": Meth([], Signed),
             "append": Meth([self.ITEMTYPE_T], Void),
-            "getitem": Meth([Signed], self.ITEMTYPE_T),
-            "setitem": Meth([Signed, self.ITEMTYPE_T], Void),
+            "getitem_nonneg": Meth([Signed], self.ITEMTYPE_T),
+            "setitem_nonneg": Meth([Signed, self.ITEMTYPE_T], Void),
             "extend": Meth([self.SELFTYPE_T], Void),
         })
 
@@ -539,15 +539,17 @@
         assert typeOf(item) == self._TYPE._ITEMTYPE
         self._list.append(item)
 
-    def getitem(self, index):
+    def getitem_nonneg(self, index):
         # NOT_RPYTHON
         assert typeOf(index) == Signed
+        assert index >= 0
         return self._list[index]
 
-    def setitem(self, index, item):
+    def setitem_nonneg(self, index, item):
         # NOT_RPYTHON
         assert typeOf(item) == self._TYPE._ITEMTYPE
         assert typeOf(index) == Signed
+        assert index >= 0
         self._list[index] = item
 
     def extend(self, other):

Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py	Thu Apr 13 11:38:58 2006
@@ -5,6 +5,7 @@
 from pypy.rpython.rmodel import inputconst, externalvsinternal
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.ootypesystem.riterable import iterator_type
+from pypy.rpython.lltypesystem.lltype import Signed
 
 class BaseListRepr(AbstractBaseListRepr):
 
@@ -33,7 +34,6 @@
             self.lowleveltype.become(ootype.List(self.item_repr.lowleveltype))
 
     def send_message(self, hop, message, can_raise=False):
-        print message
         v_args = hop.inputargs(self, *hop.args_r[1:])
         c_name = hop.inputconst(ootype.Void, message)
         if can_raise:
@@ -62,13 +62,33 @@
 class __extend__(pairtype(BaseListRepr, IntegerRepr)):
 
     def rtype_getitem((r_list, r_int), hop):
-        # XXX must handle negative indices
-        return r_list.send_message(hop, "getitem", can_raise=True)
+        if hop.args_s[1].nonneg:
+            return r_list.send_message(hop, "getitem_nonneg", can_raise=True)
+        else:
+            v_list, v_index = hop.inputargs(r_list, Signed)            
+            hop.exception_is_here()
+            v_res = hop.gendirectcall(ll_getitem, v_list, v_index)
+            return r_list.recast(hop.llops, v_res)
 
     def rtype_setitem((r_list, r_int), hop):
-        # XXX must handle negative indices
-        return r_list.send_message(hop, "setitem", can_raise=True)
-
+        if hop.args_s[1].nonneg:
+            return r_list.send_message(hop, "setitem_nonneg", can_raise=True)
+        else:
+            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)
+            
+            
+
+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)
@@ -93,7 +113,7 @@
     len2 = l2.length()
     i = 0
     while i < len2:
-        l1.append(l2.getitem(i))
+        l1.append(l2.getitem_nonneg(i))
         i += 1
 
 def ll_concat(RESLIST, l1, l2):
@@ -102,11 +122,11 @@
     l = ootype.new(RESLIST)
     i = 0
     while i < len1:
-        l.append(l1.getitem(i))
+        l.append(l1.getitem_nonneg(i))
         i += 1
     i = 0
     while i < len2:
-        l.append(l2.getitem(i))
+        l.append(l2.getitem_nonneg(i))
         i += 1
     return l
 
@@ -134,5 +154,5 @@
     if index >= l.length():
         raise StopIteration
     iter.index = index + 1
-    return l.getitem(index)
+    return l.getitem_nonneg(index)
 

Modified: pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py	Thu Apr 13 11:38:58 2006
@@ -31,15 +31,15 @@
     LT = List(Signed)
     l = new(LT)
     l.append(2)
-    assert l.getitem(0) == 2
-    l.setitem(0, 3)
-    assert l.getitem(0) == 3
+    assert l.getitem_nonneg(0) == 2
+    l.setitem_nonneg(0, 3)
+    assert l.getitem_nonneg(0) == 3
 
 def test_setitem_indexerror():
     LT = List(Signed)
     l = new(LT)
-    py.test.raises(IndexError, l.getitem, 0)
-    py.test.raises(IndexError, l.setitem, 0, 1)
+    py.test.raises(IndexError, l.getitem_nonneg, 0)
+    py.test.raises(IndexError, l.setitem_nonneg, 0, 1)
 
 def test_null():
     LT = List(Signed)



More information about the Pypy-commit mailing list