[pypy-svn] r25903 - in pypy/dist/pypy: rpython rpython/lltypesystem rpython/ootypesystem rpython/test translator/cli/test

antocuni at codespeak.net antocuni at codespeak.net
Mon Apr 17 16:45:17 CEST 2006


Author: antocuni
Date: Mon Apr 17 16:44:58 2006
New Revision: 25903

Modified:
   pypy/dist/pypy/rpython/lltypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/rootype.py
   pypy/dist/pypy/rpython/rlist.py
   pypy/dist/pypy/rpython/test/test_rlist.py
   pypy/dist/pypy/translator/cli/test/compile.py
Log:
- Added support for is_, eq and ne between two OOInstanceRepr.

- Added convert_constant to ootypeststem/rlist.py

- Added more tests for ootypesystem's list.



Modified: pypy/dist/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rlist.py	Mon Apr 17 16:44:58 2006
@@ -1,6 +1,5 @@
 from pypy.annotation.pairtype import pairtype, pair
 from pypy.annotation import model as annmodel
-from pypy.objspace.flow.model import Constant
 from pypy.rpython.error import TyperError
 from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst
 from pypy.rpython.rmodel import externalvsinternal
@@ -64,31 +63,8 @@
     def _setup_repr_final(self):
         self.list_builder.setup(self)
 
-    def convert_const(self, listobj):
-        # get object from bound list method
-        #listobj = getattr(listobj, '__self__', listobj)
-        if listobj is None:
-            return nullptr(self.LIST)
-        if not isinstance(listobj, list):
-            raise TyperError("expected a list: %r" % (listobj,))
-        try:
-            key = Constant(listobj)
-            return self.list_cache[key]
-        except KeyError:
-            self.setup()
-            n = len(listobj)
-            result = self.prepare_const(n)
-            self.list_cache[key] = result
-            r_item = self.item_repr
-            if r_item.lowleveltype is not Void:
-                items = result.ll_items()
-                for i in range(n):
-                    x = listobj[i]
-                    items[i] = r_item.convert_const(x)
-            return result
-
-    def prepare_const(self, nitems):
-        raise NotImplementedError
+    def null_const(self):
+        return nullptr(self.LIST)
 
     def get_eqfunc(self):
         return inputconst(Void, self.item_repr.get_ll_eq_function())
@@ -170,6 +146,16 @@
         return 1 # bad but not used alone
 
 
+class __extend__(pairtype(BaseListRepr, BaseListRepr)):
+    def rtype_is_((r_lst1, r_lst2), hop):
+        if r_lst1.lowleveltype != r_lst2.lowleveltype:
+            # obscure logic, the is can be true only if both are None
+            v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+            return hop.gendirectcall(ll_both_none, v_lst1, v_lst2)
+
+        return pairtype(Repr, Repr).rtype_is_(pair(r_lst1, r_lst2), hop)
+
+
 class ListRepr(AbstractListRepr, BaseListRepr):
 
     def _setup_repr(self):
@@ -318,6 +304,8 @@
 
 TEMP = GcArray(Ptr(rstr.STR))
 
+def ll_both_none(lst1, lst2):
+    return not lst1 and not lst2
         
 
 # ____________________________________________________________

Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py	Mon Apr 17 16:44:58 2006
@@ -43,6 +43,14 @@
         if isinstance(self.lowleveltype, ootype.ForwardReference):
             self.lowleveltype.become(ootype.List(self.item_repr.lowleveltype))
 
+    def null_const(self):
+        return self.LIST._null
+
+    def prepare_const(self, n):
+        result = self.LIST.ll_newlist(n)
+        return result
+        
+
     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:])
@@ -55,25 +63,6 @@
     def get_eqfunc(self):
         return inputconst(Void, self.item_repr.get_ll_eq_function())
 
-##    def rtype_len(self, hop):
-##        return self.send_message(hop, "ll_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")
-
-##    def rtype_method_extend(self, hop):
-##        return self.send_message(hop, "extend")
-
     def make_iterator_repr(self):
         return ListIteratorRepr(self)
 
@@ -83,37 +72,13 @@
 
 FixedSizeListRepr = ListRepr
 
