Author: Philip Jenvey <pjen...@underboss.org>
Branch: py3k
Changeset: r70069:fb381945ef16
Date: 2014-03-18 15:23 -0700
http://bitbucket.org/pypy/pypy/changeset/fb381945ef16/

Log:    merge default

diff --git a/lib-python/2.7/test/test_memoryview.py 
b/lib-python/2.7/test/test_memoryview.py
--- a/lib-python/2.7/test/test_memoryview.py
+++ b/lib-python/2.7/test/test_memoryview.py
@@ -171,7 +171,7 @@
                 # very inconsisten on CPython. In PyPy, memoryview supports
                 # the buffer interface, and thus the following comparison
                 # succeeds. See also the comment in
-                # 
pypy.modules.__builtin__.interp_memoryview.W_MemoryView.descr_buffer
+                # pypy.objspace.std.memoryview.W_MemoryView.descr_buffer
                 #
                 # Comparison with objects which don't support the buffer API
                 self.assertFalse(m == u"abcdef", "%s %s" % (self, tp))
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -194,11 +194,6 @@
         return None
 
     def buffer_w(self, space):
-        w_impl = space.lookup(self, '__buffer__')
-        if w_impl is not None:
-            w_result = space.get_and_call_function(w_impl, self)
-            if space.isinstance_w(w_result, space.w_buffer):
-                return w_result.buf
         self._typed_unwrap_error(space, "buffer")
 
     def bytes_w(self, space):
diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -7,8 +7,7 @@
 
 class Buffer(object):
     """Abstract base class for buffers."""
-
-    __slots__ = ()     # no extra slot here
+    __slots__ = []
 
     def getlength(self):
         raise NotImplementedError
@@ -29,14 +28,13 @@
     def get_raw_address(self):
         raise ValueError("no raw buffer")
 
-
     def is_writable(self):
         return False
 
+
 class RWBuffer(Buffer):
     """Abstract base class for read-write buffers."""
-
-    __slots__ = ()     # no extra slot here
+    __slots__ = []
 
     def is_writable(self):
         return True
@@ -51,10 +49,8 @@
             self.setitem(start + i, string[i])
 
 
-
-# ____________________________________________________________
-
 class StringBuffer(Buffer):
+    __slots__ = ['value']
 
     def __init__(self, value):
         self.value = value
@@ -76,48 +72,11 @@
             return self.value[start:stop]
         return "".join([self.value[start + i*step] for i in xrange(size)])
 
