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)
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)
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)
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])
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)
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])
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)
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)
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)
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])
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)
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])
def getitem(self, keybox): key = rvalue.ll_getvalue(keybox, KEY) return self.item_boxes[key]
def setitem(self, keybox, valuebox): key = rvalue.ll_getvalue(keybox, KEY) self.item_boxes[key] = valuebox