[pypy-commit] pypy var-in-Some: put AnnotatedValues in annotator.bindings instead of Somes

rlamy noreply at buildbot.pypy.org
Sat May 17 20:22:13 CEST 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: var-in-Some
Changeset: r71559:43c0d2e098d4
Date: 2014-05-17 19:21 +0100
http://bitbucket.org/pypy/pypy/changeset/43c0d2e098d4/

Log:	put AnnotatedValues in annotator.bindings instead of Somes

diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -33,7 +33,7 @@
             translator.annotator = self
         self.translator = translator
         self.pendingblocks = {}  # map {block: graph-containing-it}
-        self.bindings = {}       # map Variables to SomeValues
+        self.bindings = {}       # map Variables to AnnotatedValues
         self.annotated = {}      # set of blocks already seen
         self.added_blocks = None # see processblock() below
         self.links_followed = {} # set of links that have ever been followed
@@ -153,7 +153,7 @@
         elif isinstance(variable, Variable):
             cell = self.bindings.get(variable)
             if cell:
-                return cell.knowntype
+                return cell.ann.knowntype
             else:
                 return object
         else:
@@ -230,7 +230,7 @@
         "Gives the SomeValue corresponding to the given Variable or Constant."
         if isinstance(arg, Variable):
             try:
-                return self.bindings[arg]
+                return self.bindings[arg].ann
             except KeyError:
                 if default is not FAIL:
                     return default
@@ -242,19 +242,25 @@
             raise TypeError('Variable or Constant expected, got %r' % (arg,))
 
     def annvalue(self, arg):
-        return AnnotatedValue(arg, self.binding(arg))
+        if isinstance(arg, Variable):
+            return self.bindings[arg]
+        else:
+            return AnnotatedValue(arg, self.bookkeeper.immutablevalue(arg.value))
 
     def typeannotation(self, t):
         return signature.annotation(t, self.bookkeeper)
 
     def setbinding(self, arg, s_value):
         if arg in self.bindings:
-            assert s_value.contains(self.bindings[arg])
-        self.bindings[arg] = s_value
+            assert s_value.contains(self.bindings[arg].ann)
+            self.bindings[arg].ann = s_value
+        else:
+            self.bindings[arg] = AnnotatedValue(arg, s_value)
 
     def transfer_binding(self, v_target, v_source):
         assert v_source in self.bindings
-        self.bindings[v_target] = self.bindings[v_source]
+        self.bindings[v_target] = AnnotatedValue(v_target,
+                                                 self.bindings[v_source].ann)
 
     def warning(self, msg, pos=None):
         if pos is None:
@@ -293,7 +299,7 @@
         # get the (current) return value
         v = graph.getreturnvar()
         try:
-            return self.bindings[v]
+            return self.binding(v)
         except KeyError:
             # the function didn't reach any return statement so far.
             # (some functions actually never do, they always raise exceptions)
@@ -446,7 +452,7 @@
             # is known
             exits = block.exits
             if isinstance(block.exitswitch, Variable):
-                s_exitswitch = self.bindings[block.exitswitch]
+                s_exitswitch = self.binding(block.exitswitch)
                 if s_exitswitch.is_constant():
                     exits = [link for link in exits
                                   if link.exitcase == s_exitswitch.const]
@@ -485,8 +491,10 @@
 
         # mapping (exitcase, variable) -> s_annotation
         # that can be attached to booleans, exitswitches
-        knowntypedata = getattr(self.bindings.get(block.exitswitch),
-                                "knowntypedata", {})
+        knowntypedata = {}
+        if isinstance(block.exitswitch, Variable):
+            knowntypedata = getattr(self.binding(block.exitswitch),
+                                    "knowntypedata", {})
         for link in exits:
             self.follow_link(graph, link, knowntypedata)
         if block in self.notify:
diff --git a/rpython/annotator/test/test_annrpython.py b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -857,7 +857,8 @@
         s = a.build_types(snippet.harmonic, [int])
         assert s.knowntype == float
         # check that the list produced by range() is not mutated or resized
-        for s_value in a.bindings.values():
+        for value in a.bindings.values():
+            s_value = value.ann
             if isinstance(s_value, annmodel.SomeList):
                 assert not s_value.listdef.listitem.resized
                 assert not s_value.listdef.listitem.mutated
@@ -2751,8 +2752,8 @@
         a = self.RPythonAnnotator()
         a.build_types(f, [])
         v1, v2 = graphof(a, readout).getargs()
-        assert not a.bindings[v1].is_constant()
-        assert not a.bindings[v2].is_constant()
+        assert not a.binding(v1).is_constant()
+        assert not a.binding(v2).is_constant()
 
     def test_prebuilt_mutables_dont_use_eq(self):
         # test that __eq__ is not called during annotation, at least
diff --git a/rpython/rlib/test/test_signature.py b/rpython/rlib/test/test_signature.py
--- a/rpython/rlib/test/test_signature.py
+++ b/rpython/rlib/test/test_signature.py
@@ -19,7 +19,7 @@
 def sigof(a, f):
     # returns [param1, param2, ..., ret]
     g = graphof(a.translator, f)
-    return [a.bindings[v] for v in g.startblock.inputargs] + [a.bindings[g.getreturnvar()]]
+    return [a.binding(v) for v in g.startblock.inputargs] + [a.binding(g.getreturnvar())]
 
 def getsig(f, policy=None):
     a = annotate_at(f, policy=policy)
diff --git a/rpython/tool/error.py b/rpython/tool/error.py
--- a/rpython/tool/error.py
+++ b/rpython/tool/error.py
@@ -106,7 +106,7 @@
 def format_simple_call(annotator, oper, msg):
     msg.append("Occurred processing the following simple_call:")
     try:
-        descs = annotator.bindings[oper.args[0]].descriptions
+        descs = annotator.binding(oper.args[0]).descriptions
     except (KeyError, AttributeError), e:
         msg.append("      (%s getting at the binding!)" % (
             e.__class__.__name__,))
diff --git a/rpython/translator/tool/graphpage.py b/rpython/translator/tool/graphpage.py
--- a/rpython/translator/tool/graphpage.py
+++ b/rpython/translator/tool/graphpage.py
@@ -107,7 +107,8 @@
         # make the dictionary of links -- one per annotated variable
         self.current_value = {}
         if self.annotator:
-            for var, s_value in self.annotator.bindings.items():
+            for var, value in self.annotator.bindings.items():
+                s_value = value.ann
                 info = '%s: %s' % (var.name, s_value)
                 annotationcolor = getattr(s_value, 'annotationcolor', None)
                 self.links[var.name] = info, annotationcolor
diff --git a/rpython/translator/transform.py b/rpython/translator/transform.py
--- a/rpython/translator/transform.py
+++ b/rpython/translator/transform.py
@@ -178,8 +178,7 @@
     assert 0 <= n < len(block.operations)
     # chop off the unreachable end of the block
     del block.operations[n+1:]
-    s_impossible = annmodel.SomeImpossibleValue()
-    self.bindings[block.operations[n].result] = s_impossible
+    self.setbinding(block.operations[n].result, annmodel.s_ImpossibleValue)
     # insert the equivalent of 'raise AssertionError'
     graph = self.annotated[block]
     msg = "Call to %r should have raised an exception" % (getattr(graph, 'func', None),)


More information about the pypy-commit mailing list