def register(struct_type): """Register a `numba.core.types.StructRef` for use in jit-code. This defines the data-model for lowering an instance of `struct_type`. This defines attributes accessor and mutator for an instance of `struct_type`. Parameters ---------- struct_type : type A subclass of `numba.core.types.StructRef`. Returns ------- struct_type : type Returns the input argument so this can act like a decorator. Examples -------- .. code-block:: class MyStruct(numba.core.types.StructRef): ... # the simplest subclass can be empty numba.experimental.structref.register(MyStruct) """ if struct_type is types.StructRef: raise ValueError(f"cannot register {types.StructRef}") default_manager.register(struct_type, models.StructRefModel) define_attributes(struct_type) return struct_type
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) class InstanceDataModel(models.StructModel): def __init__(self, dmm, fe_typ): clsty = fe_typ.class_type members = [(_mangle_attr(k), v) for k, v in clsty.struct.items()] super(InstanceDataModel, self).__init__(dmm, fe_typ, members) default_manager.register(types.ClassInstanceType, InstanceModel) default_manager.register(types.ClassDataType, InstanceDataModel) default_manager.register(types.ClassType, models.OpaqueModel) def _mangle_attr(name): """ Mangle attributes. The resulting name does not startswith an underscore '_'. """ return 'm_' + name ############################################################################## # Class object
def _register_fact_structref(fact_type): if fact_type is types.StructRef: raise ValueError(f"cannot register {types.StructRef}") default_manager.register(fact_type, models.StructRefModel) define_attributes(fact_type) return fact_type
'alias' : unicode_type, 'deref_attrs': ListType(unicode_type), 'deref_offsets': ListType(i8), 'fact_type_name': unicode_type, 'fact_type': types.Any, 'head_type': types.Any, } var_fields = [(k,v) for k,v, in var_fields_dict.items()] class VarTypeTemplate(types.StructRef): pass # Manually register the type to avoid automatic getattr overloading default_manager.register(VarTypeTemplate, models.StructRefModel) GenericVarType = VarTypeTemplate([(k,v) for k,v in var_fields_dict.items()]) class Var(structref.StructRefProxy): def __new__(cls, typ, alias=None): fact_type_name = typ._fact_name typ = types.TypeRef(typ) struct_type = get_var_definition(typ,typ) st = var_ctor(struct_type, fact_type_name, alias) return st # return structref.StructRefProxy.__new__(cls, *args) def __getattr__(self, attr): # print("DEREF", attr) if(attr == 'fact_type'):