Author: Ronan Lamy <ronan.l...@gmail.com> Branch: var-in-Some Changeset: r71574:7b1cd4d2bbb9 Date: 2014-05-19 01:11 +0100 http://bitbucket.org/pypy/pypy/changeset/7b1cd4d2bbb9/
Log: register specialised annotators for op.is_ diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py --- a/rpython/annotator/binaryop.py +++ b/rpython/annotator/binaryop.py @@ -24,6 +24,40 @@ if oper.dispatch == 2]) +@op.is_.register(SomeObject, SomeObject) +def is__default(obj1, obj2): + r = SomeBool() + s_obj1 = obj1.ann + s_obj2 = obj2.ann + if s_obj2.is_constant(): + if s_obj1.is_constant(): + r.const = s_obj1.const is s_obj2.const + if s_obj2.const is None and not s_obj1.can_be_none(): + r.const = False + elif s_obj1.is_constant(): + if s_obj1.const is None and not s_obj2.can_be_none(): + r.const = False + knowntypedata = {} + + def bind(src_obj, tgt_obj): + if hasattr(tgt_obj.ann, 'is_type_of') and src_obj.ann.is_constant(): + add_knowntypedata( + knowntypedata, True, + [inst.value for inst in tgt_obj.ann.is_type_of], + getbookkeeper().valueoftype(src_obj.ann.const)) + add_knowntypedata(knowntypedata, True, [tgt_obj.value], src_obj.ann) + s_nonnone = tgt_obj.ann + if (src_obj.ann.is_constant() and src_obj.ann.const is None and + tgt_obj.ann.can_be_none()): + s_nonnone = tgt_obj.ann.nonnoneify() + add_knowntypedata(knowntypedata, + False, [tgt_obj.value], s_nonnone) + + bind(obj2, obj1) + bind(obj1, obj2) + r.set_knowntypedata(knowntypedata) + return r + class __extend__(pairtype(SomeObject, SomeObject)): def union((obj1, obj2)): @@ -94,47 +128,6 @@ else: return SomeInteger() - def is_((obj1, obj2)): - r = SomeBool() - if obj2.is_constant(): - if obj1.is_constant(): - r.const = obj1.const is obj2.const - if obj2.const is None and not obj1.can_be_none(): - r.const = False - elif obj1.is_constant(): - if obj1.const is None and not obj2.can_be_none(): - r.const = False - # XXX HACK HACK HACK - # XXX HACK HACK HACK - # XXX HACK HACK HACK - bk = getbookkeeper() - if bk is not None: # for testing - op = bk._find_current_op("is_", 2) - knowntypedata = {} - annotator = bk.annotator - - def bind(src_obj, tgt_obj, tgt_arg): - if hasattr(tgt_obj, 'is_type_of') and src_obj.is_constant(): - add_knowntypedata( - knowntypedata, True, - [inst.value for inst in 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) - - bind(obj2, obj1, 0) - bind(obj1, obj2, 1) - r.set_knowntypedata(knowntypedata) - - return r - def divmod((obj1, obj2)): return SomeTuple([pair(obj1, obj2).div(), pair(obj1, obj2).mod()]) @@ -742,25 +735,24 @@ s_self = unionof(bltn1.s_self, bltn2.s_self) return SomeBuiltin(bltn1.analyser, s_self, methodname=bltn1.methodname) +@op.is_.register(SomePBC, SomePBC) +def is__PBC_PBC(pbc1, pbc2): + s = is__default(pbc1, pbc2) + if not s.is_constant(): + if not pbc1.ann.can_be_None or not pbc2.ann.can_be_None: + for desc in pbc1.ann.descriptions: + if desc in pbc2.ann.descriptions: + break + else: + s.const = False # no common desc in the two sets + return s + class __extend__(pairtype(SomePBC, SomePBC)): - def union((pbc1, pbc2)): d = pbc1.descriptions.copy() d.update(pbc2.descriptions) return SomePBC(d, can_be_None = pbc1.can_be_None or pbc2.can_be_None) - def is_((pbc1, pbc2)): - thistype = pairtype(SomePBC, SomePBC) - s = super(thistype, pair(pbc1, pbc2)).is_() - if not s.is_constant(): - if not pbc1.can_be_None or not pbc2.can_be_None: - for desc in pbc1.descriptions: - if desc in pbc2.descriptions: - break - else: - s.const = False # no common desc in the two sets - return s - class __extend__(pairtype(SomeImpossibleValue, SomeObject)): def union((imp1, obj2)): return obj2 diff --git a/rpython/annotator/test/test_model.py b/rpython/annotator/test/test_model.py --- a/rpython/annotator/test/test_model.py +++ b/rpython/annotator/test/test_model.py @@ -20,25 +20,6 @@ class C(object): pass -class DummyClassDef: - def __init__(self, cls=C): - self.cls = cls - self.name = cls.__name__ - -si0 = SomeInstance(DummyClassDef(), True) -si1 = SomeInstance(DummyClassDef()) -sTrue = SomeBool() -sTrue.const = True -sFalse = SomeBool() -sFalse.const = False - -def test_is_None(): - assert pair(s_None, s_None).is_() == sTrue - assert pair(si1, s_None).is_() == sFalse - assert pair(si0, s_None).is_() != sTrue - assert pair(si0, s_None).is_() != sFalse - assert pair(si0, s_None).is_() == SomeBool() - def test_equality(): assert s1 != s2 != s3 != s4 != s5 != s6 assert s1 == SomeType() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit