Ejemplo n.º 1
0
def box_lsttype(typ, val, c):
    context = c.context
    builder = c.builder

    # XXX deduplicate
    ctor = cgutils.create_struct_proxy(typ)
    lstruct = ctor(context, builder, value=val)
    # Returns the plain MemInfo
    boxed_meminfo = c.box(
        types.MemInfoPointer(types.voidptr),
        lstruct.meminfo,
    )

    modname = c.context.insert_const_string(
        c.builder.module, 'numba.typed.typedlist',
    )
    typedlist_mod = c.pyapi.import_module_noblock(modname)
    fmp_fn = c.pyapi.object_getattr_string(typedlist_mod, '_from_meminfo_ptr')

    lsttype_obj = c.pyapi.unserialize(c.pyapi.serialize_object(typ))

    result_var = builder.alloca(c.pyapi.pyobj)
    builder.store(cgutils.get_null_value(c.pyapi.pyobj), result_var)

    with builder.if_then(cgutils.is_not_null(builder, lsttype_obj)):
        res = c.pyapi.call_function_objargs(
            fmp_fn, (boxed_meminfo, lsttype_obj),
        )
        c.pyapi.decref(fmp_fn)
        c.pyapi.decref(typedlist_mod)
        c.pyapi.decref(boxed_meminfo)
        builder.store(res, result_var)
    return builder.load(result_var)
Ejemplo n.º 2
0
 def __init__(self, dmm, fe_type):
     # ndim = fe_type.ndim
     members = [
         ("data", types.CPointer(fe_type.dtype)),
         ("meminfo", types.MemInfoPointer(fe_type.dtype)),
     ]
     super(ArrayCTypesModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 3
0
def allocator_MyArray(typingctx, allocsize, align):
    def impl(context, builder, sig, args):
        context.nrt._require_nrt()
        size, align = args

        mod = builder.module
        u32 = ir.IntType(32)
        voidptr = cgutils.voidptr_t

        get_alloc_fnty = ir.FunctionType(voidptr, ())
        get_alloc_fn = cgutils.get_or_insert_function(
            mod, get_alloc_fnty, name="_nrt_get_sample_external_allocator")
        ext_alloc = builder.call(get_alloc_fn, ())

        fnty = ir.FunctionType(voidptr, [cgutils.intp_t, u32, voidptr])
        fn = cgutils.get_or_insert_function(
            mod, fnty, name="NRT_MemInfo_alloc_safe_aligned_external")
        fn.return_value.add_attribute("noalias")
        if isinstance(align, builtins.int):
            align = context.get_constant(types.uint32, align)
        else:
            assert align.type == u32, "align must be a uint32"
        call = builder.call(fn, [size, align, ext_alloc])
        call.name = "allocate_MyArray"
        return call

    mip = types.MemInfoPointer(types.voidptr)  # return untyped pointer
    sig = typing.signature(mip, allocsize, align)
    return sig, impl
Ejemplo n.º 4
0
def unbox_listtype(typ, val, c):
    context = c.context
    builder = c.builder

    miptr = c.pyapi.object_getattr_string(val, '_opaque')

    native = c.unbox(types.MemInfoPointer(types.voidptr), miptr)

    mi = native.value
    ctor = cgutils.create_struct_proxy(typ)
    lstruct = ctor(context, builder)

    data_pointer = context.nrt.meminfo_data(builder, mi)
    data_pointer = builder.bitcast(
        data_pointer,
        listobject.ll_list_type.as_pointer(),
    )

    lstruct.data = builder.load(data_pointer)
    lstruct.meminfo = mi

    lstobj = lstruct._getvalue()
    c.pyapi.decref(miptr)

    return NativeValue(lstobj)
Ejemplo n.º 5
0
def box_dicttype(typ, val, c):
    context = c.context
    builder = c.builder

    # XXX deduplicate
    ctor = cgutils.create_struct_proxy(typ)
    dstruct = ctor(context, builder, value=val)
    # Returns the plain MemInfo
    boxed_meminfo = c.box(
        types.MemInfoPointer(types.voidptr),
        dstruct.meminfo,
    )

    modname = c.context.insert_const_string(
        c.builder.module,
        'numba.typed.typeddict',
    )
    typeddict_mod = c.pyapi.import_module_noblock(modname)
    fmp_fn = c.pyapi.object_getattr_string(typeddict_mod, '_from_meminfo_ptr')

    dicttype_obj = c.pyapi.unserialize(c.pyapi.serialize_object(typ))

    res = c.pyapi.call_function_objargs(fmp_fn, (boxed_meminfo, dicttype_obj))
    c.pyapi.decref(fmp_fn)
    c.pyapi.decref(typeddict_mod)
    c.pyapi.decref(boxed_meminfo)
    return res
Ejemplo n.º 6
0
def unbox_listtype(typ, val, c):
    context = c.context
    builder = c.builder

    # Check that `type(val) is Dict`
    list_type = c.pyapi.unserialize(c.pyapi.serialize_object(List))
    valtype = c.pyapi.object_type(val)
    same_type = builder.icmp_unsigned("==", valtype, list_type)

    with c.builder.if_else(same_type) as (then, orelse):
        with then:
            miptr = c.pyapi.object_getattr_string(val, '_opaque')

            native = c.unbox(types.MemInfoPointer(types.voidptr), miptr)

            mi = native.value
            ctor = cgutils.create_struct_proxy(typ)
            lstruct = ctor(context, builder)

            data_pointer = context.nrt.meminfo_data(builder, mi)
            data_pointer = builder.bitcast(
                data_pointer,
                listobject.ll_list_type.as_pointer(),
            )

            lstruct.data = builder.load(data_pointer)
            lstruct.meminfo = mi

            lstobj = lstruct._getvalue()
            c.pyapi.decref(miptr)
            bb_unboxed = c.builder.basic_block

        with orelse:
            # Raise error on incorrect type
            c.pyapi.err_format(
                "PyExc_TypeError",
                "can't unbox a %S as a %S",
                valtype,
                list_type,
            )
            bb_else = c.builder.basic_block

    # Phi nodes to gather the output
    lstobj_res = c.builder.phi(lstobj.type)
    is_error_res = c.builder.phi(cgutils.bool_t)

    lstobj_res.add_incoming(lstobj, bb_unboxed)
    lstobj_res.add_incoming(lstobj.type(None), bb_else)

    is_error_res.add_incoming(cgutils.false_bit, bb_unboxed)
    is_error_res.add_incoming(cgutils.true_bit, bb_else)

    # cleanup
    c.pyapi.decref(list_type)
    c.pyapi.decref(valtype)

    return NativeValue(lstobj_res, is_error=is_error_res)
Ejemplo n.º 7
0
def unbox_dicttype(typ, val, c):
    context = c.context

    # Check that `type(val) is Dict`
    dict_type = c.pyapi.unserialize(c.pyapi.serialize_object(Dict))
    valtype = c.pyapi.object_type(val)
    same_type = c.builder.icmp_unsigned("==", valtype, dict_type)

    with c.builder.if_else(same_type) as (then, orelse):
        with then:
            miptr = c.pyapi.object_getattr_string(val, '_opaque')

            mip_type = types.MemInfoPointer(types.voidptr)
            native = c.unbox(mip_type, miptr)

            mi = native.value

            argtypes = mip_type, typeof(typ)

            def convert(mi, typ):
                return dictobject._from_meminfo(mi, typ)

            sig = signature(typ, *argtypes)
            nil_typeref = context.get_constant_null(argtypes[1])
            args = (mi, nil_typeref)
            is_error, dctobj = c.pyapi.call_jit_code(convert, sig, args)
            # decref here because we are stealing a reference.
            c.context.nrt.decref(c.builder, typ, dctobj)

            c.pyapi.decref(miptr)
            bb_unboxed = c.builder.basic_block

        with orelse:
            # Raise error on incorrect type
            c.pyapi.err_format(
                "PyExc_TypeError",
                "can't unbox a %S as a %S",
                valtype,
                dict_type,
            )
            bb_else = c.builder.basic_block

    # Phi nodes to gather the output
    dctobj_res = c.builder.phi(dctobj.type)
    is_error_res = c.builder.phi(is_error.type)

    dctobj_res.add_incoming(dctobj, bb_unboxed)
    dctobj_res.add_incoming(dctobj.type(None), bb_else)

    is_error_res.add_incoming(is_error, bb_unboxed)
    is_error_res.add_incoming(cgutils.true_bit, bb_else)

    # cleanup
    c.pyapi.decref(dict_type)
    c.pyapi.decref(valtype)

    return NativeValue(dctobj_res, is_error=is_error_res)
Ejemplo n.º 8
0
 def __init__(self, dmm, fe_type):
     payload_type = types.ListPayload(fe_type.container)
     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.º 9
0
 def __init__(self, dmm, fe_type):
     payload_type = types.SetPayload(fe_type)
     members = [
         # The meminfo data points to a SetPayload
         ('meminfo', types.MemInfoPointer(payload_type)),
         # This member is only used only for reflected sets
         ('parent', types.pyobject),
     ]
     super(SetModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 10
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.º 11
0
 def __init__(self, dmm, fe_type):
     payload_type = types.SetPayload(fe_type.container)
     members = [
         # The meminfo data points to a SetPayload (shared with the
         # original set object)
         ('meminfo', types.MemInfoPointer(payload_type)),
         # The index into the entries table
         ('index', types.EphemeralPointer(types.intp)),
     ]
     super(SetIterModel, self).__init__(dmm, fe_type, members)
    def codegen(context, builder, signature, args):
        _, meminfo = args

        st = cgutils.create_struct_proxy(inst_type)(context, builder)
        st.meminfo = meminfo
        #NOTE: Fixes sefault but not sure about it's lifecycle (i.e. watch out for memleaks)
        context.nrt.incref(builder, types.MemInfoPointer(types.voidptr),
                           meminfo)

        return st._getvalue()
Ejemplo n.º 13
0
 def __init__(self, dmm, fe_type):
     ndim = fe_type.ndim
     members = [
         ("meminfo", types.MemInfoPointer(fe_type.dtype)),
         ("parent", types.pyobject),
         ("nitems", types.intp),
         ("itemsize", types.intp),
         ("data", types.CPointer(fe_type.dtype)),
         ("shape", types.UniTuple(types.intp, ndim)),
         ("strides", types.UniTuple(types.intp, ndim)),
     ]
     super(ArrayModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 14
0
 def __init__(self, dmm, fe_typ):
     cls_data_ty = types.ClassDataType(fe_typ)
     # MemInfoPointer uses the `dtype` attribute to traverse for nested
     # NRT MemInfo.  Since we handle nested NRT MemInfo ourselves,
     # we will replace provide MemInfoPointer with an opaque type
     # so that it does not raise exception for nested meminfo.
     dtype = types.Opaque('Opaque.' + str(cls_data_ty))
     members = [
         ('meminfo', types.MemInfoPointer(dtype)),
         ('data', types.CPointer(cls_data_ty)),
     ]
     super(InstanceModel, self).__init__(dmm, fe_typ, members)
Ejemplo n.º 15
0
 def __init__(self, dmm, fe_type):
     ndim = fe_type.ndim
     members = [
         ('meminfo', types.MemInfoPointer(fe_type.dtype)),
         ('parent', types.pyobject),
         ('nitems', types.intp),
         ('itemsize', types.intp),
         ('data', types.CPointer(fe_type.dtype)),
         ('shape', types.UniTuple(types.intp, ndim)),
         ('strides', types.UniTuple(types.intp, ndim)),
     ]
     super(ArrayModel, self).__init__(dmm, fe_type, members)
Ejemplo n.º 16
0
    def unbox_struct_ref(typ, obj, c):
        mi_obj = c.pyapi.object_getattr_string(obj, "_meminfo")

        mip_type = types.MemInfoPointer(types.voidptr)

        mi = c.unbox(mip_type, mi_obj).value

        utils = _Utils(c.context, c.builder, typ)
        struct_ref = utils.new_struct_ref(mi)
        out = struct_ref._getvalue()

        c.pyapi.decref(mi_obj)
        return NativeValue(out)
Ejemplo n.º 17
0
    def box_struct_ref(typ, val, c):
        """
        Convert a raw pointer to a Python int.
        """
        utils = _Utils(c.context, c.builder, typ)
        struct_ref = utils.get_struct_ref(val)
        meminfo = struct_ref.meminfo

        mip_type = types.MemInfoPointer(types.voidptr)
        boxed_meminfo = c.box(mip_type, meminfo)

        ctor_pyfunc = c.pyapi.unserialize(c.pyapi.serialize_object(obj_ctor))
        ty_pyobj = c.pyapi.unserialize(c.pyapi.serialize_object(typ))

        res = c.pyapi.call_function_objargs(
            ctor_pyfunc,
            [ty_pyobj, boxed_meminfo],
        )
        c.pyapi.decref(ctor_pyfunc)
        c.pyapi.decref(ty_pyobj)
        c.pyapi.decref(boxed_meminfo)
        return res
def box_untyped_structref(typ, val, c):
    print("HERE", typ)
    meminfo = val.meminfo
    typ = val.dtype
    # utils = _Utils(c.context, c.builder, typ)
    # struct_ref = utils.get_struct_ref(val)
    # meminfo = struct_ref.meminfo

    mip_type = types.MemInfoPointer(types.voidptr)
    boxed_meminfo = c.box(mip_type, meminfo)

    ctor_pyfunc = c.pyapi.unserialize(c.pyapi.serialize_object(obj_ctor))
    ty_pyobj = c.pyapi.unserialize(c.pyapi.serialize_object(typ))

    res = c.pyapi.call_function_objargs(
        ctor_pyfunc,
        [ty_pyobj, boxed_meminfo],
    )
    c.pyapi.decref(ctor_pyfunc)
    c.pyapi.decref(ty_pyobj)
    c.pyapi.decref(boxed_meminfo)
    return res
Ejemplo n.º 19
0
def unbox_dicttype(typ, val, c):
    context = c.context

    miptr = c.pyapi.object_getattr_string(val, '_opaque')

    mip_type = types.MemInfoPointer(types.voidptr)
    native = c.unbox(mip_type, miptr)

    mi = native.value

    argtypes = mip_type, typeof(typ)

    def convert(mi, typ):
        return dictobject._from_meminfo(mi, typ)

    sig = signature(typ, *argtypes)
    nil_typeref = context.get_constant_null(argtypes[1])
    args = (mi, nil_typeref)
    is_error, dctobj = c.pyapi.call_jit_code(convert, sig, args)
    # decref here because we are stealing a reference.
    c.context.nrt.decref(c.builder, typ, dctobj)

    c.pyapi.decref(miptr)
    return NativeValue(dctobj, is_error=is_error)
Ejemplo n.º 20
0
 def __init__(self, dmm, fe_type):
     members = [('bit_generator', _bit_gen_type),
                ('meminfo', types.MemInfoPointer(types.voidptr)),
                ('parent', types.pyobject)]
     super(NumPyRandomGeneratorTypeModel,
           self).__init__(dmm, fe_type, members)
Ejemplo n.º 21
0
 def __init__(self, dmm, fe_typ):
     dtype = fe_typ.get_data_type()
     members = [
         ("meminfo", types.MemInfoPointer(dtype)),
     ]
     super().__init__(dmm, fe_typ, members)
Ejemplo n.º 22
0
def typeof_meminfo(val, c):
    return types.MemInfoPointer(types.voidptr)
Ejemplo n.º 23
0
    _cast,
    _nonoptional,
    _get_incref_decref,
    _container_get_data,
    _container_get_meminfo,
)
from numba.cpython import listobj

ll_list_type = cgutils.voidptr_t
ll_listiter_type = cgutils.voidptr_t
ll_voidptr_type = cgutils.voidptr_t
ll_status = cgutils.int32_t
ll_ssize_t = cgutils.intp_t
ll_bytes = cgutils.voidptr_t

_meminfo_listptr = types.MemInfoPointer(types.voidptr)

INDEXTY = types.intp

index_types = types.integer_domain

DEFAULT_ALLOCATED = 0


@register_model(ListType)
class ListModel(models.StructModel):
    def __init__(self, dmm, fe_type):
        members = [
            ('meminfo', _meminfo_listptr),
            ('data', types.voidptr),  # ptr to the C list
        ]
Ejemplo n.º 24
0
    _sentry_safe_cast_default,
    _get_incref_decref,
    _get_equal,
    _container_get_data,
)
from numba.cpython.unicode import make_string_from_constant

ll_dict_type = cgutils.voidptr_t
ll_dictiter_type = cgutils.voidptr_t
ll_voidptr_type = cgutils.voidptr_t
ll_status = cgutils.int32_t
ll_ssize_t = cgutils.intp_t
ll_hash = ll_ssize_t
ll_bytes = cgutils.voidptr_t

_meminfo_dictptr = types.MemInfoPointer(types.voidptr)

# The following enums must match _dictobject.c


class DKIX(IntEnum):
    """Special return value of dict lookup.
    """
    EMPTY = -1


class Status(IntEnum):
    """Status code for other dict operations.
    """
    OK = 0
    OK_REPLACED = 1