Author: Ronan Lamy <[email protected]>
Branch: anntype
Changeset: r80628:789ca6e9fa3b
Date: 2015-11-10 05:16 +0000
http://bitbucket.org/pypy/pypy/changeset/789ca6e9fa3b/

Log:    Turn knowntypedata into a dict of dicts

diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -479,7 +479,7 @@
         # that can be attached to booleans, exitswitches
         knowntypedata = {}
         if isinstance(block.exitswitch, Variable):
-            knowntypedata = getattr(self.binding(block.exitswitch),
+            knowntypedata = getattr(block.exitswitch.annotation,
                                     "knowntypedata", {})
         for link in exits:
             self.follow_link(graph, link, knowntypedata)
@@ -527,14 +527,14 @@
                 last_exc_value_vars.append(v_input)
             else:
                 s_out = self.annotation(v_out)
-                if (link.exitcase, v_out) in knowntypedata:
-                    knownvarvalue = knowntypedata[(link.exitcase, v_out)]
+                if link.exitcase in knowntypedata and v_out in 
knowntypedata[link.exitcase]:
+                    knownvarvalue = knowntypedata[link.exitcase][v_out]
                     s_out = pair(s_out, knownvarvalue).improve()
                     # ignore links that try to pass impossible values
                     if s_out == annmodel.s_ImpossibleValue:
                         ignore_link = True
 
-                if hasattr(s_out,'is_type_of'):
+                if hasattr(s_out, 'is_type_of'):
                     renamed_is_type_of = []
                     for v in s_out.is_type_of:
                         new_vs = renaming.get(v, [])
@@ -548,10 +548,12 @@
 
                 if hasattr(s_out, 'knowntypedata'):
                     renamed_knowntypedata = {}
-                    for (value, v), s in s_out.knowntypedata.items():
-                        new_vs = renaming.get(v, [])
-                        for new_v in new_vs:
-                            renamed_knowntypedata[value, new_v] = s
+                    for value, constraints in s_out.knowntypedata.items():
+                        renamed_knowntypedata[value] = {}
+                        for v, s in constraints.items():
+                            new_vs = renaming.get(v, [])
+                            for new_v in new_vs:
+                                renamed_knowntypedata[value][new_v] = s
                     assert isinstance(s_out, annmodel.SomeBool)
                     newcell = annmodel.SomeBool()
                     if s_out.is_constant():
diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -1,6 +1,7 @@
 """
 Binary operations between SomeValues.
 """
+from collections import defaultdict
 
 from rpython.tool.pairtype import pair, pairtype
 from rpython.annotator.model import (
@@ -35,7 +36,7 @@
     elif s_obj1.is_constant():
         if s_obj1.const is None and not s_obj2.can_be_none():
             r.const = False
-    knowntypedata = {}
+    knowntypedata = defaultdict(dict)
     bk = annotator.bookkeeper
 
     def bind(src_obj, tgt_obj):
@@ -264,7 +265,7 @@
         if not (rarithmetic.signedtype(s_int1.knowntype) and
                 rarithmetic.signedtype(s_int2.knowntype)):
             return r
-        knowntypedata = {}
+        knowntypedata = defaultdict(dict)
         def tointtype(s_int0):
             if s_int0.knowntype is bool:
                 return int
diff --git a/rpython/annotator/builtin.py b/rpython/annotator/builtin.py
--- a/rpython/annotator/builtin.py
+++ b/rpython/annotator/builtin.py
@@ -2,7 +2,7 @@
 Built-in functions.
 """
 import sys
-from collections import OrderedDict
+from collections import OrderedDict, defaultdict
 
 from rpython.annotator.model import (
     SomeInteger, SomeChar, SomeBool, SomeString, SomeTuple,
@@ -188,7 +188,7 @@
             variables = [op.args[1]]
         for variable in variables:
             assert bk.annotator.binding(variable) == s_obj
-        knowntypedata = {}
+        knowntypedata = defaultdict(dict)
         if not hasattr(typ, '_freeze_') and isinstance(s_type, SomePBC):
             add_knowntypedata(knowntypedata, True, variables, 
bk.valueoftype(typ))
         r.set_knowntypedata(knowntypedata)
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -32,7 +32,7 @@
 import inspect
 import weakref
 from types import BuiltinFunctionType, MethodType
-from collections import OrderedDict
+from collections import OrderedDict, defaultdict
 
 import rpython
 from rpython.tool import descriptor
@@ -690,14 +690,15 @@
 
 def add_knowntypedata(ktd, truth, vars, s_obj):
     for v in vars:
-        ktd[(truth, v)] = s_obj
+        ktd[truth][v] = s_obj
 
 
 def merge_knowntypedata(ktd1, ktd2):
-    r = {}
-    for truth_v in ktd1:
-        if truth_v in ktd2:
-            r[truth_v] = unionof(ktd1[truth_v], ktd2[truth_v])
+    r = defaultdict(dict)
+    for truth, constraints in ktd1.items():
+        for v in constraints:
+            if truth in ktd2 and v in ktd2[truth]:
+                r[truth][v] = unionof(ktd1[truth][v], ktd2[truth][v])
     return r
 
 
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -1,8 +1,9 @@
 """
 Unary operations on SomeValues.
 """
+from __future__ import absolute_import
 
-from __future__ import absolute_import
+from collections import defaultdict
 
 from rpython.tool.pairtype import pair
 from rpython.flowspace.operation import op
@@ -39,7 +40,7 @@
     s_nonnone_obj = annotator.annotation(obj)
     if s_nonnone_obj.can_be_none():
         s_nonnone_obj = s_nonnone_obj.nonnoneify()
-    knowntypedata = {}
+    knowntypedata = defaultdict(dict)
     add_knowntypedata(knowntypedata, True, [obj], s_nonnone_obj)
     r.set_knowntypedata(knowntypedata)
     return r
@@ -520,7 +521,7 @@
 def contains_String(annotator, string, char):
     if annotator.annotation(char).is_constant() and 
annotator.annotation(char).const == "\0":
         r = SomeBool()
-        knowntypedata = {}
+        knowntypedata = defaultdict(dict)
         add_knowntypedata(knowntypedata, False, [string],
                           annotator.annotation(string).nonnulify())
         r.set_knowntypedata(knowntypedata)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to