예제 #1
0
 def gengetinteriorfield(jitstate, deepfrozen, argbox, *indexboxes):
     if (immutable or deepfrozen) and argbox.is_constant():
         ptr = rvalue.ll_getvalue(argbox, PTRTYPE)
         if ptr:  # else don't constant-fold the segfault...
             i = 0
             for offset in unroll_path:
                 if offset is None:  # array substruct
                     indexbox = indexboxes[i]
                     i += 1
                     if not indexbox.is_constant():
                         break  # non-constant array index
                     index = rvalue.ll_getvalue(
                         indexbox, lltype.Signed)
                     ptr = ptr[index]
                 else:
                     ptr = getattr(ptr, offset)
             else:
                 # constant-folding: success
                 assert i == len(indexboxes)
                 return rvalue.ll_fromvalue(jitstate, ptr)
     argbox = getinterior_initial(jitstate, argbox, *indexboxes)
     if lastoffset is None:  # getarrayitem
         indexbox = indexboxes[-1]
         genvar = jitstate.curbuilder.genop_getarrayitem(
             lastfielddesc.arraytoken, argbox.getgenvar(jitstate),
             indexbox.getgenvar(jitstate))
         return lastfielddesc.makebox(jitstate, genvar)
     else:  # getfield
         return argbox.op_getfield(jitstate, lastfielddesc)
예제 #2
0
 def gengetinteriorarraysize(jitstate, argbox, *indexboxes):
     if argbox.is_constant():
         ptr = rvalue.ll_getvalue(argbox, PTRTYPE)
         if ptr:    # else don't constant-fold the segfault...
             i = 0
             for offset in unroll_path:
                 if offset is None:        # array substruct
                     indexbox = indexboxes[i]
                     i += 1
                     if not indexbox.is_constant():
                         break    # non-constant array index
                     index = rvalue.ll_getvalue(indexbox,
                                                lltype.Signed)
                     ptr = ptr[index]
                 else:
                     ptr = getattr(ptr, offset)
             else:
                 # constant-folding: success
                 assert i == len(indexboxes)
                 return rvalue.ll_fromvalue(jitstate, len(ptr))
     argbox = getinterior_all(jitstate, argbox, *indexboxes)
     genvar = jitstate.curbuilder.genop_getarraysize(
         arrayfielddesc.arraytoken,
         argbox.getgenvar(jitstate))
     return rvalue.IntRedBox(arrayfielddesc.indexkind, genvar)
예제 #3
0
 def gengetinteriorfield(jitstate, deepfrozen, argbox, *indexboxes):
     if (immutable or deepfrozen) and argbox.is_constant():
         ptr = rvalue.ll_getvalue(argbox, PTRTYPE)
         if ptr:    # else don't constant-fold the segfault...
             i = 0
             for offset in unroll_path:
                 if offset is None:        # array substruct
                     indexbox = indexboxes[i]
                     i += 1
                     if not indexbox.is_constant():
                         break    # non-constant array index
                     index = rvalue.ll_getvalue(indexbox,
                                                lltype.Signed)
                     ptr = ptr[index]
                 else:
                     ptr = getattr(ptr, offset)
             else:
                 # constant-folding: success
                 assert i == len(indexboxes)
                 return rvalue.ll_fromvalue(jitstate, ptr)
     argbox = getinterior_initial(jitstate, argbox, *indexboxes)
     if lastoffset is None:      # getarrayitem
         indexbox = indexboxes[-1]
         genvar = jitstate.curbuilder.genop_getarrayitem(
             lastfielddesc.arraytoken,
             argbox.getgenvar(jitstate),
             indexbox.getgenvar(jitstate))
         return lastfielddesc.makebox(jitstate, genvar)
     else:  # getfield
         return argbox.op_getfield(jitstate, lastfielddesc)
예제 #4
0
파일: vlist.py 프로젝트: chyyuu/pygirl
def oop_list_insert(jitstate, oopspecdesc, selfbox, indexbox, itembox):
    content = selfbox.content
    if isinstance(content, VirtualList) and indexbox.is_constant():
        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
        # XXX what if the assert fails?
        assert 0 <= index <= len(content.item_boxes)
        content.item_boxes.insert(index, itembox)
    else:
        oopspecdesc.residual_call(jitstate, [selfbox, indexbox, itembox])
예제 #5
0
 def materialize(rgenop, boxes):
     s = lltype.malloc(TYPE)
     i = 0
     for desc in descs:
         v = rvalue.ll_getvalue(boxes[i], desc.RESTYPE)
         tgt = lltype.cast_pointer(desc.PTRTYPE, s)
         setattr(tgt, desc.fieldname, v)
         i = i + 1
     return rgenop.genconst(s)
예제 #6
0
 def materialize(rgenop, boxes):
     s = lltype.malloc(TYPE)
     i = 0
     for desc in descs:
         v = rvalue.ll_getvalue(boxes[i], desc.RESTYPE)
         tgt = lltype.cast_pointer(desc.PTRTYPE, s)
         setattr(tgt, desc.fieldname, v)
         i = i + 1
     return rgenop.genconst(s)
예제 #7
0
파일: vlist.py 프로젝트: chyyuu/pygirl
def oop_list_delitem(jitstate, oopspecdesc, selfbox, indexbox):
    content = selfbox.content
    if isinstance(content, VirtualList) and indexbox.is_constant():
        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
        try:
            del content.item_boxes[index]
        except IndexError:
            oopspecdesc.residual_exception(jitstate, IndexError)
    else:
        oopspecdesc.residual_call(jitstate, [selfbox, indexbox])
