예제 #1
0
    def __init__(self, hrtyper, lazy_exception_path):
        RGenOp = hrtyper.RGenOp
        self.etrafo = hrtyper.annotator.exceptiontransformer
        self.cexcdata = self.etrafo.cexcdata
        self.exc_data_ptr = self.cexcdata.value
        self.gv_excdata = RGenOp.constPrebuiltGlobal(self.exc_data_ptr)

        EXCDATA = self.etrafo.EXCDATA
        LL_EXC_TYPE = self.etrafo.lltype_of_exception_type
        LL_EXC_VALUE = self.etrafo.lltype_of_exception_value
        self.exc_type_token = RGenOp.fieldToken(EXCDATA, 'exc_type')
        self.exc_value_token = RGenOp.fieldToken(EXCDATA, 'exc_value')
        self.exc_type_kind = RGenOp.kindToken(LL_EXC_TYPE)
        self.exc_value_kind = RGenOp.kindToken(LL_EXC_VALUE)

        null_exc_type = self.etrafo.c_null_etype.value
        null_exc_value = self.etrafo.c_null_evalue.value
        self.gv_null_exc_type = RGenOp.constPrebuiltGlobal(null_exc_type)
        self.gv_null_exc_value = RGenOp.constPrebuiltGlobal(null_exc_value)

        if hrtyper.rtyper.type_system.name == 'lltypesystem':
            self.null_exc_type_box = rvalue.PtrRedBox(self.exc_type_kind,
                                                      self.gv_null_exc_type)
            self.null_exc_value_box = rvalue.PtrRedBox(self.exc_value_kind,
                                                       self.gv_null_exc_value)
        else:
            # XXX: think more about exceptions
            self.null_exc_type_box = rvalue.PtrRedBox(
                self.exc_type_kind, RGenOp.constPrebuiltGlobal(llmemory.NULL))
            self.null_exc_value_box = rvalue.IntRedBox(
                self.exc_value_kind, RGenOp.constPrebuiltGlobal(llmemory.NULL))

        self.lazy_exception_path = lazy_exception_path
예제 #2
0
 def fetch_global_excdata(self, jitstate, known_occurred=False):
     builder = jitstate.curbuilder
     gv_etype = self.genop_get_exc_type(builder)
     gv_evalue = self.genop_get_exc_value(builder)
     self.genop_set_exc_type(builder, self.gv_null_exc_type)
     self.genop_set_exc_value(builder, self.gv_null_exc_value)
     etypebox = rvalue.PtrRedBox(self.exc_type_kind, gv_etype)
     evaluebox = rvalue.PtrRedBox(self.exc_value_kind, gv_evalue)
     etypebox.known_nonzero = known_occurred
     evaluebox.known_nonzero = known_occurred
     rtimeshift.setexctypebox(jitstate, etypebox)
     rtimeshift.setexcvaluebox(jitstate, evaluebox)
예제 #3
0
 def getgenvar(self, jitstate):
     typedesc = self.typedesc
     gv_outside = self.content_boxes[-1].genvar
     if gv_outside is typedesc.gv_null:
         assert isinstance(typedesc, VirtualizableStructTypeDesc)
         builder = jitstate.curbuilder
         gv_outside = builder.genop_malloc_fixedsize(typedesc.alloctoken)
         outsidebox = rvalue.PtrRedBox(self.content_boxes[-1].kind,
                                       gv_outside,
                                       known_nonzero=True)
         self.content_boxes[-1] = outsidebox
         jitstate.add_virtualizable(self.ownbox)
         #access_token = typedesc.access_desc.fieldtoken
         #gv_access_null = typedesc.access_desc.gv_default
         #builder.genop_setfield(access_token, gv_outside, gv_access_null)
         # write all non-redirected fields
         boxes = self.content_boxes
         fielddescs = typedesc.fielddescs
         redirected = typedesc.redirected
         for i in range(len(fielddescs)):
             if i not in redirected:
                 fielddesc = fielddescs[i]
                 box = boxes[i]
                 fielddesc.generate_set(jitstate, gv_outside,
                                        box.getgenvar(jitstate))
     return gv_outside
예제 #4
0
 def factory(self):
     vstructbox = StructTypeDesc.factory(self)
     outsidebox = rvalue.PtrRedBox(self.innermostdesc.ptrkind, self.gv_null)
     content = vstructbox.content
     assert isinstance(content, VirtualizableStruct)
     content.content_boxes.append(outsidebox)
     return vstructbox
예제 #5
0
def test_learn_nonzeroness():
    jitstate = FakeJITState()
    gv = FakeGenVar()
    box = rvalue.PtrRedBox("dummy pointer", gv)
    assert not box.known_nonzero
    assert box.learn_nonzeroness(jitstate, True)
    assert box.known_nonzero

    assert not box.learn_nonzeroness(jitstate, False)
    assert box.learn_nonzeroness(jitstate, True)

    box = rvalue.PtrRedBox("dummy pointer", gv)
    assert box.learn_nonzeroness(jitstate, False)
    assert box.is_constant()
    assert box.genvar._value == "NULL"
    assert box.learn_nonzeroness(jitstate, False)
    assert not box.learn_nonzeroness(jitstate, True)
