[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