-
-class StringLikeBuffer(Buffer):
-    """For app-level objects that already have a string-like interface
-    with __len__ and a __getitem__ that returns characters or (with
-    slicing) substrings."""
-    # XXX this is inefficient, it should only be used temporarily
-
-    def __init__(self, space, w_obj):
-        self.space = space
-        self.w_obj = w_obj
-
-    def getlength(self):
-        space = self.space
-        return space.len_w(self.w_obj)
-
-    def getitem(self, index):
-        space = self.space
-        w_value = space.getitem(self.w_obj, space.wrap(index))
-        try:
-            return chr(space.int_w(w_value))
-        except OperationError as e:
-            if not e.match(space, space.w_TypeError):
-                raise
-        s = space.bytes_w(w_value)
-        if len(s) != 1:
-            raise OperationError(space.w_ValueError,
-                                 space.wrap("single byte expected, got 
string"))
-        char = s[0]   # annotator hint
-        return char
-
-    def getslice(self, start, stop, step, size):
-        space = self.space
-        if step != 1:
-            raise OperationError(space.w_ValueError, space.wrap(
-                "buffer object does not support slicing with a step"))
-        s = space.str_w(space.getslice(self.w_obj, space.wrap(start),
-                                                   space.wrap(stop)))
-        return s
-
 # ____________________________________________________________
 
 class SubBufferMixin(object):
+    _attrs_ = ['buffer', 'offset', 'size']
+
     def __init__(self, buffer, offset, size):
         self.buffer = buffer
         self.offset = offset
@@ -141,9 +100,11 @@
                           # out of bounds
         return self.buffer.getslice(self.offset + start, self.offset + stop, 
step, size)
 
+
 class SubBuffer(Buffer):
     import_from_mixin(SubBufferMixin)
 
+
 class RWSubBuffer(RWBuffer):
     import_from_mixin(SubBufferMixin)
 
diff --git a/pypy/interpreter/test/test_buffer.py 
b/pypy/interpreter/test/test_buffer.py
--- a/pypy/interpreter/test/test_buffer.py
+++ b/pypy/interpreter/test/test_buffer.py
@@ -1,12 +1,10 @@
 import py
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
 from rpython.tool.udir import udir
 
 testdir = udir.ensure('test_buffer', dir=1)
 
 
 class TestBuffer:
-
     def test_buffer_w(self):
         space = self.space
         w_hello = space.wrapbytes('hello world')
@@ -14,9 +12,9 @@
         assert buf.getlength() == 11
         assert buf.as_str() == 'hello world'
         assert buf.getslice(1, 6, 1, 5) == 'ello '
-        assert space.buffer_w(W_Buffer(buf)) is buf
+        assert space.buffer_w(space.newbuffer(buf)) is buf
         assert space.bufferstr_w(w_hello) == 'hello world'
-        assert space.bufferstr_w(W_Buffer(space.buffer_w(w_hello))) == 'hello 
world'
+        assert space.bufferstr_w(space.newbuffer(space.buffer_w(w_hello))) == 
'hello world'
         space.raises_w(space.w_TypeError, space.buffer_w, space.wrap(5))
         e = space.raises_w(space.w_TypeError, space.buffer, space.wrap(5))
         message = space.unwrap(e.value.get_w_value(space))
@@ -24,7 +22,7 @@
 
     def test_file_write(self):
         space = self.space
-        w_buffer = W_Buffer(space.buffer_w(space.wrapbytes('hello world')))
+        w_buffer = space.newbuffer(space.buffer_w(space.wrapbytes('hello 
world')))
         filename = str(testdir.join('test_file_write'))
         space.appexec([w_buffer, space.wrap(filename)], """(buffer, filename):
             f = open(filename, 'wb')
@@ -36,4 +34,4 @@
         f.close()
         assert data == 'hello world'
 
-# Note: some app-level tests for buffer are in module/__builtin__/test/.
+# Note: some app-level tests for buffer are in 
objspace/std/test/test_memoryview.py.
diff --git a/pypy/module/__builtin__/__init__.py 
b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -29,14 +29,10 @@
 
     interpleveldefs = {
         # constants
+        '__debug__'     : '(space.w_True)',      # XXX
         'None'          : '(space.w_None)',
         'False'         : '(space.w_False)',
         'True'          : '(space.w_True)',
-        '__debug__'     : '(space.w_True)',      # XXX
-        'type'          : '(space.w_type)',
-        'object'        : '(space.w_object)',
-        'memoryview'    : 'interp_memoryview.W_MemoryView',
-
         'open'          : 'state.get(space).w_open',
 
         # interp-level function definitions
diff --git a/pypy/module/__builtin__/test/test_buffer.py 
b/pypy/module/__builtin__/test/test_buffer.py
deleted file mode 100644
--- a/pypy/module/__builtin__/test/test_buffer.py
+++ /dev/null
@@ -1,122 +0,0 @@
-"""Tests some behaviour of the buffer type that is not tested in
-lib-python/2.5.2/test/test_types.py where the stdlib buffer tests live."""
-
-class AppTestMemoryView:
-    spaceconfig = dict(usemodules=['array'])
-
-    def test_basic(self):
-        v = memoryview(b"abc")
-        assert v.tobytes() == b"abc"
-        assert len(v) == 3
-        assert v[0] == b'a'
-        assert list(v) == [b'a', b'b', b'c']
-        assert v.tolist() == [97, 98, 99]
-        assert v[1] == b"b"
-        assert v[-1] == b"c"
-        raises(TypeError, "v[1] = 'x'")
-        assert v.readonly is True
-        w = v[1:234]
-        assert isinstance(w, memoryview)
-        assert len(w) == 2
-
-    def test_array_buffer(self):
-        import array
-        b = memoryview(array.array("B", [1, 2, 3]))
-        assert len(b) == 3
-        assert b[0:3] == b"\x01\x02\x03"
-
-    def test_nonzero(self):
-        assert memoryview(b'\x00')
-        assert not memoryview(b'')
-        import array
-        assert memoryview(array.array("B", [0]))
-        assert not memoryview(array.array("B", []))
-
-    def test_bytes(self):
-        assert bytes(memoryview(b'hello')) == b'hello'
-
-    def test_repr(self):
-        assert repr(memoryview(b'hello')).startswith('<memory at 0x')
-
-    def test_compare(self):
-        assert memoryview(b"abc") == bytearray(b"abc")
-        assert memoryview(b"abc") != 3
-        assert memoryview(b'ab') == b'ab'
-        assert b'ab' == memoryview(b'ab')
-        assert not (memoryview(b'ab') != b'ab')
-        assert memoryview(b'ab') == memoryview(b'ab')
-        assert not (memoryview(b'ab') != memoryview(b'ab'))
-        assert memoryview(b'ab') != memoryview(b'abc')
-        raises(TypeError, "memoryview(b'ab') <  memoryview(b'ab')")
-        raises(TypeError, "memoryview(b'ab') <= memoryview(b'ab')")
-        raises(TypeError, "memoryview(b'ab') >  memoryview(b'ab')")
-        raises(TypeError, "memoryview(b'ab') >= memoryview(b'ab')")
-        raises(TypeError, "memoryview(b'ab') <  memoryview(b'abc')")
-        raises(TypeError, "memoryview(b'ab') <= memoryview(b'ab')")
-        raises(TypeError, "memoryview(b'ab') >  memoryview(b'aa')")
-        raises(TypeError, "memoryview(b'ab') >= memoryview(b'ab')")
-
-    def test_hash(self):
-        raises(TypeError, "hash(memoryview(b'hello'))")
-
-    def test_getitem_only_ints(self):
-        class MyInt(object):
-          def __init__(self, x):
-            self.x = x
-
-          def __int__(self):
-            return self.x
-
-        buf = memoryview(b'hello world')
-        raises(TypeError, "buf[MyInt(0)]")
-        raises(TypeError, "buf[MyInt(0):MyInt(5)]")
-
-    def test_rw(self):
-        data = bytearray(b'abcefg')
-        v = memoryview(data)
-        assert v.readonly is False
-        v[0] = b'z'
-        assert data == bytearray(eval("b'zbcefg'"))
-        v[1:4] = b'123'
-        assert data == bytearray(eval("b'z123fg'"))
-        raises((ValueError, TypeError), "v[2] = 'spam'")
-
-    def test_memoryview_attrs(self):
-        v = memoryview(b"a"*100)
-        assert v.format == "B"
-        assert v.itemsize == 1
-        assert v.shape == (100,)
-        assert v.ndim == 1
-        assert v.strides == (1,)
-
-    def test_suboffsets(self):
-        v = memoryview(b"a"*100)
-        assert v.suboffsets == None
-
-    def test_release(self):
-        v = memoryview(b"a"*100)
-        v.release()
-        raises(ValueError, len, v)
-        raises(ValueError, v.tolist)
-        raises(ValueError, v.tobytes)
-        raises(ValueError, "v[0]")
-        raises(ValueError, "v[0] = b'a'")
-        raises(ValueError, "v.format")
-        raises(ValueError, "v.itemsize")
-        raises(ValueError, "v.ndim")
-        raises(ValueError, "v.readonly")
-        raises(ValueError, "v.shape")
-        raises(ValueError, "v.strides")
-        raises(ValueError, "v.suboffsets")
-        raises(ValueError, "with v as cm: pass")
-        raises(ValueError, "memoryview(v)")
-        assert v == v
-        assert v != memoryview(b"a"*100)
-        assert v != b"a"*100
-        assert "released memory" in repr(v)
-
-    def test_context_manager(self):
-        v = memoryview(b"a"*100)
-        with v as cm:
-            assert cm is v
-        assert "released memory" in repr(v)
diff --git a/pypy/module/__builtin__/test/test_builtin.py 
b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -25,6 +25,17 @@
         else:
             cls.w_safe_runtimerror = cls.space.wrap(sys.version_info < (2, 6))
 
+    def test_builtin_names(self):
+        import __builtin__
+        assert __builtin__.None is None
+        assert __builtin__.False is False
+        assert __builtin__.True is True
+
+        assert __builtin__.buffer is buffer
+        assert __builtin__.bytes is str
+        assert __builtin__.dict is dict
+        assert __builtin__.memoryview is memoryview
+
     def test_bytes_alias(self):
         assert bytes is not str
         assert isinstance(eval("b'hi'"), bytes)
diff --git a/pypy/module/__pypy__/bytebuffer.py 
b/pypy/module/__pypy__/bytebuffer.py
--- a/pypy/module/__pypy__/bytebuffer.py
+++ b/pypy/module/__pypy__/bytebuffer.py
@@ -4,11 +4,9 @@
 
 from pypy.interpreter.buffer import RWBuffer
 from pypy.interpreter.gateway import unwrap_spec
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
 
 
 class ByteBuffer(RWBuffer):
-
     def __init__(self, len):
         self.data = ['\x00'] * len
 
@@ -24,4 +22,4 @@
 
 @unwrap_spec(length=int)
 def bytebuffer(space, length):
-    return W_Buffer(ByteBuffer(length))
+    return space.newbuffer(ByteBuffer(length))
diff --git a/pypy/module/_cffi_backend/cbuffer.py 
b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -4,7 +4,7 @@
 from pypy.interpreter.gateway import unwrap_spec, interp2app
 from pypy.interpreter.typedef import TypeDef, make_weakref_descr
 from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
+from pypy.objspace.std.memoryview import W_Buffer
 
 from rpython.rtyper.annlowlevel import llstr
 from rpython.rtyper.lltypesystem import rffi
diff --git a/pypy/module/_io/interp_bufferedio.py 
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -5,7 +5,6 @@
     TypeDef, GetSetProperty, generic_new_descr, interp_attrproperty_w)
 from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
 from pypy.interpreter.buffer import RWBuffer
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
 from rpython.rlib.rstring import StringBuilder
 from rpython.rlib.rarithmetic import r_longlong, intmask
 from rpython.rlib import rposix
@@ -522,7 +521,7 @@
 
     def _raw_read(self, space, buffer, start, length):
         length = intmask(length)
-        w_buf = W_Buffer(RawBuffer(buffer, start, length))
+        w_buf = space.newbuffer(RawBuffer(buffer, start, length))
         while True:
             try:
                 w_size = space.call_method(self.w_raw, "readinto", w_buf)
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -22,9 +22,9 @@
 from pypy.interpreter.nestedscope import Cell
 from pypy.interpreter.module import Module
 from pypy.interpreter.function import StaticMethod
+from pypy.objspace.std.memoryview import W_MemoryView
 from pypy.objspace.std.sliceobject import W_SliceObject
 from pypy.module.__builtin__.descriptor import W_Property
-from pypy.module.__builtin__.interp_memoryview import W_MemoryView
 from pypy.module.micronumpy.base import W_NDimArray
 from rpython.rlib.entrypoint import entrypoint_lowlevel
 from rpython.rlib.rposix import is_valid_fd, validate_fd
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -14,7 +14,6 @@
 from pypy.module.cpyext.pyobject import from_ref
 from pypy.module.cpyext.pyerrors import PyErr_Occurred
 from pypy.module.cpyext.state import State
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.buffer import Buffer
 from pypy.interpreter.argument import Arguments
@@ -250,7 +249,7 @@
         ret = generic_cpy_call(space, func_target, w_self, view, flags)
         if rffi.cast(lltype.Signed, ret) == -1:
             space.fromcache(State).check_and_raise_exception(always=True)
-        return W_Buffer(CPyBuffer(view.c_buf, view.c_len, w_self))
+        return space.newbuffer(CPyBuffer(view.c_buf, view.c_len, w_self))
 
 def get_richcmp_func(OP_CONST):
     def inner(space, w_self, w_args, func):
diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -7,7 +7,6 @@
 from rpython.rlib.rawstorage import RAW_STORAGE_PTR
 from rpython.rtyper.lltypesystem import rffi
 from rpython.tool.sourcetools import func_with_new_name
-from pypy.module.__builtin__.interp_memoryview import W_Buffer
 from pypy.module.micronumpy import descriptor, ufuncs, boxes, arrayops, loop, \
     support, constants as NPY
 from pypy.module.micronumpy.appbridge import get_appbridge_cache
@@ -607,7 +606,7 @@
         return self.implementation.get_buffer(space)
 
     def descr_get_data(self, space):
-        return W_Buffer(self.buffer_w(space))
+        return space.newbuffer(self.buffer_w(space))
 
     @unwrap_spec(offset=int, axis1=int, axis2=int)
     def descr_diagonal(self, space, offset=0, axis1=0, axis2=1):
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -175,6 +175,9 @@
     def newseqiter(self, x):
         return w_some_obj()
 
+    def newbuffer(self, x):
+        return w_some_obj()
+
     def marshal_w(self, w_obj):
         "NOT_RPYTHON"
         raise NotImplementedError
diff --git a/pypy/module/__builtin__/interp_memoryview.py 
b/pypy/objspace/std/memoryview.py
rename from pypy/module/__builtin__/interp_memoryview.py
rename to pypy/objspace/std/memoryview.py
--- a/pypy/module/__builtin__/interp_memoryview.py
+++ b/pypy/objspace/std/memoryview.py
@@ -37,6 +37,7 @@
     """
 
     def __init__(self, buf):
+        assert isinstance(buf, buffer.Buffer)
         self.buf = buf
 
     def buffer_w(self, space):
@@ -44,7 +45,7 @@
 
     @staticmethod
     @unwrap_spec(offset=int, size=int)
-    def descr_new(space, w_subtype, w_object, offset=0, size=-1):
+    def descr_new_buffer(space, w_subtype, w_object, offset=0, size=-1):
         if space.isinstance_w(w_object, space.w_unicode):
             # unicode objects support the old buffer interface
             # but not the new buffer interface (change in python 2.7)
@@ -145,7 +146,7 @@
 start of the object (or at the specified offset). The slice will
 extend to the end of the target object (or with the specified size).
 """,
-    __new__ = interp2app(W_Buffer.descr_new),
+    __new__ = interp2app(W_Buffer.descr_new_buffer),
     __len__ = interp2app(W_Buffer.descr_len),
     __getitem__ = interp2app(W_Buffer.descr_getitem),
     __setitem__ = interp2app(W_Buffer.descr_setitem),
@@ -171,6 +172,7 @@
     """
 
     def __init__(self, buf):
+        assert isinstance(buf, buffer.Buffer)
         self.buf = buf
 
     def buffer_w(self, space):
@@ -185,9 +187,8 @@
         return self.buf
 
     @staticmethod
-    def descr_new(space, w_subtype, w_object):
-        w_memoryview = W_MemoryView(space.buffer_w(w_object))
-        return w_memoryview
+    def descr_new_memoryview(space, w_subtype, w_object):
+        return W_MemoryView(space.buffer_w(w_object))
 
     def _make_descr__cmp(name):
         def descr__cmp(self, space, w_other):
@@ -328,7 +329,7 @@
     __doc__ = """\
 Create a new memoryview object which references the given object.
 """,
-    __new__ = interp2app(W_MemoryView.descr_new),
+    __new__     = interp2app(W_MemoryView.descr_new_memoryview),
     __eq__      = interp2app(W_MemoryView.descr_eq),
     __getitem__ = interp2app(W_MemoryView.descr_getitem),
     __len__     = interp2app(W_MemoryView.descr_len),
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -61,7 +61,7 @@
         from pypy.objspace.std import unicodeobject
         from pypy.objspace.std import dictproxyobject
         from pypy.objspace.std import proxyobject
-        from pypy.module.__builtin__.interp_memoryview import W_Buffer
+        from pypy.objspace.std.memoryview import W_Buffer, W_MemoryView
         import pypy.objspace.std.default # register a few catch-all 
multimethods
 
         import pypy.objspace.std.marshal_impl # install marshal multimethods
@@ -81,6 +81,7 @@
         self.pythontypes.append(boolobject.W_BoolObject.typedef)
         self.pythontypes.append(longobject.W_LongObject.typedef)
         self.pythontypes.append(W_Buffer.typedef)
+        self.pythontypes.append(W_MemoryView.typedef)
 
         # the set of implementation types
         self.typeorder = {
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -25,6 +25,7 @@
 from pypy.objspace.std.iterobject import W_AbstractSeqIterObject
 from pypy.objspace.std.listobject import W_ListObject
 from pypy.objspace.std.longobject import W_LongObject, newlong
+from pypy.objspace.std.memoryview import W_Buffer
 from pypy.objspace.std.noneobject import W_NoneObject
 from pypy.objspace.std.objectobject import W_ObjectObject
 from pypy.objspace.std.iterobject import W_SeqIterObject
@@ -339,6 +340,9 @@
     def newseqiter(self, w_obj):
         return W_SeqIterObject(w_obj)
 
+    def newbuffer(self, w_obj):
+        return W_Buffer(w_obj)
+
     def type(self, w_obj):
         jit.promote(w_obj.__class__)
         return w_obj.getclass(self)
diff --git a/pypy/objspace/std/test/test_memoryview.py 
b/pypy/objspace/std/test/test_memoryview.py
new file mode 100644
--- /dev/null
+++ b/pypy/objspace/std/test/test_memoryview.py
@@ -0,0 +1,119 @@
+class AppTestMemoryView:
+    spaceconfig = dict(usemodules=['array'])
+
+    def test_basic(self):
+        v = memoryview(b"abc")
+        assert v.tobytes() == b"abc"
+        assert len(v) == 3
+        assert v[0] == b'a'
+        assert list(v) == [b'a', b'b', b'c']
+        assert v.tolist() == [97, 98, 99]
+        assert v[1] == b"b"
+        assert v[-1] == b"c"
+        raises(TypeError, "v[1] = 'x'")
+        assert v.readonly is True
+        w = v[1:234]
+        assert isinstance(w, memoryview)
+        assert len(w) == 2
+
+    def test_array_buffer(self):
+        import array
+        b = memoryview(array.array("B", [1, 2, 3]))
+        assert len(b) == 3
+        assert b[0:3] == b"\x01\x02\x03"
+
+    def test_nonzero(self):
+        assert memoryview(b'\x00')
+        assert not memoryview(b'')
+        import array
+        assert memoryview(array.array("B", [0]))
+        assert not memoryview(array.array("B", []))
+
+    def test_bytes(self):
+        assert bytes(memoryview(b'hello')) == b'hello'
+
+    def test_repr(self):
+        assert repr(memoryview(b'hello')).startswith('<memory at 0x')
+
+    def test_compare(self):
+        assert memoryview(b"abc") == bytearray(b"abc")
+        assert memoryview(b"abc") != 3
+        assert memoryview(b'ab') == b'ab'
+        assert b'ab' == memoryview(b'ab')
+        assert not (memoryview(b'ab') != b'ab')
+        assert memoryview(b'ab') == memoryview(b'ab')
+        assert not (memoryview(b'ab') != memoryview(b'ab'))
+        assert memoryview(b'ab') != memoryview(b'abc')
+        raises(TypeError, "memoryview(b'ab') <  memoryview(b'ab')")
+        raises(TypeError, "memoryview(b'ab') <= memoryview(b'ab')")
+        raises(TypeError, "memoryview(b'ab') >  memoryview(b'ab')")
+        raises(TypeError, "memoryview(b'ab') >= memoryview(b'ab')")
+        raises(TypeError, "memoryview(b'ab') <  memoryview(b'abc')")
+        raises(TypeError, "memoryview(b'ab') <= memoryview(b'ab')")
+        raises(TypeError, "memoryview(b'ab') >  memoryview(b'aa')")
+        raises(TypeError, "memoryview(b'ab') >= memoryview(b'ab')")
+
+    def test_hash(self):
+        raises(TypeError, "hash(memoryview(b'hello'))")
+
+    def test_getitem_only_ints(self):
+        class MyInt(object):
+          def __init__(self, x):
+            self.x = x
+
+          def __int__(self):
+            return self.x
+
+        buf = memoryview(b'hello world')
+        raises(TypeError, "buf[MyInt(0)]")
+        raises(TypeError, "buf[MyInt(0):MyInt(5)]")
+
+    def test_rw(self):
+        data = bytearray(b'abcefg')
+        v = memoryview(data)
+        assert v.readonly is False
+        v[0] = b'z'
+        assert data == bytearray(eval("b'zbcefg'"))
+        v[1:4] = b'123'
+        assert data == bytearray(eval("b'z123fg'"))
+        raises((ValueError, TypeError), "v[2] = 'spam'")
+
+    def test_memoryview_attrs(self):
+        v = memoryview(b"a"*100)
+        assert v.format == "B"
+        assert v.itemsize == 1
+        assert v.shape == (100,)
+        assert v.ndim == 1
+        assert v.strides == (1,)
+
+    def test_suboffsets(self):
+        v = memoryview(b"a"*100)
+        assert v.suboffsets == None
+
+    def test_release(self):
+        v = memoryview(b"a"*100)
+        v.release()
+        raises(ValueError, len, v)
+        raises(ValueError, v.tolist)
+        raises(ValueError, v.tobytes)
+        raises(ValueError, "v[0]")
+        raises(ValueError, "v[0] = b'a'")
+        raises(ValueError, "v.format")
+        raises(ValueError, "v.itemsize")
+        raises(ValueError, "v.ndim")
+        raises(ValueError, "v.readonly")
+        raises(ValueError, "v.shape")
+        raises(ValueError, "v.strides")
+        raises(ValueError, "v.suboffsets")
+        raises(ValueError, "with v as cm: pass")
+        raises(ValueError, "memoryview(v)")
+        assert v == v
+        assert v != memoryview(b"a"*100)
+        assert v != b"a"*100
+        assert "released memory" in repr(v)
+
+    def test_context_manager(self):
+        v = memoryview(b"a"*100)
+        with v as cm:
+            assert cm is v
+        assert "released memory" in repr(v)
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -169,6 +169,7 @@
         cfile = udir.join('dosmaperr.c')
         cfile.write(r'''
                 #include <errno.h>
+                #include <WinError.h>
                 #include  <stdio.h>
                 #ifdef __GNUC__
                 #define _dosmaperr mingw_dosmaperr
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to