-##class __extend__(pairtype(BaseListRepr, IntegerRepr)):
+class __extend__(pairtype(BaseListRepr, BaseListRepr)):
+
+    def rtype_is_((r_lst1, r_lst2), hop):
+        # NB. this version performs no cast to the common base class
+        vlist = hop.inputargs(r_lst1, r_lst2)
+        return hop.genop('oois', vlist, resulttype=ootype.Bool)
 
-##    def rtype_getitem((r_list, r_int), hop):
-##        if hop.args_s[1].nonneg:
-##            return r_list.send_message(hop, "ll_getitem_fast", 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):
-##        if hop.args_s[1].nonneg:
-##            return r_list.send_message(hop, "ll_setitem_fast", 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)
-
-
-##class __extend__(pairtype(ListRepr, IntegerRepr)):
-
-##    def rtype_delitem((r_list, r_int), hop):
-##        v_list, v_index = hop.inputargs(r_list, Signed)
-##        if hop.args_s[1].nonneg:
-##            c_count = hop.inputconst(Signed, 1)
-##            return r_list.send_message(hop, "remove_range",can_raise=True,
-##                                       v_args=[v_list, v_index, c_count])
-##        else:
-##            hop.exception_is_here()
-##            return hop.gendirectcall(ll_delitem, v_list, v_index)
 
 
 def newlist(llops, r_list, items_v):
@@ -126,116 +91,6 @@
                 resulttype=ootype.Void)
     return v_result
 
-# These helpers are sometimes trivial but help encapsulation
-
-##def ll_newlist(LIST):
-##    return ootype.new(LIST)
-
-##def ll_getitem(lst, index):
-##    if index < 0:
-##        index += lst.ll_length()
-##    return lst.ll_getitem_fast(index)
-
-##def ll_setitem(lst, index, item):
-##    if index < 0:
-##        index += lst.ll_length()
-##    return lst.ll_setitem_fast(index, item)
-
-##def ll_delitem(lst, index):
-##    if index < 0:
-##        index += lst.ll_length()
-##    return lst.remove_range(index, 1)
-
-##def ll_list_is_true(lst):
-##    return bool(lst) and lst.ll_length() != 0    
-
-##def ll_append(lst, item):
-##    lst.append(item)
-
-##def ll_extend(l1, l2):
-##    # This is a bit inefficient, could also add extend to the list interface
-##    len2 = l2.ll_length()
-##    i = 0
-##    while i < len2:
-##        l1.append(l2.ll_getitem_fast(i))
-##        i += 1
-
-
-##def ll_listslice_startonly(RESLIST, lst, start):
-##    len1 = lst.ll_length()
-##    #newlength = len1 - start
-##    res = ootype.new(RESLIST) # TODO: pre-allocate newlength elements
-##    i = start
-##    while i < len1:
-##        res.append(lst.ll_getitem_fast(i))
-##        i += 1
-##    return res
-
-##def ll_listslice(RESLIST, lst, slice):
-##    start = slice.start
-##    stop = slice.stop
-##    length = lst.ll_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.ll_getitem_fast(i))
-##        i += 1
-##    return res
-
-##def ll_listslice_minusone(RESLIST, lst):
-##    newlength = lst.ll_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.ll_getitem_fast(i))
-##        i += 1
-##    return res
-
-##def ll_listsetslice(l1, slice, l2):
-##    count = l2.ll_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.ll_setitem_fast(j, l2.ll_getitem_fast(i))
-##        i += 1
-##        j += 1
-
-##def ll_listdelslice_startonly(lst, start):
-##    count = lst.ll_length() - start
-##    if count > 0:
-##        lst.remove_range(start, count)
-
-##def ll_listdelslice(lst, slice):
-##    start = slice.start
-##    stop = slice.stop
-##    length = lst.ll_length()
-##    if stop > length:
-##        stop = length
-##    count = stop - start
-##    if count > 0:
-##        lst.remove_range(start, count)
-
-##def ll_listindex(lst, obj, eqfn):
-##    lng = lst.ll_length()
-##    j = 0
-##    while j < lng:
-##        if eqfn is None:
-##            if lst.ll_getitem_fast(j) == obj:
-##                return j
-##        else:
-##            if eqfn(lst.ll_getitem_fast(j), obj):
-##                return j
-##        j += 1
-##    raise ValueError # can't say 'list.index(x): x not in list'
-
 
 
 # ____________________________________________________________

