コード例 #1
0
 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
コード例 #2
0
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)
コード例 #3
0
 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)
コード例 #4
0
 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()
コード例 #5
0
 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