Author: Armin Rigo <[email protected]>
Branch: py3k
Changeset: r86710:5e30f5104630
Date: 2016-08-29 21:02 +0200
http://bitbucket.org/pypy/pypy/changeset/5e30f5104630/
Log: hg merge default
with suitable refactorings of 990f5b2322e1 for py3k
diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py
--- a/lib_pypy/_ctypes/function.py
+++ b/lib_pypy/_ctypes/function.py
@@ -342,7 +342,7 @@
thisarg = cast(thisvalue, POINTER(POINTER(c_void_p)))
keepalives, newargs, argtypes, outargs, errcheckargs = (
self._convert_args(argtypes, args[1:], kwargs))
- newargs.insert(0, thisvalue.value)
+ newargs.insert(0, thisarg)
argtypes.insert(0, c_void_p)
else:
thisarg = None
diff --git a/pypy/module/cpyext/test/test_cpyext.py
b/pypy/module/cpyext/test/test_cpyext.py
--- a/pypy/module/cpyext/test/test_cpyext.py
+++ b/pypy/module/cpyext/test/test_cpyext.py
@@ -145,6 +145,24 @@
#state.print_refcounts()
self.frozen_ll2callocations = set(ll2ctypes.ALLOCATED.values())
+class FakeSpace(object):
+ """Like TinyObjSpace, but different"""
+ def __init__(self, config):
+ from distutils.sysconfig import get_python_inc
+ self.config = config
+ self.include_dir = get_python_inc()
+
+ def passthrough(self, arg):
+ return arg
+ listview = passthrough
+ str_w = passthrough
+
+ def unwrap(self, args):
+ try:
+ return args.str_w(None)
+ except:
+ return args
+
class LeakCheckingTest(object):
"""Base class for all cpyext tests."""
spaceconfig = dict(usemodules=['cpyext', 'thread', '_rawffi', 'array',
@@ -440,21 +458,8 @@
self.imported_module_names = []
if self.runappdirect:
+ fake = FakeSpace(self.space.config)
def interp2app(func):
- from distutils.sysconfig import get_python_inc
- class FakeSpace(object):
- def passthrough(self, arg):
- return arg
- listview = passthrough
- str_w = passthrough
- def unwrap(self, args):
- try:
- return args.str_w(None)
- except:
- return args
- fake = FakeSpace()
- fake.include_dir = get_python_inc()
- fake.config = self.space.config
def run(*args, **kwargs):
for k in kwargs.keys():
if k not in func.unwrap_spec and not
k.startswith('w_'):
diff --git a/pypy/objspace/std/bytearrayobject.py
b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -926,7 +926,6 @@
of the specified width. B is never truncated.
"""
-
W_BytearrayObject.typedef = TypeDef(
"bytearray",
__doc__ = BytearrayDocstrings.__doc__,
diff --git a/pypy/objspace/std/iterobject.py b/pypy/objspace/std/iterobject.py
--- a/pypy/objspace/std/iterobject.py
+++ b/pypy/objspace/std/iterobject.py
@@ -114,6 +114,31 @@
return w_item
+class W_StringIterObject(W_AbstractSeqIterObject):
+ """Sequence iterator specialized for string-like objects, used
+ for bytes.__iter__() or str.__iter__() or bytearray.__iter__().
+ Needed because otherwise these methods would call the possibly
+ overridden __getitem__() method, which they must not.
+ """
+ def __init__(self, w_seq, getitem_fn):
+ W_AbstractSeqIterObject.__init__(self, w_seq)
+ self.getitem_fn = getitem_fn
+
+ def descr_next(self, space):
+ if self.w_seq is None:
+ raise OperationError(space.w_StopIteration, space.w_None)
+ index = self.index
+ try:
+ w_item = self.getitem_fn(self.w_seq, space, index)
+ except OperationError as e:
+ self.w_seq = None
+ if not e.match(space, space.w_IndexError):
+ raise
+ raise OperationError(space.w_StopIteration, space.w_None)
+ self.index = index + 1
+ return w_item
+
+
class W_ReverseSeqIterObject(W_Root):
def __init__(self, space, w_seq, index=-1):
self.w_seq = w_seq
diff --git a/pypy/objspace/std/stringmethods.py
b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -75,7 +75,8 @@
return space.wrap(self._len())
def descr_iter(self, space):
- return space.newseqiter(self)
+ from pypy.objspace.std.iterobject import W_StringIterObject
+ return W_StringIterObject(self, self.__class__._getitem_result)
def descr_contains(self, space, w_sub):
value = self._val(space)
@@ -133,14 +134,15 @@
return self._getitem_result(space, index)
def _getitem_result(self, space, index):
+ # Returns the result of 'self[index]', where index is an unwrapped int.
+ # Used by descr_getitem() and by descr_iter().
selfvalue = self._val(space)
try:
character = selfvalue[index]
except IndexError:
raise oefmt(space.w_IndexError, "string index out of range")
from pypy.objspace.std.bytesobject import W_BytesObject
- from pypy.objspace.std.bytearrayobject import W_BytearrayObject
- if isinstance(self, W_BytesObject) or isinstance(self,
W_BytearrayObject):
+ if isinstance(self, W_BytesObject):
return space.wrap(ord(character))
return self._new(character)
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
@@ -432,7 +432,7 @@
class AppTestListObject(object):
- spaceconfig = {"objspace.std.withliststrategies": True} # it's the default
+ #spaceconfig = {"objspace.std.withliststrategies": True} # it's the
default
def setup_class(cls):
import platform
@@ -1524,6 +1524,16 @@
def __iter__(self):
yield "ok"
assert list(U("don't see me")) == ["ok"]
+ #
+ class S(bytes):
+ def __getitem__(self, index):
+ never_called
+ assert list(S(b"abc")) == list(b"abc") # __getitem__ ignored
+ #
+ class U(str):
+ def __getitem__(self, index):
+ never_called
+ assert list(U("abc")) == list("abc") # __getitem__ ignored
def test_extend_from_nonempty_list_with_subclasses(self):
l = ["hi!"]
@@ -1549,6 +1559,20 @@
l.extend(U("don't see me"))
#
assert l == ["hi!", "okT", "okL", "okL", "okS", "okU"]
+ #
+ class S(bytes):
+ def __getitem__(self, index):
+ never_called
+ l = []
+ l.extend(S(b"abc"))
+ assert l == list(b"abc") # __getitem__ ignored
+ #
+ class U(str):
+ def __getitem__(self, index):
+ never_called
+ l = []
+ l.extend(U("abc"))
+ assert l == list("abc") # __getitem__ ignored
def test_issue1266(self):
l = list(range(1))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit