def rtype_instantiate(hop): if hop.args_s[0].is_constant(): ## INSTANCE = hop.s_result.rtyper_makerepr(hop.rtyper).lowleveltype ## v_instance = hop.inputconst(ootype.Void, INSTANCE) ## hop2 = hop.copy() ## hop2.r_s_popfirstarg() ## s_instance = hop.rtyper.annotator.bookkeeper.immutablevalue(INSTANCE) ## hop2.v_s_insertfirstarg(v_instance, s_instance) ## return rtype_new(hop2) r_instance = hop.s_result.rtyper_makerepr(hop.rtyper) return r_instance.new_instance(hop.llops) else: r_instance = hop.s_result.rtyper_makerepr(hop.rtyper) INSTANCE = r_instance.lowleveltype class_repr = rclass.get_type_repr(hop.rtyper) v_cls = hop.inputarg(class_repr, arg=0) v_obj = hop.genop('runtimenew', [v_cls], resulttype=ootype.ROOT) v_instance = hop.genop('oodowncast', [v_obj], resulttype=hop.r_result.lowleveltype) return v_instance
def rtype_builtin_isinstance(hop): if hop.s_result.is_constant(): return hop.inputconst(ootype.Bool, hop.s_result.const) if hop.args_s[1].is_constant() and hop.args_s[1].const == list: if hop.args_s[0].knowntype != list: raise TyperError("isinstance(x, list) expects x to be known statically to be a list or None") v_list = hop.inputarg(hop.args_r[0], arg=0) return hop.genop('oononnull', [v_list], resulttype=ootype.Bool) class_repr = rclass.get_type_repr(hop.rtyper) instance_repr = hop.args_r[0] assert isinstance(instance_repr, rclass.InstanceRepr) v_obj, v_cls = hop.inputargs(instance_repr, class_repr) if isinstance(v_cls, Constant): c_cls = hop.inputconst(ootype.Void, v_cls.value._INSTANCE) return hop.genop('instanceof', [v_obj, c_cls], resulttype=ootype.Bool) else: return hop.gendirectcall(ll_isinstance, v_obj, v_cls)
def rtype_builtin_isinstance(hop): if hop.s_result.is_constant(): return hop.inputconst(ootype.Bool, hop.s_result.const) if hop.args_s[1].is_constant() and hop.args_s[1].const == list: if hop.args_s[0].knowntype != list: raise TyperError("isinstance(x, list) expects x to be known statically to be a list or None") v_list = hop.inputarg(hop.args_r[0], arg=0) return hop.genop('oononnull', [v_list], resulttype=ootype.Bool) class_repr = rclass.get_type_repr(hop.rtyper) instance_repr = hop.args_r[0] assert isinstance(instance_repr, rclass.InstanceRepr) v_obj, v_cls = hop.inputargs(instance_repr, class_repr) if isinstance(v_cls, Constant): c_cls = hop.inputconst(ootype.Void, v_cls.value.class_._INSTANCE) return hop.genop('instanceof', [v_obj, c_cls], resulttype=ootype.Bool) else: return hop.gendirectcall(ll_isinstance, v_obj, v_cls)