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 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 _fromstring_bin(space, s, count, length, dtype): itemsize = dtype.elsize assert itemsize >= 0 if count == -1: count = length / itemsize if length % itemsize != 0: raise oefmt(space.w_ValueError, "string length %d not divisable by item size %d", length, itemsize) if count * itemsize > length: raise OperationError(space.w_ValueError, space.wrap( "string is smaller than requested size")) a = W_NDimArray.from_shape(space, [count], dtype=dtype) loop.fromstring_loop(space, a, dtype, itemsize, s) return space.wrap(a)
def _fromstring_bin(space, s, count, length, dtype): itemsize = dtype.elsize assert itemsize >= 0 if count == -1: count = length / itemsize if length % itemsize != 0: raise oefmt(space.w_ValueError, "string length %d not divisable by item size %d", length, itemsize) if count * itemsize > length: raise oefmt(space.w_ValueError, "string is smaller than requested size") a = W_NDimArray.from_shape(space, [count], dtype=dtype) loop.fromstring_loop(space, a, dtype, itemsize, s) return a
def _fromstring_bin(space, s, count, length, dtype): itemsize = dtype.itemtype.get_element_size() assert itemsize >= 0 if count == -1: count = length / itemsize if length % itemsize != 0: raise operationerrfmt( space.w_ValueError, "string length %d not divisable by item size %d", length, itemsize) if count * itemsize > length: raise OperationError( space.w_ValueError, space.wrap("string is smaller than requested size")) a = W_NDimArray.from_shape(space, [count], dtype=dtype) loop.fromstring_loop(a, dtype, itemsize, s) return space.wrap(a)