[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