Modified: pypy/dist/pypy/rpython/ootypesystem/rootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rootype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rootype.py	Mon Apr 17 16:44:58 2006
@@ -59,6 +59,12 @@
         vlist = hop.inputargs(r_ins1, r_ins2)
         return hop.genop('oois', vlist, resulttype=ootype.Bool)
 
+    rtype_eq = rtype_is_
+
+    def rtype_ne(rpair, hop):
+        v = rpair.rtype_eq(hop)
+        return hop.genop("bool_not", [v], resulttype=ootype.Bool)
+
 
 class OOBoundMethRepr(Repr):
     def __init__(self, ootype, name):

Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py	(original)
+++ pypy/dist/pypy/rpython/rlist.py	Mon Apr 17 16:44:58 2006
@@ -1,4 +1,5 @@
 from pypy.annotation.pairtype import pairtype, pair
+from pypy.objspace.flow.model import Constant
 from pypy.annotation import model as annmodel
 from pypy.rpython.rmodel import Repr, IteratorRepr, IntegerRepr, inputconst
 from pypy.rpython.rslice import AbstractSliceRepr
@@ -38,6 +39,34 @@
     def recast(self, llops, v):
         return llops.convertvar(v, self.item_repr, self.external_item_repr)
 
+    def convert_const(self, listobj):
+        # get object from bound list method
+        #listobj = getattr(listobj, '__self__', listobj)
+        if listobj is None:
+            return self.null_const()
+        if not isinstance(listobj, list):
+            raise TyperError("expected a list: %r" % (listobj,))
+        try:
+            key = Constant(listobj)
+            return self.list_cache[key]
+        except KeyError:
+            self.setup()
+            n = len(listobj)
+            result = self.prepare_const(n)
+            self.list_cache[key] = result
+            r_item = self.item_repr
+            if r_item.lowleveltype is not Void:
+                for i in range(n):
+                    x = listobj[i]
+                    result.ll_setitem_fast(i, r_item.convert_const(x))
+            return result
+
+    def null_const(self):
+        raise NotImplementedError
+
+    def prepare_const(self, nitems):
+        raise NotImplementedError
+
     def rtype_bltn_list(self, hop):
         v_lst = hop.inputarg(self, 0)
         cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
@@ -190,14 +219,15 @@
             return NotImplemented
         return v
 
-    def rtype_is_((r_lst1, r_lst2), hop):
-        if r_lst1.lowleveltype != r_lst2.lowleveltype:
-            # obscure logic, the is can be true only if both are None
-            v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
-            return hop.gendirectcall(ll_both_none, v_lst1, v_lst2)
-
-        return pairtype(Repr, Repr).rtype_is_(pair(r_lst1, r_lst2), hop)
+##    # TODO: move it to lltypesystem
+##    def rtype_is_((r_lst1, r_lst2), hop):
+##        if r_lst1.lowleveltype != r_lst2.lowleveltype:
+##            # obscure logic, the is can be true only if both are None
+##            v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+##            return hop.gendirectcall(ll_both_none, v_lst1, v_lst2)
 
+##        return pairtype(Repr, Repr).rtype_is_(pair(r_lst1, r_lst2), hop)
+ 
     def rtype_eq((r_lst1, r_lst2), hop):
         assert r_lst1.item_repr == r_lst2.item_repr
         v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
@@ -311,8 +341,6 @@
 #  be direct_call'ed from rtyped flow graphs, which means that they will
 #  get flowed and annotated, mostly with SomePtr.
 
-def ll_both_none(lst1, lst2):
-    return not lst1 and not lst2
 
 # return a nullptr() if lst is a list of pointers it, else None.  Note
 # that if we are using ootypesystem there are not pointers, so we

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	Mon Apr 17 16:44:58 2006
@@ -1,11 +1,13 @@
 import sys
 from pypy.translator.translator import TranslationContext
 from pypy.rpython.lltypesystem.lltype import *
+from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.rlist import *
 from pypy.rpython.lltypesystem.rlist import ListRepr, FixedSizeListRepr, ll_newlist, ll_fixed_newlist
 from pypy.rpython.lltypesystem.rslice import ll_newslice
 from pypy.rpython.rint import signed_repr
-from pypy.rpython.test.test_llinterp import interpret, interpret_raises
+from pypy.rpython.test.test_llinterp import interpret #as interpret2
+from pypy.rpython.test.test_llinterp import interpret_raises # as interpret_raises2
 from pypy.translator.translator import TranslationContext
 from pypy.objspace.flow.model import Constant, Variable
 
