[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