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