@@ -161,13 +163,27 @@
 
 # ____________________________________________________________
 
+class Foo: pass
+
+class Bar(Foo): pass
+
 class BaseTestListRtyping:
 
+    def interpret(self, fn, args):
+        return interpret(fn, args, type_system=self.ts)
+
+    def interpret_raises(self, exc, fn, args):
+        return interpret_raises(exc, fn, args, type_system=self.ts)
+
+    def _skip_tuples(self):
+        if self.ts == 'ootype':
+            py.test.skip("ootypesystem doesn't support returning tuples of lists, yet")        
+
     def test_simple(self):
         def dummyfn():
             l = [10, 20, 30]
             return l[2]
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 30
 
     def test_append(self):
@@ -179,7 +195,7 @@
             l.append(80)
             l.append(90)
             return len(l), l[0], l[-1]
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res.item0 == 5 
         assert res.item1 == 50
         assert res.item2 == 90
@@ -188,14 +204,14 @@
         def dummyfn():
             l = [5, 10]
             return len(l)
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 2
 
         def dummyfn():
             l = [5]
             l.append(6)
             return len(l)
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 2
 
     def test_iterate(self):
@@ -204,7 +220,7 @@
             for x in [1, 3, 5, 7, 9]:
                 total += x
             return total
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 25
         def dummyfn():
             total = 0
@@ -213,7 +229,7 @@
             for x in l:
                 total += x
             return total
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 25
 
     def test_recursive(self):
@@ -223,7 +239,7 @@
                 l = [l]
                 N -= 1
             return len(l)
-        res = interpret(dummyfn, [5], type_system=self.ts)
+        res = self.interpret(dummyfn, [5])
         assert res == 1
 
         def dummyfn(N):
@@ -232,7 +248,7 @@
                 l.append(l)
                 N -= 1
             return len(l)
-        res = interpret(dummyfn, [5])
+        res = self.interpret(dummyfn, [5])
         assert res == 5
 
     def test_add(self):
@@ -240,7 +256,7 @@
             l = [5]
             l += [6,7]
             return l + [8]
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res) == [5, 6, 7, 8]
 
         def dummyfn():
@@ -249,16 +265,15 @@
             l2 =  l + [8]
             l2.append(9)
             return l2
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res) == [5, 6, 7, 8, 9]
 
     def test_slice(self):
-        if self.ts == 'ootype':
-            py.test.skip("ootypesystem doesn't support returning tuples of lists, yet")
+        self._skip_tuples()
         def dummyfn():
             l = [5, 6, 7, 8, 9]
             return l[:2], l[1:4], l[3:]
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res.item0) == [5, 6]
         assert self.ll_to_list(res.item1) == [6, 7, 8]
         assert self.ll_to_list(res.item2) == [8, 9]
@@ -267,7 +282,7 @@
             l = [5, 6, 7, 8]
             l.append(9)
             return l[:2], l[1:4], l[3:]
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res.item0) == [5, 6]
         assert self.ll_to_list(res.item1) == [6, 7, 8]
         assert self.ll_to_list(res.item2) == [8, 9]
@@ -278,7 +293,7 @@
             l[1] = 55
             l[-1] = 66
             return l
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res) == [5, 55, 66]
 
         def dummyfn():
@@ -289,7 +304,7 @@
             l[1] = 55
             l[-1] = 66
             return l
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert self.ll_to_list(res) == [5, 55, 66]
 
         def dummyfn():
@@ -300,17 +315,16 @@
             del l[-1]
             del l[:]
             return len(l)
-        res = interpret(dummyfn, [], type_system=self.ts)
+        res = self.interpret(dummyfn, [])
         assert res == 0
-
+        
     def test_setslice(self):
-        if self.ts == 'ootype':
-            py.test.skip("ootypesystem doesn't support returning tuples of lists, yet")        
+        self._skip_tuples()
         def dummyfn():
             l = [10, 9, 8, 7]
             l[:2] = [6, 5]
             return l[0], l[1], l[2], l[3]
-        res = interpret(dummyfn, (), type_system=self.ts)
+        res = self.interpret(dummyfn, ())
         assert res.item0 == 6
         assert res.item1 == 5
         assert res.item2 == 8
