def descr_buffer__new__(space, w_subtype, w_object, offset=0, size=-1): # w_subtype can only be exactly 'buffer' for now if not space.is_w(w_subtype, space.gettypefor(Buffer)): raise OperationError(space.w_TypeError, space.wrap("argument 1 must be 'buffer'")) 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) from rpython.rlib.rstruct.unichar import pack_unichar, UNICODE_SIZE unistr = space.unicode_w(w_object) builder = StringBuilder(len(unistr) * UNICODE_SIZE) for unich in unistr: pack_unichar(unich, builder) from pypy.interpreter.buffer import StringBuffer w_buffer = space.wrap(StringBuffer(builder.build())) else: w_buffer = space.buffer(w_object) buffer = space.interp_w(Buffer, w_buffer) # type-check if offset == 0 and size == -1: return w_buffer # handle buffer slices if offset < 0: raise OperationError(space.w_ValueError, space.wrap("offset must be zero or positive")) if size < -1: raise OperationError(space.w_ValueError, space.wrap("size must be zero or positive")) if isinstance(buffer, RWBuffer): buffer = RWSubBuffer(buffer, offset, size) else: buffer = SubBuffer(buffer, offset, size) return space.wrap(buffer)
def pack_unichar(fmtiter): unistr = fmtiter.accept_unicode_arg() if len(unistr) != 1: raise StructError("expected a unicode string of length 1") c = unistr[0] # string->char conversion for the annotator unichar.pack_unichar(c, fmtiter.wbuf, fmtiter.pos) fmtiter.advance(unichar.UNICODE_SIZE)
def readbuf_w(self, space): from rpython.rlib.rstruct.unichar import pack_unichar, UNICODE_SIZE builder = StringBuilder(len(self._value) * UNICODE_SIZE) for unich in self._value: pack_unichar(unich, builder) return StringBuffer(builder.build())
def readbuf_w(self, space): from rpython.rlib.rstruct.unichar import pack_unichar, UNICODE_SIZE buf = MutableStringBuffer(len(self._value) * UNICODE_SIZE) pos = 0 for unich in self._value: pack_unichar(unich, buf, pos) pos += UNICODE_SIZE return StringBuffer(buf.finish())
def pack_unichar(fmtiter): unistr = fmtiter.accept_unicode_arg() if len(unistr) != 1: raise StructError("expected a unicode string of length 1") c = unistr[0] # string->char conversion for the annotator unichar.pack_unichar(c, fmtiter.result)