예제 #1
0
파일: ctypestruct.py 프로젝트: Qointum/pypy
 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
예제 #2
0
파일: ctypestruct.py 프로젝트: bukzor/pypy
 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
예제 #3
0
 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
예제 #4
0
파일: ctypearray.py 프로젝트: xulukai/pypy
 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
예제 #5
0
    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
예제 #6
0
 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