[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