def builtin_isinstance(s_obj, s_type, variables=None): r = SomeBool() if s_type.is_constant(): typ = s_type.const if issubclass(typ, pypy.rlib.rarithmetic.base_int): r.const = issubclass(s_obj.knowntype, typ) else: if typ == long: getbookkeeper().warning("isinstance(., long) is not RPython") if s_obj.is_constant(): r.const = isinstance(s_obj.const, long) else: if type( s_obj ) is not SomeObject: # only SomeObjects could be longs # type(s_obj) < SomeObject -> SomeBool(False) # type(s_obj) == SomeObject -> SomeBool() r.const = False return r assert not issubclass( typ, (int, long)) or typ in (bool, int, long), ( "for integers only isinstance(.,int|r_uint) are supported") if s_obj.is_constant(): r.const = isinstance(s_obj.const, typ) elif our_issubclass(s_obj.knowntype, typ): if not s_obj.can_be_none(): r.const = True elif not our_issubclass(typ, s_obj.knowntype): r.const = False elif s_obj.knowntype == int and typ == bool: # xxx this will explode in case of generalisation # from bool to int, notice that isinstance( , bool|int) # is quite border case for RPython r.const = False # XXX HACK HACK HACK # XXX HACK HACK HACK # XXX HACK HACK HACK bk = getbookkeeper() if variables is None: fn, block, i = bk.position_key op = block.operations[i] assert op.opname == "simple_call" assert len(op.args) == 3 assert op.args[0] == Constant(isinstance) variables = [op.args[1]] for variable in variables: assert bk.annotator.binding(variable) == s_obj r.knowntypedata = {} if (not isinstance(s_type, SomeBuiltin) or typ.__module__ == '__builtin__'): add_knowntypedata(r.knowntypedata, True, variables, bk.valueoftype(typ)) return r
def builtin_isinstance(s_obj, s_type, variables=None): r = SomeBool() if s_type.is_constant(): typ = s_type.const if issubclass(typ, pypy.rlib.rarithmetic.base_int): r.const = issubclass(s_obj.knowntype, typ) else: if typ == long: getbookkeeper().warning("isinstance(., long) is not RPython") if s_obj.is_constant(): r.const = isinstance(s_obj.const, long) else: if type(s_obj) is not SomeObject: # only SomeObjects could be longs # type(s_obj) < SomeObject -> SomeBool(False) # type(s_obj) == SomeObject -> SomeBool() r.const = False return r assert not issubclass(typ, (int, long)) or typ in ( bool, int, long, ), "for integers only isinstance(.,int|r_uint) are supported" if s_obj.is_constant(): r.const = isinstance(s_obj.const, typ) elif our_issubclass(s_obj.knowntype, typ): if not s_obj.can_be_none(): r.const = True elif not our_issubclass(typ, s_obj.knowntype): r.const = False elif s_obj.knowntype == int and typ == bool: # xxx this will explode in case of generalisation # from bool to int, notice that isinstance( , bool|int) # is quite border case for RPython r.const = False # XXX HACK HACK HACK # XXX HACK HACK HACK # XXX HACK HACK HACK bk = getbookkeeper() if variables is None: fn, block, i = bk.position_key op = block.operations[i] assert op.opname == "simple_call" assert len(op.args) == 3 assert op.args[0] == Constant(isinstance) variables = [op.args[1]] for variable in variables: assert bk.annotator.binding(variable) == s_obj r.knowntypedata = {} if not isinstance(s_type, SomeBuiltin) or typ.__module__ == "__builtin__": add_knowntypedata(r.knowntypedata, True, variables, bk.valueoftype(typ)) return r
def is_true(s_obj): r = SomeBool() s_obj.is_true_behavior(r) bk = getbookkeeper() knowntypedata = r.knowntypedata = {} fn, block, i = bk.position_key op = block.operations[i] assert op.opname == "is_true" or op.opname == "nonzero" assert len(op.args) == 1 arg = op.args[0] s_nonnone_obj = s_obj if s_obj.can_be_none(): s_nonnone_obj = s_obj.nonnoneify() add_knowntypedata(knowntypedata, True, [arg], s_nonnone_obj) return r
def bind(src_obj, tgt_obj, tgt_arg): if hasattr(tgt_obj, 'is_type_of') and src_obj.is_constant(): add_knowntypedata(knowntypedata, True, tgt_obj.is_type_of, bk.valueoftype(src_obj.const)) assert annotator.binding(op.args[tgt_arg]) == tgt_obj add_knowntypedata(knowntypedata, True, [op.args[tgt_arg]], src_obj) nonnone_obj = tgt_obj if src_obj.is_constant() and src_obj.const is None and tgt_obj.can_be_none(): nonnone_obj = tgt_obj.nonnoneify() add_knowntypedata(knowntypedata, False, [op.args[tgt_arg]], nonnone_obj)
rarithmetic.signedtype(int2.knowntype)): return r knowntypedata = {} # XXX HACK HACK HACK fn, block, i = getbookkeeper().position_key op = block.operations[i] assert op.opname == opname assert len(op.args) == 2 def tointtype(int0): if int0.knowntype is bool: return int return int0.knowntype if int1.nonneg and isinstance(op.args[1], Variable): case = opname in ('lt', 'le', 'eq') add_knowntypedata(knowntypedata, case, [op.args[1]], SomeInteger(nonneg=True, knowntype=tointtype(int2))) if int2.nonneg and isinstance(op.args[0], Variable): case = opname in ('gt', 'ge', 'eq') add_knowntypedata(knowntypedata, case, [op.args[0]], SomeInteger(nonneg=True, knowntype=tointtype(int1))) if knowntypedata: r.knowntypedata = knowntypedata # a special case for 'x < 0' or 'x >= 0', # where 0 is a flow graph Constant # (in this case we are sure that it cannot become a r_uint later) if (isinstance(op.args[1], Constant) and type(op.args[1].value) is int and # filter out Symbolics op.args[1].value == 0): if int1.nonneg: if opname == 'lt': r.const = False