[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