@@ -321,7 +335,7 @@
             l.append(7)
             l[:2] = [6, 5]
             return l[0], l[1], l[2], l[3]
-        res = interpret(dummyfn, (), type_system=self.ts)
+        res = self.interpret(dummyfn, ())
         assert res.item0 == 6
         assert res.item1 == 5
         assert res.item2 == 8
@@ -333,7 +347,7 @@
             l2 = list(l1)
             l2[0] = 0
             return l1[0]
-        res = interpret(dummyfn, (), type_system=self.ts)
+        res = self.interpret(dummyfn, ())
         assert res == 42
 
     def test_is_true(self):
@@ -348,266 +362,264 @@
             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
+        assert self.interpret(dummyfn1, ()) == False
+        assert self.interpret(dummyfn2, ()) == False
+        assert self.interpret(dummyfn3, ()) == 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)
+        res = self.interpret(dummyfn, (6,))
         assert res == 1
-        interpret_raises(ValueError, dummyfn, [42], type_system=self.ts)
+        interpret_raises(ValueError, dummyfn, [42])
 
 
-def test_insert_pop():
-    def dummyfn():
-        l = [6, 7, 8]
-        l.insert(0, 5)
-        l.insert(1, 42)
-        l.pop(2)
-        l.pop(0)
-        l.pop(-1)
-        l.pop()
-        return l[-1]
-    res = interpret(dummyfn, ())#, view=True)
-    assert res == 42
+    def test_insert_pop(self):
+        def dummyfn():
+            l = [6, 7, 8]
+            l.insert(0, 5)
+            l.insert(1, 42)
+            l.pop(2)
+            l.pop(0)
+            l.pop(-1)
+            l.pop()
+            return l[-1]
+        res = self.interpret(dummyfn, ())#, view=True)
+        assert res == 42
 
-def test_insert_bug():
-    def dummyfn(n):
-        l = [1]
-        l = l[:]
-        l.pop(0)
-        if n < 0:
-            l.insert(0, 42)
-        else:
-            l.insert(n, 42)
-        return l
-    res = interpret(dummyfn, [0])
-    assert res.ll_length() == 1
-    assert res.ll_items()[0] == 42
-    res = interpret(dummyfn, [-1])
-    assert res.ll_length() == 1
-    assert res.ll_items()[0] == 42
+    def test_insert_bug(self):
+        def dummyfn(n):
+            l = [1]
+            l = l[:]
+            l.pop(0)
+            if n < 0:
+                l.insert(0, 42)
+            else:
+                l.insert(n, 42)
+            return l
+        res = self.interpret(dummyfn, [0])
+        assert res.ll_length() == 1
+        assert res.ll_getitem_fast(0) == 42
+        res = self.interpret(dummyfn, [-1])
+        assert res.ll_length() == 1
+        assert res.ll_getitem_fast(0) == 42
 
-def test_inst_pop():
-    class A:
-        pass
-    l = [A(), A()]
-    def f(idx):
-        try:
-            return l.pop(idx)
-        except IndexError:
-            return None
-    res = interpret(f, [1])
-    assert ''.join(res.super.typeptr.name) == 'A\00'
+    def test_inst_pop(self):
+        class A:
+            pass
+        l = [A(), A()]
+        def f(idx):
+            try:
+                return l.pop(idx)
+            except IndexError:
+                return None
+        res = self.interpret(f, [1])
+        assert self.class_name(res) == 'A'
+        #''.join(res.super.typeptr.name) == 'A\00'
         
 
-def test_reverse():
-    def dummyfn():
-        l = [5, 3, 2]
-        l.reverse()
-        return l[0]*100 + l[1]*10 + l[2]
-    res = interpret(dummyfn, ())
-    assert res == 235
+    def test_reverse(self):
+        def dummyfn():
+            l = [5, 3, 2]
+            l.reverse()
+            return l[0]*100 + l[1]*10 + l[2]
+        res = self.interpret(dummyfn, ())
+        assert res == 235
 
