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
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)
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
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
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)
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
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)
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)]
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
def factory(self): vdict = self.VirtualDict(self) box = rvalue.PtrRedBox(self.ptrkind, known_nonzero=True) box.content = vdict vdict.ownbox = box return box
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
def vboolfactory(self): vbool = VirtualBool(self) box = rvalue.PtrRedBox(self.ptrkind, known_nonzero=True) box.content = vbool vbool.ownbox = box return vbool
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)