[pypy-dev] [pypy-commit] pypy default: "eh". On pypy we need to be careful in which order we have pendingblocks.

Antonio Cuni anto.cuni at gmail.com
Thu Nov 9 04:07:02 EST 2017


Hi,

I suppose that the explanation that you put in the commit message should
also go in a comment inside the source code, else when someone sees it it's
just obscure.
Also, it'd be nice to have some tests about ShuffleDict :)

On Thu, Nov 9, 2017 at 2:55 AM, fijal <pypy.commits at gmail.com> wrote:

> Author: fijal
> Branch:
> Changeset: r92981:cb9634421fa2
> Date: 2017-11-08 17:54 -0800
> http://bitbucket.org/pypy/pypy/changeset/cb9634421fa2/
>
> Log:    "eh". On pypy we need to be careful in which order we have
>         pendingblocks. Otherwise we end up in a setup where we have blocks
>         a, b and c where a and b are blocked because c needs to add an
>         attribute, but c is never appended since popitem() would always
>         return an a or b. I wonder if the same condition can be repeated on
>         CPython, but I cannot. Unclear how would you write a test for it
>         since it depends on dictionary order.
>
> diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/
> annrpython.py
> --- a/rpython/annotator/annrpython.py
> +++ b/rpython/annotator/annrpython.py
> @@ -15,10 +15,34 @@
>      typeof, s_ImpossibleValue, SomeInstance, intersection, difference)
>  from rpython.annotator.bookkeeper import Bookkeeper
>  from rpython.rtyper.normalizecalls import perform_normalizations
> +from collections import deque
>
>  log = AnsiLogger("annrpython")
>
>
> +class ShuffleDict(object):
> +    def __init__(self):
> +        self._d = {}
> +        self.keys = deque()
> +
> +    def __setitem__(self, k, v):
> +        if k in self._d:
> +            self._d[k] = v
> +        else:
> +            self._d[k] = v
> +            self.keys.append(k)
> +
> +    def __getitem__(self, k):
> +        return self._d[k]
> +
> +    def popitem(self):
> +        key = self.keys.popleft()
> +        item = self._d.pop(key)
> +        return (key, item)
> +
> +    def __nonzero__(self):
> +        return bool(self._d)
> +
>  class RPythonAnnotator(object):
>      """Block annotator for RPython.
>      See description in doc/translation.txt."""
> @@ -33,7 +57,7 @@
>              translator = TranslationContext()
>              translator.annotator = self
>          self.translator = translator
> -        self.pendingblocks = {}  # map {block: graph-containing-it}
> +        self.pendingblocks = ShuffleDict()  # map {block:
> graph-containing-it}
>          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
> _______________________________________________
> pypy-commit mailing list
> pypy-commit at python.org
> https://mail.python.org/mailman/listinfo/pypy-commit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20171109/63dda93d/attachment.html>


More information about the pypy-dev mailing list