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

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Antonio Cuni
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 <[hidden email]> 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
[hidden email]
https://mail.python.org/mailman/listinfo/pypy-commit


_______________________________________________
pypy-dev mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/pypy-dev
Reply | Threaded
Open this post in threaded view
|

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

Armin Rigo-2
Hi,

On 9 November 2017 at 10:07, Antonio Cuni <[hidden email]> wrote:
> 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.

Done in d00a16ef468f.  I reverted the addition of ShuffleDict, and
instead made a two-lines tweak to the logic at the place where
ordering matters---with a long comment :-)


A bientôt,

Armin.
_______________________________________________
pypy-dev mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/pypy-dev
Reply | Threaded
Open this post in threaded view
|

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

Maciej Fijalkowski
ah indeed, that's a much better fix :-)

The original was done a bit haphazardly :-)

On Sun, Nov 19, 2017 at 11:07 PM, Armin Rigo <[hidden email]> wrote:

> Hi,
>
> On 9 November 2017 at 10:07, Antonio Cuni <[hidden email]> wrote:
>> 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.
>
> Done in d00a16ef468f.  I reverted the addition of ShuffleDict, and
> instead made a two-lines tweak to the logic at the place where
> ordering matters---with a long comment :-)
>
>
> A bientôt,
>
> Armin.
_______________________________________________
pypy-dev mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/pypy-dev