-    def dummyfn():
-        l = [5]
-        l.append(3)
-        l.append(2)
-        l.reverse()
-        return l[0]*100 + l[1]*10 + l[2]
-    res = interpret(dummyfn, ())
-    assert res == 235
-
-def test_prebuilt_list():
-    klist = ['a', 'd', 'z', 'k']
-    def dummyfn(n):
-        return klist[n]
-    res = interpret(dummyfn, [0])
-    assert res == 'a'
-    res = interpret(dummyfn, [3])
-    assert res == 'k'
-    res = interpret(dummyfn, [-2])
-    assert res == 'z'
+        def dummyfn():
+            l = [5]
+            l.append(3)
+            l.append(2)
+            l.reverse()
+            return l[0]*100 + l[1]*10 + l[2]
+        res = self.interpret(dummyfn, ())
+        assert res == 235
 
-    klist = ['a', 'd', 'z']
-    def mkdummyfn():
+    def test_prebuilt_list(self):
+        klist = ['a', 'd', 'z', 'k']
         def dummyfn(n):
-            klist.append('k')
             return klist[n]
-        return dummyfn
-    res = interpret(mkdummyfn(), [0])
-    assert res == 'a'
-    res = interpret(mkdummyfn(), [3])
-    assert res == 'k'
-    res = interpret(mkdummyfn(), [-2])
-    assert res == 'z'
-
-def test_bound_list_method():
-    klist = [1, 2, 3]
-    # for testing constant methods without actually mutating the constant
-    def dummyfn(n):
-        klist.extend([])
-    interpret(dummyfn, [7])
-
-def test_list_is():
-    def dummyfn():
-        l1 = []
-        return l1 is l1
-    res = interpret(dummyfn, [])
-    assert res is True
-    def dummyfn():
-        l2 = [1, 2]
-        return l2 is l2
-    res = interpret(dummyfn, [])
-    assert res is True
-    def dummyfn():
-        l1 = [2]
-        l2 = [1, 2]
-        return l1 is l2
-    res = interpret(dummyfn, [])
-    assert res is False
-    def dummyfn():
-        l1 = [1, 2]
-        l2 = [1]
-        l2.append(2)
-        return l1 is l2
-    res = interpret(dummyfn, [])
-    assert res is False
-
-    def dummyfn():
-        l1 = None
-        l2 = [1, 2]
-        return l1 is l2
-    res = interpret(dummyfn, [])
-    assert res is False
-
-    def dummyfn():
-        l1 = None
-        l2 = [1]
-        l2.append(2)
-        return l1 is l2
-    res = interpret(dummyfn, [])
-    assert res is False
-
-def test_list_compare():
-    def fn(i, j, neg=False):
-        s1 = [[1, 2, 3], [4, 5, 1], None]
-        s2 = [[1, 2, 3], [4, 5, 1], [1], [1, 2], [4, 5, 1, 6],
-              [7, 1, 1, 8, 9, 10], None]
-        if neg: return s1[i] != s2[i]
-        return s1[i] == s2[j]
-    for i in range(3):
-        for j in range(7):
-            for case in False, True:
-                res = interpret(fn, [i,j,case])
-                assert res is fn(i, j, case)
-
-    def fn(i, j, neg=False):
-        s1 = [[1, 2, 3], [4, 5, 1], None]
-        l = []
-        l.extend([1,2,3])
-        s2 = [l, [4, 5, 1], [1], [1, 2], [4, 5, 1, 6],
-              [7, 1, 1, 8, 9, 10], None]
-        if neg: return s1[i] != s2[i]
-        return s1[i] == s2[j]
-    for i in range(3):
-        for j in range(7):
-            for case in False, True:
-                res = interpret(fn, [i,j,case])
-                assert res is fn(i, j, case)
-
+        res = self.interpret(dummyfn, [0])
+        assert res == 'a'
+        res = self.interpret(dummyfn, [3])
+        assert res == 'k'
+        res = self.interpret(dummyfn, [-2])
+        assert res == 'z'
+
+        klist = ['a', 'd', 'z']
+        def mkdummyfn():
+            def dummyfn(n):
+                klist.append('k')
+                return klist[n]
+            return dummyfn
+        res = self.interpret(mkdummyfn(), [0])
+        assert res == 'a'
+        res = self.interpret(mkdummyfn(), [3])
+        assert res == 'k'
+        res = self.interpret(mkdummyfn(), [-2])
+        assert res == 'z'
+
+    def test_bound_list_method(self):
+        klist = [1, 2, 3]
+        # for testing constant methods without actually mutating the constant
+        def dummyfn(n):
+            klist.extend([])
+        self.interpret(dummyfn, [7])
 
