Ejemplo n.º 1
0
 def __init__(self, dmm, fe_type):
     payload_type = types.ListPayload(fe_type)
     members = [
         # The meminfo data points to a ListPayload
         ('meminfo', types.MemInfoPointer(payload_type)),
     ]
     super(ListModel, self).__init__(dmm, fe_type, members)
Ejemplo 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
Ejemplo n.º 3
0
def get_list_payload(context, builder, list_type, value):
    """
    Given a list value and type, get its payload structure (as a
    reference, so that mutations are seen by all).
    """
    payload_type = context.get_data_type(types.ListPayload(list_type))
    payload = context.nrt_meminfo_data(builder, value.meminfo)
    payload = builder.bitcast(payload, payload_type.as_pointer())
    return make_payload_cls(list_type)(context, builder, ref=payload)
Ejemplo n.º 4
0
 def __init__(self, dmm, fe_type):
     payload_type = types.ListPayload(fe_type.list_type)
     members = [
         # The meminfo data points to a ListPayload (shared with the
         # original list object)
         ('meminfo', types.MemInfoPointer(payload_type)),
         ('index', types.EphemeralPointer(types.intp)),
     ]
     super(ListIterModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 5
0
 def __init__(self, dmm, fe_type):
     payload_type = types.ListPayload(fe_type)
     members = [
         # The meminfo data points to a ListPayload
         ('meminfo', types.MemInfoPointer(payload_type)),
         # This member is only used only for reflected lists
         ('parent', types.pyobject),
     ]
     super(ListModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 6
0
def make_payload_cls(list_type):
    """
    Return the Structure representation of the given *list_type*'s payload
    (an instance of types.List).
    """
    # Note the payload is stored durably in memory, so we consider it
    # data and not value.
    return cgutils.create_struct_proxy(types.ListPayload(list_type),
                                       kind='data')
Ejemplo n.º 7
0
def get_list_payload(context, builder, list_type, value):
    """
    Given a list value and type, get its payload structure (as a
    reference, so that mutations are seen by all).
    """
    payload_type = types.ListPayload(list_type)
    payload = context.nrt.meminfo_data(builder, value.meminfo)
    ptrty = context.get_data_type(payload_type).as_pointer()
    payload = builder.bitcast(payload, ptrty)
    return context.make_data_helper(builder, payload_type, ref=payload)
Ejemplo n.º 8
0
 def __init__(self, context, builder, list_type, payload_ptr):
     self._context = context
     self._builder = builder
     self._ty = list_type
     self._datamodel = context.data_model_manager[list_type.dtype]
     payload_type = types.ListPayload(list_type)
     ptrty = context.get_data_type(payload_type).as_pointer()
     payload_ptr = builder.bitcast(payload_ptr, ptrty)
     payload = context.make_data_helper(builder, payload_type,
                                        ref=payload_ptr)
     self._payload = payload
Ejemplo n.º 9
0
    def allocate_ex(cls, context, builder, list_type, nitems):
        """
        Allocate a ListInstance with its storage.
        Return a (ok, instance) tuple where *ok* is a LLVM boolean and
        *instance* is a ListInstance object (the object's contents are
        only valid when *ok* is true).
        """
        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)
        # Account for the fact that the payload struct contains one entry
        payload_size -= itemsize

        ok = cgutils.alloca_once_value(builder, cgutils.true_bit)
        self = cls(context, builder, list_type, None)

        # 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):
            builder.store(cgutils.false_bit, ok)

        with builder.if_then(builder.load(ok), likely=True):
            meminfo = context.nrt.meminfo_new_varsize_dtor(
                builder, size=allocsize, dtor=self.get_dtor())
            with builder.if_else(cgutils.is_null(builder, meminfo),
                                 likely=False) as (if_error, if_ok):
                with if_error:
                    builder.store(cgutils.false_bit, ok)
                with if_ok:
                    self._list.meminfo = meminfo
                    self._list.parent = context.get_constant_null(
                        types.pyobject)
                    self._payload.allocated = nitems
                    self._payload.size = ir.Constant(intp_t, 0)  # for safety
                    self._payload.dirty = cgutils.false_bit
                    # Zero the allocated region
                    self.zfill(self.size.type(0), nitems)

        return builder.load(ok), self
Ejemplo n.º 10
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
Ejemplo n.º 11
0
def make_payload_cls(list_type):
    """
    Return the Structure representation of the given *list_type*'s payload
    (an instance of types.List).
    """
    return cgutils.create_struct_proxy(types.ListPayload(list_type))