예제 #8
0
 def store_global_excdata(self, jitstate):
     builder = jitstate.curbuilder
     etypebox = jitstate.exc_type_box
     if etypebox.is_constant():
         ll_etype = rvalue.ll_getvalue(etypebox, llmemory.Address)
         if not ll_etype:
             return       # we know there is no exception set
     evaluebox = jitstate.exc_value_box
     gv_etype  = etypebox .getgenvar(jitstate)
     gv_evalue = evaluebox.getgenvar(jitstate)
     self.genop_set_exc_type (builder, gv_etype )
     self.genop_set_exc_value(builder, gv_evalue)
예제 #9
0
 def store_global_excdata(self, jitstate):
     builder = jitstate.curbuilder
     etypebox = jitstate.exc_type_box
     if etypebox.is_constant():
         ll_etype = rvalue.ll_getvalue(etypebox, llmemory.Address)
         if not ll_etype:
             return  # we know there is no exception set
     evaluebox = jitstate.exc_value_box
     gv_etype = etypebox.getgenvar(jitstate)
     gv_evalue = evaluebox.getgenvar(jitstate)
     self.genop_set_exc_type(builder, gv_etype)
     self.genop_set_exc_value(builder, gv_evalue)
예제 #10
0
 def gengetinteriorarraysize(jitstate, argbox, *indexboxes):
     if argbox.is_constant():
         ptr = rvalue.ll_getvalue(argbox, PTRTYPE)
         if ptr:  # else don't constant-fold the segfault...
             i = 0
             for offset in unroll_path:
                 if offset is None:  # array substruct
                     indexbox = indexboxes[i]
                     i += 1
                     if not indexbox.is_constant():
                         break  # non-constant array index
                     index = rvalue.ll_getvalue(
                         indexbox, lltype.Signed)
                     ptr = ptr[index]
                 else:
                     ptr = getattr(ptr, offset)
             else:
                 # constant-folding: success
                 assert i == len(indexboxes)
                 return rvalue.ll_fromvalue(jitstate, len(ptr))
     argbox = getinterior_all(jitstate, argbox, *indexboxes)
     genvar = jitstate.curbuilder.genop_getarraysize(
         arrayfielddesc.arraytoken, argbox.getgenvar(jitstate))
     return rvalue.IntRedBox(arrayfielddesc.indexkind, genvar)
예제 #11
0
파일: vlist.py 프로젝트: chyyuu/pygirl
def oop_list_pop(jitstate, oopspecdesc, selfbox, indexbox=None):
    content = selfbox.content
    if indexbox is None:
        if isinstance(content, VirtualList):
            try:
                return content.item_boxes.pop()
            except IndexError:
                return oopspecdesc.residual_exception(jitstate, IndexError)
        else:
            return oopspecdesc.residual_call(jitstate, [selfbox])

    if (isinstance(content, VirtualList) and indexbox.is_constant()):
        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
        try:
            return content.item_boxes.pop(index)
        except IndexError:
            return oopspecdesc.residual_exception(jitstate, IndexError)
    return oopspecdesc.residual_call(jitstate, [selfbox, indexbox])
예제 #12
0
파일: oop.py 프로젝트: TheDunn/flex-pypy
 def do_call(jitstate, argboxes):
     oopargs = ()
     for i, ARG in unrolling_OOPARGS:
         v = rvalue.ll_getvalue(argboxes[i], ARG)
         oopargs += (v,)
     if not oopargcheck(*oopargs):
         raise SegfaultException
     args = ()
     j = 0
     for ARG in unrolling_ARGS:
         if ARG == lltype.Void:
             v = None
         else:
             argsrc = residualargsources[j]
             j = j + 1
             v = oopargs[argsrc]
         args += (v,)
     result = fnptr(*args)
     if FUNCTYPE.RESULT == lltype.Void:
         return None
     return rvalue.ll_fromvalue(jitstate, result)
예제 #13
0
파일: oop.py 프로젝트: chyyuu/pygirl
 def do_call(jitstate, argboxes):
     oopargs = ()
     for i, ARG in unrolling_OOPARGS:
         v = rvalue.ll_getvalue(argboxes[i], ARG)
         oopargs += (v,)
     if not oopargcheck(*oopargs):
         raise SegfaultException
     args = ()
     j = 0
     for ARG in unrolling_ARGS:
         if ARG == lltype.Void:
             v = None
         else:
             argsrc = residualargsources[j]
             j = j + 1
             v = oopargs[argsrc]
         args += (v,)
     result = fnptr(*args)
     if FUNCTYPE.RESULT == lltype.Void:
         return None
     return rvalue.ll_fromvalue(jitstate, result)
예제 #14
0
파일: vlist.py 프로젝트: chyyuu/pygirl
def oop_newlist(jitstate, oopspecdesc, lengthbox, itembox=None):
    if lengthbox.is_constant():
        length = rvalue.ll_getvalue(lengthbox, lltype.Signed)
        return oopspecdesc.typedesc.factory(length, itembox)
    return oopspecdesc.residual_call(jitstate, [lengthbox, itembox])
예제 #15
0
파일: vdict.py 프로젝트: TheDunn/flex-pypy
 def getitem(self, keybox):
     key = rvalue.ll_getvalue(keybox, KEY)
     return self.item_boxes[key]
예제 #16
0
 def getitem(self, keybox):
     key = rvalue.ll_getvalue(keybox, KEY)
     return self.item_boxes[key]
예제 #17
0
 def setitem(self, keybox, valuebox):
     key = rvalue.ll_getvalue(keybox, KEY)
     self.item_boxes[key] = valuebox
예제 #18
0
파일: vdict.py 프로젝트: TheDunn/flex-pypy
 def setitem(self, keybox, valuebox):
     key = rvalue.ll_getvalue(keybox, KEY)
     self.item_boxes[key] = valuebox