-def test_list_comparestr():
-    def fn(i, j, neg=False):
-        s1 = [["hell"], ["hello", "world"]]
-        s1[0][0] += "o" # ensure no interning
-        s2 = [["hello"], ["world"]]
-        if neg: return s1[i] != s2[i]
-        return s1[i] == s2[j]
-    for i in range(2):
-        for j in range(2):
-            for case in False, True:
-                res = interpret(fn, [i,j,case])
-                assert res is fn(i, j, case)
+    def test_list_is(self):
+        def dummyfn():
+            l1 = []
+            return l1 is l1
+        res = self.interpret(dummyfn, [])
+        assert res is True
+        def dummyfn():
+            l2 = [1, 2]
+            return l2 is l2
+        res = self.interpret(dummyfn, [])
+        assert res is True
+        def dummyfn():
+            l1 = [2]
+            l2 = [1, 2]
+            return l1 is l2
+        res = self.interpret(dummyfn, [])
+        assert res is False
+        def dummyfn():
+            l1 = [1, 2]
+            l2 = [1]
+            l2.append(2)
+            return l1 is l2
+        res = self.interpret(dummyfn, [])
+        assert res is False
 
-class Foo: pass
+        def dummyfn():
+            l1 = None
+            l2 = [1, 2]
+            return l1 is l2
+        res = self.interpret(dummyfn, [])
+        assert res is False
 
-class Bar(Foo): pass
+        def dummyfn():
+            l1 = None
+            l2 = [1]
+            l2.append(2)
+            return l1 is l2
+        res = self.interpret(dummyfn, [])
+        assert res is False
+
+    def test_list_compare(self):
+        def fn(i, j, neg=False):
+            s1 = [[1, 2, 3], [4, 5, 1], None]
+            s2 = [[1, 2, 3], [4, 5, 1], [1], [1, 2], [4, 5, 1, 6],
+                  [7, 1, 1, 8, 9, 10], None]
+            if neg: return s1[i] != s2[i]
+            return s1[i] == s2[j]
+        for i in range(3):
+            for j in range(7):
+                for case in False, True:
+                    res = self.interpret(fn, [i,j,case])
+                    assert res is fn(i, j, case)
 
-def test_list_compareinst():
-    def fn(i, j, neg=False):
-        foo1 = Foo()
-        foo2 = Foo()
-        bar1 = Bar()
-        s1 = [[foo1], [foo2], [bar1]]
-        s2 = s1[:]
-        if neg: return s1[i] != s2[i]
-        return s1[i] == s2[j]
-    for i in range(3):
-        for j in range(3):
+        def fn(i, j, neg=False):
+            s1 = [[1, 2, 3], [4, 5, 1], None]
+            l = []
+            l.extend([1,2,3])
+            s2 = [l, [4, 5, 1], [1], [1, 2], [4, 5, 1, 6],
+                  [7, 1, 1, 8, 9, 10], None]
+            if neg: return s1[i] != s2[i]
+            return s1[i] == s2[j]
+        for i in range(3):
+            for j in range(7):
+                for case in False, True:
+                    res = self.interpret(fn, [i,j,case])
+                    assert res is fn(i, j, case)
+
+
+    def test_list_comparestr(self):
+        def fn(i, j, neg=False):
+            s1 = [["hell"], ["hello", "world"]]
+            s1[0][0] += "o" # ensure no interning
+            s2 = [["hello"], ["world"]]
+            if neg: return s1[i] != s2[i]
+            return s1[i] == s2[j]
+        for i in range(2):
+            for j in range(2):
+                for case in False, True:
+                    res = self.interpret(fn, [i,j,case])
+                    assert res is fn(i, j, case)
+
+
+    def test_list_compareinst(self):
+        def fn(i, j, neg=False):
+            foo1 = Foo()
+            foo2 = Foo()
+            bar1 = Bar()
+            s1 = [[foo1], [foo2], [bar1]]
+            s2 = s1[:]
+            if neg: return s1[i] != s2[i]
+            return s1[i] == s2[j]
+        for i in range(3):
+            for j in range(3):
+                for case in False, True:
+                    res = self.interpret(fn, [i, j, case])
+                    assert res is fn(i, j, case)
+
+        def fn(i, j, neg=False):
+            foo1 = Foo()
+            foo2 = Foo()
+            bar1 = Bar()
+            s1 = [[foo1], [foo2], [bar1]]
+            s2 = s1[:]
+
+            s2[0].extend([])
+
+            if neg: return s1[i] != s2[i]
+            return s1[i] == s2[j]
+        for i in range(3):
+            for j in range(3):
+                for case in False, True:
+                    res = self.interpret(fn, [i, j, case])
+                    assert res is fn(i, j, case)
+
+
+    def test_list_contains(self):
+        def fn(i, neg=False):
+            foo1 = Foo()
+            foo2 = Foo()
+            bar1 = Bar()
+            bar2 = Bar()
+            lis = [foo1, foo2, bar1]
+            args = lis + [bar2]
+            if neg : return args[i] not in lis
+            return args[i] in lis
+        for i in range(4):
             for case in False, True:
