def frombuffer(space, w_buffer, w_dtype=None, count=-1, offset=0): dtype = space.interp_w( descriptor.W_Dtype, space.call_function(space.gettypefor(descriptor.W_Dtype), w_dtype)) if dtype.elsize == 0: raise oefmt(space.w_ValueError, "itemsize cannot be zero in type") try: buf = _getbuffer(space, w_buffer) except OperationError as e: if not e.match(space, space.w_TypeError): raise w_buffer = space.call_method(w_buffer, '__buffer__', space.newint(space.BUF_FULL_RO)) buf = _getbuffer(space, w_buffer) ts = buf.getlength() if offset < 0 or offset > ts: raise oefmt( space.w_ValueError, "offset must be non-negative and no greater than " "buffer length (%d)", ts) s = ts - offset if offset: buf = SubBuffer(buf, offset, s) n = count itemsize = dtype.elsize assert itemsize > 0 if n < 0: if s % itemsize != 0: raise oefmt(space.w_ValueError, "buffer size must be a multiple of element size") n = s / itemsize else: if s < n * itemsize: raise oefmt(space.w_ValueError, "buffer is smaller than requested size") try: storage = buf.get_raw_address() except ValueError: a = W_NDimArray.from_shape(space, [n], dtype=dtype) loop.fromstring_loop(space, a, dtype, itemsize, buf.as_str()) return a else: writable = not buf.readonly return W_NDimArray.from_shape_and_storage(space, [n], storage, storage_bytes=s, dtype=dtype, w_base=w_buffer, writable=writable)
def test_as_str_and_offset_maybe(): buf = StringBuffer('hello world') assert buf.as_str_and_offset_maybe() == ('hello world', 0) # sbuf = SubBuffer(buf, 6, 5) assert sbuf.getslice(0, 5, 1, 5) == 'world' assert sbuf.as_str_and_offset_maybe() == ('hello world', 6) # ssbuf = SubBuffer(sbuf, 3, 2) assert ssbuf.getslice(0, 2, 1, 2) == 'ld' assert ssbuf.as_str_and_offset_maybe() == ('hello world', 9) # ss2buf = SubBuffer(sbuf, 1, -1) assert ss2buf.as_str() == 'orld' assert ss2buf.getlength() == 4 ss3buf = SubBuffer(ss2buf, 1, -1) assert ss3buf.as_str() == 'rld' assert ss3buf.getlength() == 3 # ss4buf = SubBuffer(buf, 3, 4) assert ss4buf.as_str() == 'lo w' ss5buf = SubBuffer(ss4buf, 1, -1) assert ss5buf.as_str() == 'o w' assert ss5buf.getlength() == 3
def frombuffer(space, w_buffer, w_dtype=None, count=-1, offset=0): dtype = space.interp_w(descriptor.W_Dtype, space.call_function(space.gettypefor(descriptor.W_Dtype), w_dtype)) if dtype.elsize == 0: raise oefmt(space.w_ValueError, "itemsize cannot be zero in type") try: buf = _getbuffer(space, w_buffer) except OperationError as e: if not e.match(space, space.w_TypeError): raise w_buffer = space.call_method(w_buffer, '__buffer__', space.newint(space.BUF_FULL_RO)) buf = _getbuffer(space, w_buffer) ts = buf.getlength() if offset < 0 or offset > ts: raise oefmt(space.w_ValueError, "offset must be non-negative and no greater than " "buffer length (%d)", ts) s = ts - offset if offset: buf = SubBuffer(buf, offset, s) n = count itemsize = dtype.elsize assert itemsize > 0 if n < 0: if s % itemsize != 0: raise oefmt(space.w_ValueError, "buffer size must be a multiple of element size") n = s / itemsize else: if s < n * itemsize: raise oefmt(space.w_ValueError, "buffer is smaller than requested size") try: storage = buf.get_raw_address() except ValueError: a = W_NDimArray.from_shape(space, [n], dtype=dtype) loop.fromstring_loop(space, a, dtype, itemsize, buf.as_str()) return a else: writable = not buf.readonly return W_NDimArray.from_shape_and_storage(space, [n], storage, storage_bytes=s, dtype=dtype, w_base=w_buffer, writable=writable)