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