Author: Ronan Lamy <[email protected]>
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])
[email protected]_.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)
[email protected]_.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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit