def struct_setattr_impl(context, builder, sig, args, attr): [inst_type, val_type] = sig.args [instance, val] = args utils = _Utils(context, builder, inst_type) dataval = utils.get_data_struct(instance) # cast val to the correct type field_type = inst_type.field_dict[attr] casted = context.cast(builder, val, val_type, field_type) pyapi = context.get_python_api(builder) # print("BBB", attr,[x[0] for x in base_fact_fields], attr in [x[0] for x in base_fact_fields]) if(attr not in [x[0] for x in base_fact_fields]): idrec = getattr(dataval, "idrec") idrec_set = builder.icmp_signed('!=', idrec, idrec.type(-1)) with builder.if_then(idrec_set): msg =("Facts objects are immutable once defined. Use kb.modify instead.",) context.call_conv.return_user_exc(builder, AttributeError, msg) # read old old_value = getattr(dataval, attr) # incref new value context.nrt.incref(builder, val_type, casted) # decref old value (must be last in case new value is old value) context.nrt.decref(builder, val_type, old_value) # write new setattr(dataval, attr, casted)
def codegen(context, builder, sig, args): [instance, attr_v] = args utils = _Utils(context, builder, inst_type) dataval = utils.get_data_struct(instance) ret = getattr(dataval, attr) return imputils.impl_ret_borrowed(context, builder, fieldtype, ret)
def var_getattr_impl(context, builder, typ, val, attr): #If the attribute is one of the var struct fields then retrieve it. if(attr in var_fields_dict): # print("GETATTR", attr) utils = _Utils(context, builder, typ) dataval = utils.get_data_struct(val) ret = getattr(dataval, attr) fieldtype = typ.field_dict[attr] return imputils.impl_ret_borrowed(context, builder, fieldtype, ret) #Otherwise return a new instance with a new 'attr' and 'offset' append else: fact_type = typ.field_dict['fact_type'].instance_type fd = fact_type.field_dict offset = fact_type._attr_offsets[list(fd.keys()).index(attr)] ctor = cgutils.create_struct_proxy(typ) st = ctor(context, builder, value=val)._getvalue() def new_var_and_append(self): st = new(typ) copy_and_append(self,st,attr,offset) return st ret = context.compile_internal(builder, new_var_and_append, typ(typ,), (st,)) context.nrt.incref(builder, typ, ret) return ret
def codegen(context, builder, sig, args): val_ty, = sig.args val, = args utils = _Utils(context, builder, val_ty) dataptr = utils.get_data_pointer(val) ret = builder.ptrtoint(dataptr, cgutils.intp_t) return ret
def struct_setattr_impl(context, builder, sig, args, attr): [inst_type, val_type] = sig.args [instance, val] = args utils = _Utils(context, builder, inst_type) dataval = utils.get_data_struct(instance) # cast val to the correct type field_type = inst_type.field_dict[attr] casted = context.cast(builder, val, val_type, field_type) # read old old_value = getattr(dataval, attr) # incref new value context.nrt.incref(builder, val_type, casted) # decref old value (must be last in case new value is old value) context.nrt.decref(builder, val_type, old_value) # write new setattr(dataval, attr, casted)
def codegen(context, builder, sig, args): inst_type, _ = sig.args val, _ = args if (not isinstance(inst_type, types.StructRef)): #If we get just get the type and not an instance make a dummy instance inst_type = inst_type.instance_type val = context.make_helper(builder, inst_type)._getvalue() #Get the base address of the struct data utils = _Utils(context, builder, inst_type) baseptr = utils.get_data_pointer(val) baseptr = builder.ptrtoint(baseptr, cgutils.intp_t) #Get the address of member for 'attr' dataval = utils.get_data_struct(val) attrptr = dataval._get_ptr_by_name(attr_literal) attrptr = builder.ptrtoint(attrptr, cgutils.intp_t) #Subtract them to get the offset offset = builder.sub(attrptr, baseptr) return offset
def struct_getattr_impl(context, builder, typ, val, attr): utils = _Utils(context, builder, typ) dataval = utils.get_data_struct(val) ret = getattr(dataval, attr) fieldtype = typ.field_dict[attr] return imputils.impl_ret_borrowed(context, builder, fieldtype, ret)