[pypy-svn] r25394 - in pypy/dist/pypy/rpython: . lltypesystem ootypesystem test
nik at codespeak.net
nik at codespeak.net
Wed Apr 5 17:05:25 CEST 2006
Author: nik
Date: Wed Apr 5 17:05:23 2006
New Revision: 25394
Modified:
pypy/dist/pypy/rpython/lltypesystem/rlist.py
pypy/dist/pypy/rpython/ootypesystem/rlist.py
pypy/dist/pypy/rpython/rlist.py
pypy/dist/pypy/rpython/test/test_rlist.py
Log:
implement rtyping of list concatenation and extenion for ootypes. this
introduces a slightly convoluted multiple inheritance setup for ListReprs
to allow for maximum code sharing between lltype and ootype.
Modified: pypy/dist/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rlist.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/rlist.py Wed Apr 5 17:05:23 2006
@@ -4,8 +4,8 @@
from pypy.rpython.error import TyperError
from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst
from pypy.rpython.rmodel import externalvsinternal
-from pypy.rpython.rlist import AbstractListRepr, AbstractListIteratorRepr, \
- rtype_newlist
+from pypy.rpython.rlist import AbstractBaseListRepr, AbstractListRepr, \
+ AbstractListIteratorRepr, rtype_newlist
from pypy.rpython.rlist import dum_nocheck, dum_checkidx
from pypy.rpython.rslice import SliceRepr
from pypy.rpython.rslice import startstop_slice_repr, startonly_slice_repr
@@ -35,7 +35,7 @@
# item_t list_items[]
#
-class BaseListRepr(AbstractListRepr):
+class BaseListRepr(AbstractBaseListRepr):
def __init__(self, rtyper, item_repr, listitem=None):
self.rtyper = rtyper
@@ -49,6 +49,8 @@
self.listitem = listitem
self.list_cache = {}
# setup() needs to be called to finish this initialization
+ self.ll_concat = ll_concat
+ self.ll_extend = ll_extend
self.list_builder = ListBuilder()
def _setup_repr_final(self):
@@ -184,7 +186,7 @@
return 1 # bad but not used alone
-class ListRepr(BaseListRepr):
+class ListRepr(AbstractListRepr, BaseListRepr):
def _setup_repr(self):
if 'item_repr' not in self.__dict__:
@@ -403,11 +405,6 @@
return pairtype(Repr, Repr).rtype_is_(pair(r_lst1, r_lst2), hop)
- def rtype_add((r_lst1, r_lst2), hop):
- v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
- cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
- return hop.gendirectcall(ll_concat, cRESLIST, v_lst1, v_lst2)
-
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)
@@ -422,14 +419,6 @@
def ll_both_none(lst1, lst2):
return not lst1 and not lst2
-class __extend__(pairtype(ListRepr, BaseListRepr)):
-
- def rtype_inplace_add((r_lst1, r_lst2), hop):
- v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
- hop.gendirectcall(ll_extend, v_lst1, v_lst2)
- return v_lst1
-
-
# ____________________________________________________________
#
# Low-level methods. These can be run for testing, but are meant to
Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py Wed Apr 5 17:05:23 2006
@@ -1,27 +1,28 @@
from pypy.annotation.pairtype import pairtype
-from pypy.rpython.rlist import AbstractListRepr, AbstractListIteratorRepr, \
- rtype_newlist
+from pypy.rpython.rlist import AbstractBaseListRepr, AbstractListRepr, \
+ AbstractListIteratorRepr, rtype_newlist
from pypy.rpython.rmodel import Repr, IntegerRepr
from pypy.rpython.rmodel import inputconst, externalvsinternal
from pypy.rpython.ootypesystem import ootype
from pypy.rpython.ootypesystem.riterable import iterator_type
-class BaseListRepr(AbstractListRepr):
+class BaseListRepr(AbstractBaseListRepr):
def __init__(self, rtyper, item_repr, listitem=None):
self.rtyper = rtyper
- # XXX do we need something like this for ootypes?
- #self.LIST = GcForwardReference()
if not isinstance(item_repr, Repr): # not computed yet, done by setup()
assert callable(item_repr)
self._item_repr_computer = item_repr
- self.lowleveltype = ootype.ForwardReference()
+ self.LIST = ootype.ForwardReference()
else:
- self.lowleveltype = ootype.List(item_repr.lowleveltype)
+ self.LIST = ootype.List(item_repr.lowleveltype)
self.external_item_repr, self.item_repr = \
externalvsinternal(rtyper, item_repr)
+ self.lowleveltype = self.LIST
self.listitem = listitem
self.list_cache = {}
+ self.ll_concat = ll_concat
+ self.ll_extend = ll_extend
# setup() needs to be called to finish this initialization
def _setup_repr(self):
@@ -48,8 +49,11 @@
def make_iterator_repr(self):
return ListIteratorRepr(self)
-ListRepr = BaseListRepr
-FixedSizeListRepr = BaseListRepr
+class ListRepr(AbstractListRepr, BaseListRepr):
+
+ pass
+
+FixedSizeListRepr = ListRepr
class __extend__(pairtype(BaseListRepr, IntegerRepr)):
@@ -71,7 +75,7 @@
resulttype=ootype.Void)
return v_result
-# These helpers are trivial but help encapsulation
+# These helpers are sometimes trivial but help encapsulation
def ll_newlist(LIST):
return ootype.new(LIST)
@@ -79,6 +83,28 @@
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.length()
+ i = 0
+ while i < len2:
+ l1.append(l2.getitem(i))
+ i += 1
+
+def ll_concat(RESLIST, l1, l2):
+ len1 = l1.length()
+ len2 = l2.length()
+ l = ootype.new(RESLIST)
+ i = 0
+ while i < len1:
+ l.append(l1.getitem(i))
+ i += 1
+ i = 0
+ while i < len2:
+ l.append(l2.getitem(i))
+ i += 1
+ return l
+
# ____________________________________________________________
#
# Iteration.
Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py (original)
+++ pypy/dist/pypy/rpython/rlist.py Wed Apr 5 17:05:23 2006
@@ -1,3 +1,4 @@
+from pypy.annotation.pairtype import pairtype
from pypy.annotation import model as annmodel
from pypy.rpython.rmodel import Repr, IteratorRepr, inputconst
from pypy.rpython.lltypesystem import lltype
@@ -28,11 +29,15 @@
return self.__class__, self.listdef.listitem
-class AbstractListRepr(Repr):
+class AbstractBaseListRepr(Repr):
def recast(self, llops, v):
return llops.convertvar(v, self.item_repr, self.external_item_repr)
+class AbstractListRepr(AbstractBaseListRepr):
+
+ pass
+
def rtype_newlist(hop):
nb_args = hop.nb_args
r_list = hop.r_result
@@ -53,6 +58,21 @@
def dum_checkidx(): pass
def dum_nocheck(): pass
+
+class __extend__(pairtype(AbstractBaseListRepr, AbstractBaseListRepr)):
+
+ def rtype_add((r_lst1, r_lst2), hop):
+ v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+ cRESLIST = hop.inputconst(lltype.Void, hop.r_result.LIST)
+ return hop.gendirectcall(hop.r_result.ll_concat, cRESLIST, v_lst1, v_lst2)
+
+class __extend__(pairtype(AbstractListRepr, AbstractBaseListRepr)):
+
+ def rtype_inplace_add((r_lst1, r_lst2), hop):
+ v_lst1, v_lst2 = hop.inputargs(r_lst1, r_lst2)
+ hop.gendirectcall(r_lst1.ll_extend, v_lst1, v_lst2)
+ return v_lst1
+
# ____________________________________________________________
#
# Iteration.
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 Wed Apr 5 17:05:23 2006
@@ -234,25 +234,22 @@
res = interpret(dummyfn, [5])
assert res == 5
-def tolst(l):
- return map(None, l.ll_items())[:l.ll_length()]
-
-def test_add():
- def dummyfn():
- l = [5]
- l += [6,7]
- return l + [8]
- res = interpret(dummyfn, [])
- assert tolst(res) == [5, 6, 7, 8]
-
- def dummyfn():
- l = [5]
- l += [6,7]
- l2 = l + [8]
- l2.append(9)
- return l2
- res = interpret(dummyfn, [])
- assert tolst(res) == [5, 6, 7, 8, 9]
+ def test_add(self):
+ def dummyfn():
+ l = [5]
+ l += [6,7]
+ return l + [8]
+ res = interpret(dummyfn, [], type_system=self.ts)
+ assert self.ll_to_list(res) == [5, 6, 7, 8]
+
+ def dummyfn():
+ l = [5]
+ l += [6,7]
+ l2 = l + [8]
+ l2.append(9)
+ return l2
+ res = interpret(dummyfn, [], type_system=self.ts)
+ assert self.ll_to_list(res) == [5, 6, 7, 8, 9]
def test_slice():
def dummyfn():
@@ -303,6 +300,9 @@
res = interpret(dummyfn, [])
assert res == 0
+def tolst(l):
+ return map(None, l.ll_items())[:l.ll_length()]
+
def test_setslice():
def dummyfn():
l = [10, 9, 8, 7]
@@ -1053,7 +1053,12 @@
ts = "lltype"
+ def ll_to_list(self, l):
+ return map(None, l.ll_items())[:l.ll_length()]
+
class TestOotypeRtyping(BaseTestListRtyping):
ts = "ootype"
+ def ll_to_list(self, l):
+ return l._list[:]
More information about the Pypy-commit
mailing list