def getinteriorfieldargs(self, hop, v_self): vlist = [] if None in self.v_offsets: INTERIOR_TYPE = v_self.concretetype.TO nameiter = iter(INTERIOR_TYPE._names) name = nameiter.next() vlist.append( hop.genop('getfield', [v_self, flowmodel.Constant(name, lltype.Void)], resulttype=INTERIOR_TYPE._flds[name])) else: vlist.append(v_self) for v_offset in self.v_offsets: if v_offset is None: name = nameiter.next() vlist.append( hop.genop('getfield', [v_self, flowmodel.Constant(name, lltype.Void)], resulttype=INTERIOR_TYPE._flds[name])) else: vlist.append(v_offset) if None in self.v_offsets: try: nameiter.next() except StopIteration: pass else: assert False return vlist
class __extend__(pairtype(PtrRepr, IntegerRepr)): def rtype_getitem((r_ptr, r_int), hop): ARRAY = r_ptr.lowleveltype.TO ITEM_TYPE = ARRAY.OF if isinstance(ITEM_TYPE, lltype.ContainerType): if isinstance(hop.r_result, InteriorPtrRepr): v_array, v_index = hop.inputargs(r_ptr, lltype.Signed) INTERIOR_PTR_TYPE = r_ptr.lowleveltype._interior_ptr_type_with_index(ITEM_TYPE) cflags = hop.inputconst(lltype.Void, {'flavor': 'gc'}) args = [flowmodel.Constant(INTERIOR_PTR_TYPE, lltype.Void), cflags] v_interior_ptr = hop.genop('malloc', args, resulttype=lltype.Ptr(INTERIOR_PTR_TYPE)) hop.genop('setfield', [v_interior_ptr, flowmodel.Constant('ptr', lltype.Void), v_array]) hop.genop('setfield', [v_interior_ptr, flowmodel.Constant('index', lltype.Void), v_index]) return v_interior_ptr else: newopname = 'getarraysubstruct' else: newopname = 'getarrayitem' vlist = hop.inputargs(r_ptr, lltype.Signed) return hop.genop(newopname, vlist, resulttype = hop.r_result.lowleveltype)
def assign(mangled_name, value): if isinstance(value, flowmodel.Constant) and isinstance( value.value, staticmethod): value = flowmodel.Constant(value.value.__get__( 42)) # staticmethod => bare function llvalue = r.convert_desc_or_const(value) setattr(meta_instance, mangled_name, llvalue)
def rtype_simple_call(self, hop): hop2 = hop.copy() func = self.func s_func = hop.rtyper.annotator.bookkeeper.immutablevalue(func) v_ptr = hop2.args_v[0] hop2.r_s_popfirstarg() hop2.v_s_insertfirstarg(v_ptr, lltype_to_annotation(self.ll_ptrtype)) hop2.v_s_insertfirstarg(flowmodel.Constant(func), s_func) return hop2.dispatch()
def __init__(self, ptrtype): assert isinstance(ptrtype, lltype.InteriorPtr) self._ptrtype = ptrtype # for debugging self.v_offsets = [] numitemoffsets = 0 for i, offset in enumerate(ptrtype.offsets): if isinstance(offset, int): numitemoffsets += 1 self.v_offsets.append(None) else: assert isinstance(offset, str) self.v_offsets.append(flowmodel.Constant(offset, lltype.Void)) self.parentptrtype = lltype.Ptr(ptrtype.PARENTTYPE) self.resulttype = lltype.Ptr(ptrtype.TO) assert numitemoffsets <= 1 if numitemoffsets > 0: self.lowleveltype = lltype.Ptr(self.parentptrtype._interior_ptr_type_with_index(self.resulttype.TO)) else: self.lowleveltype = self.parentptrtype