[pypy-svn] r25829 - in pypy/dist/pypy: rpython rpython/lltypesystem rpython/ootypesystem rpython/test translator/cli/src translator/cli/test
antocuni at codespeak.net
antocuni at codespeak.net
Fri Apr 14 16:45:32 CEST 2006
Author: antocuni
Date: Fri Apr 14 16:45:17 2006
New Revision: 25829
Modified:
pypy/dist/pypy/rpython/lltypesystem/rlist.py
pypy/dist/pypy/rpython/ootypesystem/ootype.py
pypy/dist/pypy/rpython/ootypesystem/rlist.py
pypy/dist/pypy/rpython/rlist.py
pypy/dist/pypy/rpython/test/test_rlist.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 the following operations in ootypesystem/rlist.py: bltn_list, is_true, method_index.
Added some tests both in rpython/test/test_rlist.py and translator/cli/test/test_list.py.
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 16:45:17 2006
@@ -57,6 +57,7 @@
self.ll_listsetslice = ll_listsetslice
self.ll_listdelslice_startonly = ll_listdelslice_startonly
self.ll_listdelslice = ll_listdelslice
+ self.ll_listindex = ll_listindex
self.list_builder = ListBuilder()
def _setup_repr_final(self):
@@ -103,12 +104,6 @@
def rtype_is_true(self, hop):
v_lst, = hop.inputargs(self)
return hop.gendirectcall(ll_list_is_true, v_lst)
-
- def rtype_method_index(self, hop):
- v_lst, v_value = hop.inputargs(self, self.item_repr)
- hop.has_implicit_exception(ValueError) # record that we know about it
- hop.exception_is_here()
- return hop.gendirectcall(ll_listindex, v_lst, v_value, self.get_eqfunc())
def rtype_method_reverse(self, hop):
v_lst, = hop.inputargs(self)
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 16:45:17 2006
@@ -559,6 +559,7 @@
self._list.extend(other._list)
def remove_range(self, start, count):
+ # NOT_RPYTHON
del self._list[start:start+count]
class _null_list(_null_mixin(_list), _list):
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 16:45:17 2006
@@ -33,6 +33,7 @@
self.ll_listsetslice = ll_listsetslice
self.ll_listdelslice_startonly = ll_listdelslice_startonly
self.ll_listdelslice = ll_listdelslice
+ self.ll_listindex = ll_listindex
# setup() needs to be called to finish this initialization
def _setup_repr(self):
@@ -51,9 +52,22 @@
return hop.genop("oosend", [c_name] + v_args,
resulttype=hop.r_result.lowleveltype)
+ def get_eqfunc(self):
+ return inputconst(Void, self.item_repr.get_ll_eq_function())
+
def rtype_len(self, hop):
return self.send_message(hop, "length")
+ def rtype_is_true(self, hop):
+ v_lst, = hop.inputargs(self)
+ return hop.gendirectcall(ll_list_is_true, v_lst)
+
+ def rtype_bltn_list(self, hop):
+ v_lst = hop.inputarg(self, 0)
+ c_start = hop.inputconst(Signed, 0)
+ cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
+ return hop.gendirectcall(self.ll_listslice_startonly, cRESLIST, v_lst, c_start)
+
def rtype_method_append(self, hop):
return self.send_message(hop, "append")
@@ -94,9 +108,9 @@
def rtype_delitem((r_list, r_int), hop):
v_list, v_index = hop.inputargs(r_list, Signed)
if hop.args_s[1].nonneg:
- v_count = hop.inputconst(Signed, 1)
+ c_count = hop.inputconst(Signed, 1)
return r_list.send_message(hop, "remove_range",can_raise=True,
- v_args=[v_list, v_index, v_count])
+ v_args=[v_list, v_index, c_count])
else:
hop.exception_is_here()
return hop.gendirectcall(ll_delitem, v_list, v_index)
@@ -132,6 +146,9 @@
index += lst.length()
return lst.remove_range(index, 1)
+def ll_list_is_true(lst):
+ return bool(lst) and lst.length() != 0
+
def ll_append(lst, item):
lst.append(item)
@@ -219,6 +236,21 @@
if count > 0:
lst.remove_range(start, count)
+def ll_listindex(lst, obj, eqfn):
+ lng = lst.length()
+ j = 0
+ while j < lng:
+ if eqfn is None:
+ if lst.getitem_nonneg(j) == obj:
+ return j
+ else:
+ if eqfn(lst.getitem_nonneg(j), obj):
+ return j
+ j += 1
+ raise ValueError # can't say 'list.index(x): x not in list'
+
+
+
# ____________________________________________________________
#
# Iteration.
Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py (original)
+++ pypy/dist/pypy/rpython/rlist.py Fri Apr 14 16:45:17 2006
@@ -35,6 +35,13 @@
def recast(self, llops, v):
return llops.convertvar(v, self.item_repr, self.external_item_repr)
+ def rtype_method_index(self, hop):
+ v_lst, v_value = hop.inputargs(self, self.item_repr)
+ hop.has_implicit_exception(ValueError) # record that we know about it
+ hop.exception_is_here()
+ return hop.gendirectcall(self.ll_listindex, v_lst, v_value, self.get_eqfunc())
+
+
class AbstractListRepr(AbstractBaseListRepr):
pass
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 Fri Apr 14 16:45:17 2006
@@ -326,6 +326,41 @@
assert res.item2 == 8
assert res.item3 == 7
+ def test_bltn_list(self):
+ def dummyfn():
+ l1 = [42]
+ l2 = list(l1)
+ l2[0] = 0
+ return l1[0]
+ res = interpret(dummyfn, (), type_system=self.ts)
+ assert res == 42
+
+ def test_is_true(self):
+ def is_true(lst):
+ if lst:
+ return True
+ else:
+ return False
+ def dummyfn1():
+ return is_true(None)
+ def dummyfn2():
+ return is_true([])
+ def dummyfn3():
+ return is_true([0])
+ assert interpret(dummyfn1, (), type_system=self.ts) == False
+ assert interpret(dummyfn2, (), type_system=self.ts) == False
+ assert interpret(dummyfn3, (), type_system=self.ts) == True
+
+ def test_list_index_simple(self):
+ def dummyfn(i):
+ l = [5,6,7,8]
+ return l.index(i)
+
+ res = interpret(dummyfn, (6,), type_system=self.ts)
+ assert res == 1
+ interpret_raises(ValueError, dummyfn, [42], type_system=self.ts)
+
+
def test_insert_pop():
def dummyfn():
l = [6, 7, 8]
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 16:45:17 2006
@@ -29,9 +29,9 @@
return this[index];
}
- public void setitem_nonneg(int index, T value_)
+ public void setitem_nonneg(int index, T item)
{
- this[index] = value_;
+ this[index] = item;
}
public void extend(List<T> other)
@@ -44,5 +44,9 @@
this.RemoveRange(start, count);
}
+ public int index(T item)
+ {
+ return this.IndexOf(item);
+ }
}
}
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 16:45:17 2006
@@ -34,8 +34,8 @@
def bar(x, y):
lst = [1,2,3,x,y]
- del lst[:]
- return sum_(lst)
+ #return sum_(list(lst))
+ return sum_(lst[:])
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 16:45:17 2006
@@ -62,10 +62,25 @@
lst[1:3] = [1234, 5678]
return sum_(lst)
-##def list_del_item_slice(x, y):
-## lst = create(x, y)
-## del lst[0]
-## del lst[2:4]
-## del lst[5:]
-## return sum_(lst)
+def list_bltn_list(x, y):
+ lst = create(x, y)
+ lst2 = list(lst)
+ del lst2[:]
+ return sum_(lst)
+
+def list_del_item_slice(x, y):
+ lst = create(x, y)
+ del lst[0]
+ del lst[2:4]
+ del lst[5:]
+ return sum_(lst)
+
+def list_index(x, y):
+ lst = create(x, y)
+ res = lst.index(x)
+ try:
+ lst.index(x*y+1)
+ except ValueError:
+ res += 1
+ return res
More information about the Pypy-commit
mailing list