def write_v(self, cdata, w_ob, optvarsize): # a special case for var-sized C99 arrays from pypy.module._cffi_backend import ctypearray ct = self.ctype if isinstance(ct, ctypearray.W_CTypeArray) and ct.length < 0: space = ct.space w_ob, varsizelength = misc.get_new_array_length(space, w_ob) if optvarsize != -1: # in this mode, the only purpose of this function is to compute # the real size of the structure from a var-sized C99 array assert cdata == lltype.nullptr(rffi.CCHARP.TO) itemsize = ct.ctitem.size try: varsize = ovfcheck(itemsize * varsizelength) size = ovfcheck(self.offset + varsize) except OverflowError: raise OperationError( space.w_OverflowError, space.wrap("array size would overflow a ssize_t")) assert size >= 0 return max(size, optvarsize) # if 'value' was only an integer, get_new_array_length() returns # w_ob = space.w_None. Detect if this was the case, # and if so, stop here, leaving the content uninitialized # (it should be zero-initialized from somewhere else). if space.is_w(w_ob, space.w_None): return optvarsize # if optvarsize == -1: self.write(cdata, w_ob) return optvarsize
def write_v(self, cdata, w_ob, optvarsize): # a special case for var-sized C99 arrays from pypy.module._cffi_backend import ctypearray ct = self.ctype if isinstance(ct, ctypearray.W_CTypeArray) and ct.length < 0: space = ct.space w_ob, varsizelength = misc.get_new_array_length(space, w_ob) if optvarsize != -1: # in this mode, the only purpose of this function is to compute # the real size of the structure from a var-sized C99 array assert cdata == lltype.nullptr(rffi.CCHARP.TO) itemsize = ct.ctitem.size try: varsize = ovfcheck(itemsize * varsizelength) size = ovfcheck(self.offset + varsize) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("array size would overflow a ssize_t")) assert size >= 0 return max(size, optvarsize) # if 'value' was only an integer, get_new_array_length() returns # w_ob = space.w_None. Detect if this was the case, # and if so, stop here, leaving the content uninitialized # (it should be zero-initialized from somewhere else). if space.is_w(w_ob, space.w_None): return optvarsize # if optvarsize == -1: self.write(cdata, w_ob) return optvarsize
def newp(self, w_init, allocator): space = self.space datasize = self.size # if datasize < 0: from pypy.module._cffi_backend import misc w_init, length = misc.get_new_array_length(space, w_init) try: datasize = ovfcheck(length * self.ctitem.size) except OverflowError: raise oefmt(space.w_OverflowError, "array size would overflow a ssize_t") else: length = self.length # cdata = allocator.allocate(space, datasize, self, length) # if not space.is_w(w_init, space.w_None): with cdata as ptr: self.convert_from_object(ptr, w_init) return cdata
def newp(self, w_init, allocator): space = self.space datasize = self.size # if datasize < 0: from pypy.module._cffi_backend import misc w_init, length = misc.get_new_array_length(space, w_init) try: datasize = ovfcheck(length * self.ctitem.size) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("array size would overflow a ssize_t")) else: length = self.length # cdata = allocator.allocate(space, datasize, self, length) # if not space.is_w(w_init, space.w_None): with cdata as ptr: self.convert_from_object(ptr, w_init) return cdata
def newp(self, w_init): space = self.space datasize = self.size # if datasize < 0: from pypy.module._cffi_backend import misc w_init, length = misc.get_new_array_length(space, w_init) try: datasize = ovfcheck(length * self.ctitem.size) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("array size would overflow a ssize_t")) # cdata = cdataobj.W_CDataNewOwningLength(space, datasize, self, length) # else: cdata = cdataobj.W_CDataNewOwning(space, datasize, self) # if not space.is_w(w_init, space.w_None): with cdata as ptr: self.convert_from_object(ptr, w_init) return cdata
def newp(self, w_init): space = self.space datasize = self.size # if datasize < 0: from pypy.module._cffi_backend import misc w_init, length = misc.get_new_array_length(space, w_init) try: datasize = ovfcheck(length * self.ctitem.size) except OverflowError: raise OperationError( space.w_OverflowError, space.wrap("array size would overflow a ssize_t")) # cdata = cdataobj.W_CDataNewOwningLength(space, datasize, self, length) # else: cdata = cdataobj.W_CDataNewOwning(space, datasize, self) # if not space.is_w(w_init, space.w_None): self.convert_from_object(cdata._cdata, w_init) keepalive_until_here(cdata) return cdata