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)
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
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)
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)
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)
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')
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)
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
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
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
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))