[pypy-svn] r49393 - in pypy/dist/pypy/rpython: . lltypesystem ootypesystem test
fijal at codespeak.net
fijal at codespeak.net
Wed Dec 5 19:10:21 CET 2007
Author: fijal
Date: Wed Dec 5 19:10:20 2007
New Revision: 49393
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:
Support for newlist(sizehint=xxx), with a test!
Modified: pypy/dist/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rlist.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/rlist.py Wed Dec 5 19:10:20 2007
@@ -188,6 +188,7 @@
("items", Ptr(ITEMARRAY)),
adtmeths = ADTIList({
"ll_newlist": ll_newlist,
+ "ll_newlist_hint": ll_newlist_hint,
"ll_newemptylist": ll_newemptylist,
"ll_length": ll_length,
"ll_items": ll_items,
@@ -367,6 +368,15 @@
ll_newlist = typeMethod(ll_newlist)
ll_newlist.oopspec = 'newlist(length)'
+def ll_newlist_hint(LIST, lengthhint):
+ ll_assert(lengthhint >= 0, "negative list length")
+ l = malloc(LIST)
+ l.length = 0
+ l.items = malloc(LIST.items.TO, lengthhint)
+ return l
+ll_newlist_hint = typeMethod(ll_newlist_hint)
+ll_newlist_hint.oopspec = 'newlist(length)'
+
# should empty lists start with no allocated memory, or with a preallocated
# minimal number of entries? XXX compare memory usage versus speed, and
# check how many always-empty lists there are in a typical pypy-c run...
@@ -428,10 +438,13 @@
ll_assert(index < len(l), "fixed setitem out of bounds")
l[index] = item
-def newlist(llops, r_list, items_v):
+def newlist(llops, r_list, items_v, v_sizehint=None):
LIST = r_list.LIST
if len(items_v) == 0:
- v_result = llops.gendirectcall(LIST.ll_newemptylist)
+ if v_sizehint is None:
+ v_result = llops.gendirectcall(LIST.ll_newemptylist)
+ else:
+ v_result = llops.gendirectcall(LIST.ll_newlist_hint, v_sizehint)
else:
cno = inputconst(Signed, len(items_v))
v_result = llops.gendirectcall(LIST.ll_newlist, cno)
Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py Wed Dec 5 19:10:20 2007
@@ -85,7 +85,8 @@
-def newlist(llops, r_list, items_v):
+def newlist(llops, r_list, items_v, v_sizehint=None):
+ # XXX do something about v_sizehint
c_list = inputconst(ootype.Void, r_list.lowleveltype)
v_result = llops.genop("new", [c_list], resulttype=r_list.lowleveltype)
c_resize = inputconst(ootype.Void, "_ll_resize")
Modified: pypy/dist/pypy/rpython/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/rlist.py (original)
+++ pypy/dist/pypy/rpython/rlist.py Wed Dec 5 19:10:20 2007
@@ -312,7 +312,7 @@
return hop.genop('bool_not', [flag], resulttype=Bool)
-def rtype_newlist(hop):
+def rtype_newlist(hop, v_sizehint=None):
nb_args = hop.nb_args
r_list = hop.r_result
if r_list == robject.pyobj_repr: # special case: SomeObject lists!
@@ -326,7 +326,8 @@
return v_result
r_listitem = r_list.item_repr
items_v = [hop.inputarg(r_listitem, arg=i) for i in range(nb_args)]
- return hop.rtyper.type_system.rlist.newlist(hop.llops, r_list, items_v)
+ return hop.rtyper.type_system.rlist.newlist(hop.llops, r_list, items_v,
+ v_sizehint=v_sizehint)
def rtype_alloc_and_set(hop):
r_list = hop.r_result
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 Dec 5 19:10:20 2007
@@ -1389,7 +1389,17 @@
for i in range(3):
lis = self.interpret(fnpop, [i])
assert list_is_clear(lis, 3-i)
-
+
+ def test_hints(self):
+ from pypy.rlib.objectmodel import newlist
+
+ def f(z):
+ x = newlist(sizehint=13)
+ x += z
+ return ''.join(x)
+
+ res = self.interpret(f, [self.string_to_ll('abc')])
+ assert self.ll_to_string(res) == 'abc'
class TestOOtype(BaseTestRlist, OORtypeMixin):
rlist = oo_rlist
More information about the Pypy-commit
mailing list