Esempio n. 1
0
    def allocate(cls, context, builder, list_type, nitems):
        intp_t = context.get_value_type(types.intp)

        if isinstance(nitems, int):
            nitems = ir.Constant(intp_t, nitems)

        payload_type = context.get_data_type(types.ListPayload(list_type))
        payload_size = context.get_abi_sizeof(payload_type)

        itemsize = get_itemsize(context, list_type)
        
        # Total allocation size = <payload header size> + nitems * itemsize
        allocsize, ovf = cgutils.muladd_with_overflow(builder, nitems,
                                                      ir.Constant(intp_t, itemsize),
                                                      ir.Constant(intp_t, payload_size))
        with builder.if_then(ovf, likely=False):
            context.call_conv.return_user_exc(builder, MemoryError,
                                              ("cannot allocate list",))

        meminfo = context.nrt_meminfo_varsize_alloc(builder, size=allocsize)
        cgutils.guard_memory_error(context, builder, meminfo,
                                   "cannot allocate list")

        self = cls(context, builder, list_type, None)
        self._list.meminfo = meminfo
        self._payload.allocated = nitems
        self._payload.size = ir.Constant(intp_t, 0)  # for safety
        return self
Esempio n. 2
0
    def allocate(cls, context, builder, list_type, nitems):
        intp_t = context.get_value_type(types.intp)

        if isinstance(nitems, int):
            nitems = ir.Constant(intp_t, nitems)

        payload_type = context.get_data_type(types.ListPayload(list_type))
        payload_size = context.get_abi_sizeof(payload_type)

        itemsize = get_itemsize(context, list_type)
        
        # Total allocation size = <payload header size> + nitems * itemsize
        allocsize, ovf = cgutils.muladd_with_overflow(builder, nitems,
                                                      ir.Constant(intp_t, itemsize),
                                                      ir.Constant(intp_t, payload_size))
        with builder.if_then(ovf, likely=False):
            context.call_conv.return_user_exc(builder, MemoryError,
                                              ("cannot allocate list",))

        meminfo = context.nrt_meminfo_varsize_alloc(builder, size=allocsize)
        cgutils.guard_memory_error(context, builder, meminfo,
                                   "cannot allocate list")

        self = cls(context, builder, list_type, None)
        self._list.meminfo = meminfo
        self._payload.allocated = nitems
        self._payload.size = ir.Constant(intp_t, 0)  # for safety
        return self
Esempio n. 3
0
        def _payload_realloc(new_allocated):
            payload_type = context.get_data_type(types.ListPayload(self._ty))
            payload_size = context.get_abi_sizeof(payload_type)

            allocsize, ovf = cgutils.muladd_with_overflow(
                builder, new_allocated, ir.Constant(intp_t, itemsize), ir.Constant(intp_t, payload_size)
            )
            with builder.if_then(ovf, likely=False):
                context.call_conv.return_user_exc(builder, MemoryError, ("cannot resize list",))

            ptr = context.nrt_meminfo_varsize_realloc(builder, self._list.meminfo, size=allocsize)
            cgutils.guard_memory_error(context, builder, ptr, "cannot resize list")
            self._payload.allocated = new_allocated
Esempio n. 4
0
        def _payload_realloc(new_allocated):
            payload_type = context.get_data_type(types.ListPayload(self._ty))
            payload_size = context.get_abi_sizeof(payload_type)

            allocsize, ovf = cgutils.muladd_with_overflow(
                builder, new_allocated,
                ir.Constant(intp_t, itemsize),
                ir.Constant(intp_t, payload_size))
            with builder.if_then(ovf, likely=False):
                context.call_conv.return_user_exc(builder, MemoryError,
                                                  ("cannot resize list",))

            ptr = context.nrt_meminfo_varsize_realloc(builder, self._list.meminfo,
                                                      size=allocsize)
            cgutils.guard_memory_error(context, builder, ptr,
                                       "cannot resize list")
            self._payload.allocated = new_allocated