def __init__(self, hrtyper): self.hrtyper = hrtyper RGenOp = hrtyper.RGenOp rtyper = hrtyper.rtyper bk = rtyper.annotator.bookkeeper s_w_bool = annmodel.unionof(bk.immutablevalue(W_BoolObject.w_False), bk.immutablevalue(W_BoolObject.w_True)) r_w_bool = rtyper.getrepr(s_w_bool) self.ll_False = r_w_bool.convert_const(W_BoolObject.w_False) self.ll_True = r_w_bool.convert_const(W_BoolObject.w_True) A = lltype.Array(lltype.typeOf(self.ll_False)) self.ll_bools = lltype.malloc(A, 2, immortal=True) self.ll_bools[0] = self.ll_False self.ll_bools[1] = self.ll_True self.gv_bools = RGenOp.constPrebuiltGlobal(self.ll_bools) self.boolsToken = RGenOp.arrayToken(A) self.bools_gv = [RGenOp.constPrebuiltGlobal(self.ll_False), RGenOp.constPrebuiltGlobal(self.ll_True)] self.ptrkind = RGenOp.kindToken(r_w_bool.lowleveltype) self.boolkind = RGenOp.kindToken(lltype.Bool) ll_BoolObject = r_w_bool.rclass.getvtable() self.BoolObjectBox = rvalue.redbox_from_prebuilt_value(RGenOp, ll_BoolObject) self.Falsebox = rvalue.redbox_from_prebuilt_value(RGenOp, False) self.Truebox = rvalue.redbox_from_prebuilt_value(RGenOp, True) self.boolboxes = [self.Falsebox, self.Truebox]
def __init__(self, hrtyper): self.hrtyper = hrtyper RGenOp = hrtyper.RGenOp rtyper = hrtyper.rtyper bk = rtyper.annotator.bookkeeper s_w_bool = annmodel.unionof(bk.immutablevalue(W_BoolObject.w_False), bk.immutablevalue(W_BoolObject.w_True)) r_w_bool = rtyper.getrepr(s_w_bool) self.ll_False = r_w_bool.convert_const(W_BoolObject.w_False) self.ll_True = r_w_bool.convert_const(W_BoolObject.w_True) A = lltype.Array(lltype.typeOf(self.ll_False)) self.ll_bools = lltype.malloc(A, 2, immortal=True) self.ll_bools[0] = self.ll_False self.ll_bools[1] = self.ll_True self.gv_bools = RGenOp.constPrebuiltGlobal(self.ll_bools) self.boolsToken = RGenOp.arrayToken(A) self.bools_gv = [ RGenOp.constPrebuiltGlobal(self.ll_False), RGenOp.constPrebuiltGlobal(self.ll_True) ] self.ptrkind = RGenOp.kindToken(r_w_bool.lowleveltype) self.boolkind = RGenOp.kindToken(lltype.Bool) ll_BoolObject = r_w_bool.rclass.getvtable() self.BoolObjectBox = rvalue.redbox_from_prebuilt_value( RGenOp, ll_BoolObject) self.Falsebox = rvalue.redbox_from_prebuilt_value(RGenOp, False) self.Truebox = rvalue.redbox_from_prebuilt_value(RGenOp, True) self.boolboxes = [self.Falsebox, self.Truebox]
def __init__(self): self.boolkind = rgenop.kindToken(lltype.Bool) self.boolboxes = [ rvalue.redbox_from_prebuilt_value(rgenop, False), rvalue.redbox_from_prebuilt_value(rgenop, True) ]
def __init__(self, hrtyper, fnobj, can_raise): ll_func = fnobj._callable FUNCTYPE = lltype.typeOf(fnobj) nb_args = len(FUNCTYPE.ARGS) self.can_raise = can_raise # parse the oopspec and fill in the arguments operation_name, args = ll_func.oopspec.split('(', 1) assert args.endswith(')') args = args[:-1] + ',' # trailing comma to force tuple syntax if args.strip() == ',': args = '()' argnames = ll_func.func_code.co_varnames[:nb_args] d = dict(zip(argnames, [Index(n) for n in range(nb_args)])) self.argtuple = eval(args, d) # end of rather XXX'edly hackish parsing OOPARGTYPES = [] arg_llsig_to_oopsig = {} for i, obj in enumerate(self.argtuple): if isinstance(obj, Index): arg_llsig_to_oopsig[obj.n] = i OOPARG = FUNCTYPE.ARGS[obj.n] else: OOPARG = lltype.typeOf(obj) OOPARGTYPES.append(OOPARG) self.residualargsources = [] for i in range(nb_args): ARGTYPE = FUNCTYPE.ARGS[i] if ARGTYPE is not lltype.Void: self.residualargsources.append(arg_llsig_to_oopsig[i]) RGenOp = hrtyper.RGenOp self.args_gv = [None] * nb_args fnptr = fnobj._as_ptr() self.gv_fnptr = RGenOp.constPrebuiltGlobal(fnptr) result_kind = RGenOp.kindToken(FUNCTYPE.RESULT) self.result_kind = result_kind if FUNCTYPE.RESULT is lltype.Void: self.errorbox = None else: error_value = exceptiontransform.error_value(FUNCTYPE.RESULT) self.errorbox = rvalue.redbox_from_prebuilt_value(RGenOp, error_value) redboxbuilder = rvalue.ll_redboxbuilder(FUNCTYPE.RESULT) self.redboxbuilder = redboxbuilder self.sigtoken = RGenOp.sigToken(FUNCTYPE) if operation_name == 'newlist': typename, method = 'list', 'oop_newlist' SELFTYPE = FUNCTYPE.RESULT.TO self.is_method = False elif operation_name == 'newdict': typename, method = 'dict', 'oop_newdict' SELFTYPE = FUNCTYPE.RESULT.TO self.is_method = False else: typename, method = operation_name.split('.') method = 'oop_%s_%s' % (typename, method) SELFTYPE = FUNCTYPE.ARGS[self.argtuple[0].n].TO self.is_method = True vmodule = __import__('pypy.jit.timeshifter.v%s' % (typename,), None, None, [method]) self.typedesc = vmodule.TypeDesc(hrtyper, SELFTYPE) self.ll_handler = getattr(vmodule, method) self.couldfold = getattr(self.ll_handler, 'couldfold', False) if self.couldfold: oopargcheck = ll_func.oopargcheck # required if couldfold=True # make a copy of the function, for specialization purposes oopargcheck = func_with_new_name(oopargcheck, 'argcheck_%s' % (method,)) ARGS = FUNCTYPE.ARGS residualargsources = self.residualargsources unrolling_ARGS = unrolling_iterable(ARGS) unrolling_OOPARGS = unrolling_iterable(enumerate(OOPARGTYPES)) 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) self.do_call = do_call # hack! to avoid confusion between the .typedesc attribute # of oopspecdescs of different types (lists, dicts, etc.) # let's use different subclasses for the oopspecdesc too. self.__class__ = globals()['OopSpecDesc_%s' % typename]
def __init__(self): self.boolkind = rgenop.kindToken(lltype.Bool) self.boolboxes = [rvalue.redbox_from_prebuilt_value(rgenop, False), rvalue.redbox_from_prebuilt_value(rgenop, True)]