-                res = interpret(fn, [i, j, case])
-                assert res is fn(i, j, case)
-
-    def fn(i, j, neg=False):
-        foo1 = Foo()
-        foo2 = Foo()
-        bar1 = Bar()
-        s1 = [[foo1], [foo2], [bar1]]
-        s2 = s1[:]
+                res = self.interpret(fn, [i, case])
+                assert res is fn(i, case)
 
-        s2[0].extend([])
-        
-        if neg: return s1[i] != s2[i]
-        return s1[i] == s2[j]
-    for i in range(3):
-        for j in range(3):
+        def fn(i, neg=False):
+            foo1 = Foo()
+            foo2 = Foo()
+            bar1 = Bar()
+            bar2 = Bar()
+            lis = [foo1, foo2, bar1]
+            lis.append(lis.pop())
+            args = lis + [bar2]
+            if neg : return args[i] not in lis
+            return args[i] in lis
+        for i in range(4):
             for case in False, True:
-                res = interpret(fn, [i, j, case])
-                assert res is fn(i, j, case)
-
-
-def test_list_contains():
-    def fn(i, neg=False):
-        foo1 = Foo()
-        foo2 = Foo()
-        bar1 = Bar()
-        bar2 = Bar()
-        lis = [foo1, foo2, bar1]
-        args = lis + [bar2]
-        if neg : return args[i] not in lis
-        return args[i] in lis
-    for i in range(4):
-        for case in False, True:
-            res = interpret(fn, [i, case])
-            assert res is fn(i, case)
-
-    def fn(i, neg=False):
-        foo1 = Foo()
-        foo2 = Foo()
-        bar1 = Bar()
-        bar2 = Bar()
-        lis = [foo1, foo2, bar1]
-        lis.append(lis.pop())
-        args = lis + [bar2]
-        if neg : return args[i] not in lis
-        return args[i] in lis
-    for i in range(4):
-        for case in False, True:
-            res = interpret(fn, [i, case])
-            assert res is fn(i, case)
+                res = self.interpret(fn, [i, case])
+                assert res is fn(i, case)
 
 
-def test_not_a_char_list_after_all():
-    def fn():
-        l = ['h', 'e', 'l', 'l', 'o']
-        return 'world' in l
-    res = interpret(fn, [])
-    assert res is False
+    def test_not_a_char_list_after_all(self):
+        def fn():
+            l = ['h', 'e', 'l', 'l', 'o']
+            return 'world' in l
+        res = self.interpret(fn, [])
+        assert res is False
 
 def test_list_index():
     def fn(i):
@@ -1093,9 +1105,16 @@
     def ll_to_list(self, l):
         return map(None, l.ll_items())[:l.ll_length()]
 
+    def class_name(self, value):
+        return "".join(value.super.typeptr.name)[:-1]
+    
+
 class TestOotypeRtyping(BaseTestListRtyping):
 
     ts = "ootype"
 
     def ll_to_list(self, l):
         return l._list[:]
+
+    def class_name(self, value):
+        return ootype.dynamicType(value)._name.split(".")[-1] 

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	Mon Apr 17 16:44:58 2006
@@ -32,10 +32,13 @@
         i += 1
     return total    
 
-def bar(x, y):
-    lst = [1,2,3,x,y] + [1,2]
-    #return sum_(list(lst))
-    return lst[4]
+class A:
+    pass
+
+##def bar(x, y):
+##    lst = [A(), A()]
+##    return lst.pop(1)
+
 
 f = compile_function(bar, [int, int])
 



More information about the Pypy-commit mailing list