[pypy-commit] pypy length-hint: Make a newlist_hint an official interface both from ObjSpace and from
fijal
noreply at buildbot.pypy.org
Wed Nov 14 20:23:10 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: length-hint
Changeset: r58908:2ff5e3c765ef
Date: 2012-11-14 13:51 +0100
http://bitbucket.org/pypy/pypy/changeset/2ff5e3c765ef/
Log: Make a newlist_hint an official interface both from ObjSpace and
from __pypy__
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -991,6 +991,10 @@
def newlist_str(self, list_s):
return self.newlist([self.wrap(s) for s in list_s])
+ def newlist_hint(self, sizehint):
+ from pypy.objspace.std.listobject import make_empty_list_with_size
+ return make_empty_list_with_size(self, sizehint)
+
@jit.unroll_safe
def exception_match(self, w_exc_type, w_check_class):
"""Checks if the given exception type matches 'w_check_class'."""
diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py
--- a/pypy/module/__pypy__/__init__.py
+++ b/pypy/module/__pypy__/__init__.py
@@ -44,6 +44,7 @@
'list_strategy' : 'interp_magic.list_strategy',
'validate_fd' : 'interp_magic.validate_fd',
'resizelist_hint' : 'interp_magic.resizelist_hint',
+ 'newlist_hint' : 'interp_magic.newlist_hint',
'newdict' : 'interp_dict.newdict',
'dictstrategy' : 'interp_dict.dictstrategy',
}
diff --git a/pypy/module/__pypy__/interp_magic.py b/pypy/module/__pypy__/interp_magic.py
--- a/pypy/module/__pypy__/interp_magic.py
+++ b/pypy/module/__pypy__/interp_magic.py
@@ -1,7 +1,7 @@
from pypy.interpreter.baseobjspace import ObjSpace, W_Root
from pypy.interpreter.error import OperationError, wrap_oserror
from pypy.interpreter.gateway import unwrap_spec
-from pypy.rlib.objectmodel import resizelist_hint, we_are_translated
+from pypy.rlib.objectmodel import we_are_translated
from pypy.objspace.std.listobject import W_ListObject
from pypy.objspace.std.typeobject import MethodCache
from pypy.objspace.std.mapdict import IndexCache
@@ -102,3 +102,7 @@
raise OperationError(space.w_TypeError,
space.wrap("arg 1 must be a 'list'"))
w_iterable._resize_hint(sizehint)
+
+ at unwrap_spec(sizehint=int)
+def newlist_hint(space, sizehint):
+ return space.newlist_hint(sizehint)
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -34,6 +34,11 @@
storage = strategy.erase(None)
return W_ListObject.from_storage_and_strategy(space, storage, strategy)
+def make_empty_list_with_size(space, hint):
+ strategy = SizeListStrategy(space, hint)
+ storage = strategy.erase(None)
+ return W_ListObject.from_storage_and_strategy(space, storage, strategy)
+
@jit.look_inside_iff(lambda space, list_w, sizehint:
jit.isconstant(len(list_w)) and len(list_w) < UNROLL_CUTOFF)
def get_strategy_from_list_objects(space, list_w, sizehint):
diff --git a/pypy/objspace/std/test/test_listobject.py b/pypy/objspace/std/test/test_listobject.py
--- a/pypy/objspace/std/test/test_listobject.py
+++ b/pypy/objspace/std/test/test_listobject.py
@@ -400,6 +400,11 @@
space.call_method(w_l, 'append', space.w_None)
assert isinstance(w_l.strategy, ObjectListStrategy)
+ def test_newlist_hint(self):
+ space = self.space
+ w_lst = space.newlist_hint(13)
+ assert isinstance(w_lst.strategy, SizeListStrategy)
+ assert w_lst.strategy.sizehint == 13
class AppTestW_ListObject(object):
def setup_class(cls):
More information about the pypy-commit
mailing list