예제 #6
0
 def factory(self):
     vstruct = self.VirtualStructCls(self)
     vstruct.content_boxes = [
         desc.makedefaultbox() for desc in self.fielddescs
     ]
     box = rvalue.PtrRedBox(self.innermostdesc.ptrkind, known_nonzero=True)
     box.content = vstruct
     vstruct.ownbox = box
     return box
예제 #7
0
 def load_from(self, jitstate, gv_outside):
     typedesc = self.typedesc
     assert isinstance(typedesc, VirtualizableStructTypeDesc)
     # XXX missing check for gv_outside being NULL
     boxes = self.content_boxes
     boxes[-1] = rvalue.PtrRedBox(boxes[-1].kind,
                                  gv_outside,
                                  known_nonzero=True)
     builder = jitstate.curbuilder
     builder.genop_call(typedesc.access_is_null_token,
                        typedesc.gv_access_is_null_ptr, [gv_outside])
     for fielddesc, i in typedesc.redirected_fielddescs:
         boxes[i] = fielddesc.generate_get(jitstate, gv_outside)
     jitstate.add_virtualizable(self.ownbox)
예제 #8
0
def test_box_get_set_field():
    jitstate = FakeJITState()
    V0 = FakeGenVar()
    box = rvalue.PtrRedBox("dummy pointer", V0)
    STRUCT = lltype.Struct("dummy", ("foo", lltype.Signed))
    desc = rcontainer.StructFieldDesc(FakeHRTyper(), lltype.Ptr(STRUCT), "foo", 0)
    box2 = box.op_getfield(jitstate, desc)
    V1 = box2.genvar
    assert box.known_nonzero
    assert jitstate.curbuilder.ops == [('getfield', (('field', STRUCT, 'foo'), V0), V1)]

    jitstate.curbuilder.ops = []
    V42 = FakeGenVar(42)
    valuebox = rvalue.IntRedBox("dummy kind", V42)
    box.op_setfield(jitstate, desc, valuebox)
    assert jitstate.curbuilder.ops == [('setfield', (('field', STRUCT, 'foo'), V0, V42), None)]
예제 #9
0
파일: vlist.py 프로젝트: chyyuu/pygirl
    def make_rti(self, jitstate, memo):
        try:
            return memo.containers[self]
        except KeyError:
            pass
        typedesc = self.typedesc
        bitmask = 1 << memo.bitcount
        memo.bitcount += 1
        rgenop = jitstate.curbuilder.rgenop
        vrti = rvirtualizable.VirtualRTI(rgenop, bitmask)
        vrti.devirtualize = typedesc.devirtualize
        memo.containers[self] = vrti

        builder = jitstate.curbuilder
        place = builder.alloc_frame_place(typedesc.ptrkind)
        vrti.forced_place = place
        forced_box = rvalue.PtrRedBox(typedesc.ptrkind)
        memo.forced_boxes.append((forced_box, place))

        vars_gv = memo.framevars_gv
        varindexes = vrti.varindexes
        vrtis = vrti.vrtis
        j = -1
        for box in self.item_boxes:
            if box.genvar:
                varindexes.append(memo.frameindex)
                memo.frameindex += 1
                vars_gv.append(box.genvar)
            else:
                varindexes.append(j)
                assert isinstance(box, rvalue.PtrRedBox)
                content = box.content
                assert content.allowed_in_virtualizable
                vrtis.append(content.make_rti(jitstate, memo))
                j -= 1

        self.item_boxes.append(forced_box)
        return vrti
예제 #10
0
 def factory(self):
     vdict = self.VirtualDict(self)
     box = rvalue.PtrRedBox(self.ptrkind, known_nonzero=True)
     box.content = vdict
     vdict.ownbox = box
     return box
예제 #11
0
파일: vlist.py 프로젝트: chyyuu/pygirl
 def factory(self, length, itembox):
     vlist = VirtualList(self, length, itembox)
     box = rvalue.PtrRedBox(self.ptrkind, known_nonzero=True)
     box.content = vlist
     vlist.ownbox = box
     return box
예제 #12
0
파일: newbool.py 프로젝트: griels/pypy-sc
 def vboolfactory(self):
     vbool = VirtualBool(self)
     box = rvalue.PtrRedBox(self.ptrkind, known_nonzero=True)
     box.content = vbool
     vbool.ownbox = box
     return vbool
예제 #13
0
def create_varsize(jitstate, contdesc, sizebox):
    gv_size = sizebox.getgenvar(jitstate)
    alloctoken = contdesc.varsizealloctoken
    genvar = jitstate.curbuilder.genop_malloc_varsize(alloctoken, gv_size)
    # XXX MemoryError checking
    return rvalue.PtrRedBox(contdesc.ptrkind, genvar, known_nonzero=True)