classification
Title: test_slice: gc_decref: Assertion "gc_get_refs(g) > 0" failed: refcount is too small
Type: Stage: resolved
Components: Tests Versions: Python 3.8, Python 3.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: josh.r, miss-islington, pablogsal, tim.peters, vstinner, xtreak
Priority: Keywords: patch

Created on 2019-02-11 01:25 by pablogsal, last changed 2019-02-13 11:52 by vstinner. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 11828 closed vstinner, 2019-02-12 18:23
PR 11830 closed vstinner, 2019-02-12 19:18
PR 11839 merged miss-islington, 2019-02-13 11:32
Messages (29)
msg335185 - (view) Author: Pablo Galindo Salgado (pablogsal) * (Python committer) Date: 2019-02-11 01:25
I am seeing some failures in travis and some buildbots:

0:02:24 load avg: 3.30 [147/420/1] test_slice crashed (Exit code -6) -- running: test_multiprocessing_spawn (32 sec 523 ms), test_asyncio (45 sec 433 ms), test_multiprocessing_forkserver (47 sec 869 ms)
Modules/gcmodule.c:110: gc_decref: Assertion "gc_get_refs(g) > 0" failed: refcount is too small
Enable tracemalloc to get the memory block allocation traceback
object  : <test.test_slice.SliceTest.test_cmp.<locals>.BadCmp object at 0x2ab2051faef0>
type    : BadCmp
refcount: 1
address : 0x2ab2051faef0
Fatal Python error: _PyObject_AssertFailed
Current thread 0x00002ab1fe0519c0 (most recent call first):
  File "/home/travis/build/python/cpython/Lib/test/test_slice.py", line 107 in <lambda>
  File "/home/travis/build/python/cpython/Lib/unittest/case.py", line 197 in handle
  File "/home/travis/build/python/cpython/Lib/unittest/case.py", line 782 in assertRaises
  File "/home/travis/build/python/cpython/Lib/test/test_slice.py", line 107 in test_cmp
  File "/home/travis/build/python/cpython/Lib/unittest/case.py", line 642 in run
  File "/home/travis/build/python/cpython/Lib/unittest/case.py", line 702 in __call__
  File "/home/travis/build/python/cpython/Lib/unittest/suite.py", line 122 in run
  File "/home/travis/build/python/cpython/Lib/unittest/suite.py", line 84 in __call__
  File "/home/travis/build/python/cpython/Lib/unittest/suite.py", line 122 in run
  File "/home/travis/build/python/cpython/Lib/unittest/suite.py", line 84 in __call__
  File "/home/travis/build/python/cpython/Lib/unittest/suite.py", line 122 in run
  File "/home/travis/build/python/cpython/Lib/unittest/runner.py", line 176 in run
  File "/home/travis/build/python/cpython/Lib/test/support/__init__.py", line 1935 in _run_suite
  File "/home/travis/build/python/cpython/Lib/test/support/__init__.py", line 2031 in run_unittest
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/runtest.py", line 178 in test_runner
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/runtest.py", line 182 in runtest_inner
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/runtest.py", line 127 in runtest
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/runtest_mp.py", line 68 in run_tests_worker
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/main.py", line 600 in _main
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/main.py", line 586 in main
  File "/home/travis/build/python/cpython/Lib/test/libregrtest/main.py", line 640 in main
  File "/home/travis/build/python/cpython/Lib/test/regrtest.py", line 46 in _main
  File "/home/travis/build/python/cpython/Lib/test/regrtest.py", line 50 in <module>
  File "/home/travis/build/python/cpython/Lib/runpy.py", line 85 in _run_code

Usually, this happens with test_slice but when the test runner runs test_slice in isolation, it succeeds.

I am afraid that this will be a weird combination of tests.
msg335191 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python triager) Date: 2019-02-11 02:55
I too saw this a week back but couldn't reproduce it. There is one another test that fails like this and passes on verbose mode issue35809 . Travis doesn't report tests that fail in the complete run and pass during verbose run like buildbots do.
msg335326 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 16:47
bpo-35977 has been marked as a duplicate, copy of the first message:

s390x Debian 3.x:
https://buildbot.python.org/all/#/builders/13/builds/2344

0:06:26 load avg: 0.92 [291/420/1] test_slice crashed (Exit code -6)
Modules/gcmodule.c:110: gc_decref: Assertion "gc_get_refs(g) > 0" failed: refcount is too small
Enable tracemalloc to get the memory block allocation traceback

object  : <test.test_slice.SliceTest.test_cmp.<locals>.BadCmp object at 0x3ff93967e90>
type    : BadCmp
refcount: 1
address : 0x3ff93967e90
Fatal Python error: _PyObject_AssertFailed

Current thread 0x000003ff95272700 (most recent call first):
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/test/test_slice.py", line 107 in <lambda>
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/unittest/case.py", line 197 in handle
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/unittest/case.py", line 782 in assertRaises
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/test/test_slice.py", line 107 in test_cmp
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/unittest/case.py", line 642 in run
  File "/home/dje/cpython-buildarea/3.x.edelsohn-debian-z/build/Lib/unittest/case.py", line 702 in __call__
  ...
msg335327 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 16:49
> I am seeing some failures in travis and some buildbots:

Do you have an url to an example of crash on Travis?

Which buildbots are affected? I saw the crash on s390x Debian 3.x.
msg335328 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 16:49
I'm unable to reproduce the issue on my Fedora 29 (x86-64) laptop. I used two terminals:

* ./python -m test -F -j0 test_slice test_slice test_slice test_slice test_slice test_slice test_slice test_slice
* ./python -m test -j0 -u all,-gui -r # stress the system to randomize timings in test_slice
msg335329 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 16:54
Extract of the crashing test:

    def test_cmp(self):
        ...

        class Exc(Exception):
            pass

        class BadCmp(object):
            def __eq__(self, other):
                raise Exc

        s1 = slice(BadCmp())
        s2 = slice(BadCmp())
        self.assertEqual(s1, s1)
        self.assertRaises(Exc, lambda: s1 == s2)   # <==== CRASH HERE

        ...

The latest change in test_slice.py has been made in 2016: 3 years ago.

Latest changes in Objects/sliceobject.c were refactoring related to header files (november 2018). The latest "significant" change was done in April 2018: "bpo-33012: Fix invalid function cast warnings with gcc 8 for METH_NOARGS".

I bet more on a recent change which is not directly related to slices... like the implementation of the PEP 572? It would help to know when the crash started to occur exactly (date + time).
msg335330 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 16:55
Lukasz: I'm not sure what is happening here, but such random bugs are always scrary. I raise the priority to "release blocker" until we know more about the issue.
msg335331 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 17:05
On s390x Debian 3.x, it seems like the bug started to show up near:
https://buildbot.python.org/all/#/builders/13/builds/2328

This build contains 2 changes, one doc change and this namedtuple change which mentions reference count:

https://github.com/python/cpython/commit/64360ada0f6123a051e9dc6cd04f030ec1322e46

"Complete and neaten-up namedtuple's replacement of builtin function lookups with derefs (GH-11794)"

Ok, but I don't see the relationship between namedtupled and this specific test!?
msg335332 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python triager) Date: 2019-02-12 17:06
> Do you have an url to an example of crash on Travis?

Travis crash that occurred few days back : https://travis-ci.org/python/cpython/jobs/491701299 . I first noticed it on an IDLE lib PR where this failure was unrelated but I can remember occurring at least few weeks back. I will try get the older one. Sorry I forgot to file an issue during that time.
msg335333 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 17:13
Ah! I found a way to reproduce the crash:

diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py
index 4ae4142c60..b18f8f1c8c 100644
--- a/Lib/test/test_slice.py
+++ b/Lib/test/test_slice.py
@@ -1,4 +1,8 @@
 # tests for slice objects; in particular the indices method.
+import gc, random
+n = random.randint(1, 700)
+print("set_threshold(%s)" % n)
+gc.set_threshold(n)
 
 import itertools
 import operator


$ ./python -m test -F -j0 test_slice test_slice test_slice test_slice test_slice test_slice test_slice test_slice


I went up to January 1st, 2018 (commit e8ed96550c6aa9a1e39c36e67e892994e25e2c41): the test already crashed with my patch, so it's not a regression. I reset the priority.
msg335334 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 17:14
See also this idea of changing gc.set_threshold() when using -X dev:
https://mail.python.org/pipermail/python-dev/2018-June/153857.html
msg335336 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python triager) Date: 2019-02-12 17:25
It has been crashing for almost all the last 5 PRs merged to master : 

https://travis-ci.org/python/cpython/jobs/492241988 - Feb 12, 21:51
https://travis-ci.org/python/cpython/jobs/492123432 - Feb 12, 17:33
https://travis-ci.org/python/cpython/jobs/491917875 - Feb 12, 06:20
https://travis-ci.org/python/cpython/jobs/491898690 - Feb 12, 05:15
https://travis-ci.org/python/cpython/jobs/491798997 - Feb 12, 01:19

It's easy to overlook this since PR passes on verbose mode . There is another test these days that fails very frequently but passes on verbose mode : issue35809 . It's little hard to track their first failure since Travis provides no search capability for logs.
msg335339 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 17:56
I removed Lukasz from the nosy list since it's not a regression. No need to spam our 3.8 release manager ;-)
msg335341 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 18:24
Extract of slice_richcompare():

    t1 = PyTuple_New(3);
    if (t1 == NULL)
        return NULL;
    t2 = PyTuple_New(3);
    if (t2 == NULL) {
        Py_DECREF(t1);
        return NULL;
    }

    PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start);
    PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop);
    PyTuple_SET_ITEM(t1, 2, ((PySliceObject *)v)->step);
    PyTuple_SET_ITEM(t2, 0, ((PySliceObject *)w)->start);
    PyTuple_SET_ITEM(t2, 1, ((PySliceObject *)w)->stop);
    PyTuple_SET_ITEM(t2, 2, ((PySliceObject *)w)->step);

    res = PyObject_RichCompare(t1, t2, op);

    PyTuple_SET_ITEM(t1, 0, NULL);
    PyTuple_SET_ITEM(t1, 1, NULL);
    PyTuple_SET_ITEM(t1, 2, NULL);
    PyTuple_SET_ITEM(t2, 0, NULL);
    PyTuple_SET_ITEM(t2, 1, NULL);
    PyTuple_SET_ITEM(t2, 2, NULL);

    Py_DECREF(t1);
    Py_DECREF(t2);

    return res;

t1 and t2 tuples are tracked by the GC, but t1 and t2 items are *borrowed* references.

gc.collect() calls subtract_refs() which decreases the reference counter of all objects tracked by the GC... but v, w, t1 and t2 contain the same references which causes the assertion error.

The code is quite old:

commit 47b9ff6ba11fab4c90556357c437cb4feec1e853
Author: Guido van Rossum <guido@python.org>
Date:   Thu Aug 24 00:41:19 2006 +0000

    Restructure comparison dramatically.  There is no longer a default
    *ordering* between objects; there is only a default equality test
    (defined by an object being equal to itself only).  Read the comment
    in object.c.  The current implementation never uses a three-way
    comparison to compute a rich comparison, but it does use a rich
    comparison to compute a three-way comparison.  I'm not quite done
    ripping out all the calls to PyObject_Compare/Cmp, or replacing
    tp_compare implementations with tp_richcompare implementations;
    but much of that has happened (to make most unit tests pass).
    (...)

+static PyObject *
+slice_richcompare(PyObject *v, PyObject *w, int op)
...
+       t1 = PyTuple_New(3);
+       t2 = PyTuple_New(3);
+       if (t1 == NULL || t2 == NULL)
+               return NULL;
+
+       PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start);
+       PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop);
+       PyTuple_SET_ITEM(t1, 2, ((PySliceObject *)v)->step);
+       PyTuple_SET_ITEM(t2, 0, ((PySliceObject *)w)->start);
+       PyTuple_SET_ITEM(t2, 1, ((PySliceObject *)w)->stop);
+       PyTuple_SET_ITEM(t2, 2, ((PySliceObject *)w)->step);
...

I see two options:

* Ensure that t1 and t2 temporary objects are not tracked by the GC
* Modify slice_richcompare() to use strong references, rather than *borrowed* references

I wrote PR 11828 which implements the first solution. The second solution has a minor impact on performance.
msg335344 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 18:46
It's impressive *and* scary that such 13 years old bug only show up today...

I modified the GC threshold in the site module with this patch:

diff --git a/Lib/site.py b/Lib/site.py
index ad1146332b..68cdf105b1 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -557,6 +557,10 @@ def main():
     This function is called automatically when this module is imported,
     unless the python interpreter was started with the -S flag.
     """
+    import gc, random
+    n = random.randint(5, 100)
+    gc.set_threshold(n)
+
     global ENABLE_USER_SITE
 
     orig_path = sys.path[:]


Running the test suite with this patch doesn't catch the bug :-(

$ ./python -m test -j0 -r -u all,-gui
msg335346 - (view) Author: Josh Rosenberg (josh.r) * (Python triager) Date: 2019-02-12 18:59
Victor found the same bug I found while I was composing this, posting only to incorporate proposed solution:

I *think* I have a cause for this, but someone else with greater understanding of the cycle collector should check me if the suggested fix has non-trivial performance implications (I suspect the answer is no, performance is unaffected).

slice_richcompare borrows its behavior from tuple by creating a temporary tuple for each slice, the delegating to the tuple comparison ( https://github.com/python/cpython/blob/master/Objects/sliceobject.c#L591 ).

Problem is, it uses borrowed references when creating said tuples, not owned references. Because test_slice's BadCmp.__eq__ is implemented in Python, the comparison can be interrupted by cycle collection during the __eq__ call. When then happens, there are precisely two references to the BadCmp object:

1. In the slice (owned)
2. In the temporary tuple (borrowed)

When a cycle collection occurs during the comparison, and subtract_refs ( https://github.com/python/cpython/blob/master/Modules/gcmodule.c#L398 ) is called, the BadCmp object in question is visited via both the slice and the tuple, and since it has no non-container objects referencing it, it ends up with the initial reference count of 1 attempting to drop to -1, and the assertion is violated. While the code of gcmodule.c appears to have been refactored since 3.7 so the assert occurs in a different function, with a slightly different message, it would break the same way in both 3.7 and master, and whether or not it triggers the bug, the broken behavior of slice_richcompare hasn't changed for a *long* time. 

Underlying problem would seem to be slice's richcompare believing it's okay to make a tuple from borrowed references, then make a call on it that can trigger calls into Python level code (and therefore into the cycle collector); everything else is behaving correctly here. I'm guessing the only reason it's not seen in the wild is that slices based on Python defined types are almost never compared at all, let alone compared on debug builds that would be checking the assert and with an accelerated cycle collection cycle that would make a hit likely.

Solution would be to stop trying to microoptimize slice_richcompare to avoid reference count manipulation and just build a proper tuple. It would even simplify the code since we could just use PyTuple_Pack, reducing custom code by replacing:

    t1 = PyTuple_New(3);
    if (t1 == NULL)
        return NULL;
    t2 = PyTuple_New(3);
    if (t2 == NULL) {
        Py_DECREF(t1);
        return NULL;
    }

    PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start);
    PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop);
    PyTuple_SET_ITEM(t1, 2, ((PySliceObject *)v)->step);
    PyTuple_SET_ITEM(t2, 0, ((PySliceObject *)w)->start);
    PyTuple_SET_ITEM(t2, 1, ((PySliceObject *)w)->stop);
    PyTuple_SET_ITEM(t2, 2, ((PySliceObject *)w)->step);

with:

    t1 = PyTuple_Pack(3, ((PySliceObject *)v)->start, ((PySliceObject *)v)->stop, ((PySliceObject *)v)->step);
    if (t1 == NULL)
        return NULL;
    t2 = PyTuple_Pack(3, ((PySliceObject *)w)->start, ((PySliceObject *)w)->stop, ((PySliceObject *)w)->step);
    if (t2 == NULL) {
        Py_DECREF(t1);
        return NULL;
    }

and makes cleanup simpler, since you can just delete:

    PyTuple_SET_ITEM(t1, 0, NULL);
    PyTuple_SET_ITEM(t1, 1, NULL);
    PyTuple_SET_ITEM(t1, 2, NULL);
    PyTuple_SET_ITEM(t2, 0, NULL);
    PyTuple_SET_ITEM(t2, 1, NULL);
    PyTuple_SET_ITEM(t2, 2, NULL);

and let the DECREFs for t1/t2 do their work normally.

If for some reason the reference count manipulation is unacceptable, this *could* switch between two behaviors depending on whether or not start/stop/step are of known types (e.g. if all are NoneType/int, this could use the borrowed refs code path safely) where a call back into Python level code is impossible; given that slices are usually made of None and/or ints, this would remove most of the cost for the common case, at the expense of more complicated code. Wouldn't help numpy types though, and I suspect the cost of pre-checking the types for all six values involved would eliminate most of the savings.

Sorry for not submitting a proper PR; the work machine I use during the day is not suitable for development (doesn't even have Python installed).
msg335347 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2019-02-12 19:00
> It's impressive *and* scary that such 13 years old
> bug only show up today...

Then again, there's probably no other code in the world that compares slice objects ;-)
msg335349 - (view) Author: Josh Rosenberg (josh.r) * (Python triager) Date: 2019-02-12 19:11
Ah, I see Victor posted an alternative PR that avoids the reference counting overhead by explicitly removing the temporary tuples from GC tracking. I'm mildly worried by that approach, only because the only documented use case for PyObject_GC_UnTrack is in tp_dealloc (that said, the code explicitly allows it to be called twice due to the Py_TRASHCAN mechanism, so it's probably safe so long as the GC design never changes dramatically). If slice comparison really is performance sensitive enough to justify this, so be it, but I'd personally prefer to reduce the custom code involved in a rarely used code path (we're not even caching constant slices yet, so no comparisons are likely to occur for 99.99% of slices, right?).
msg335350 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 19:19
I wrote PR 11830: the other solution that I propose, use strong references rather than borrowed references.
msg335351 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2019-02-12 19:20
Josh, I'd say the speed of this code doesn't matter one whit to anything.  Like you, I'd _prefer_ that the issue be fixed by building "real tuples" that own their own references, which would also (as you showed) allow for briefer, simpler, clearer code.  But I'm OK with playing obscure GC tricks too.
msg335352 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 19:21
> Then again, there's probably no other code in the world that compares slice objects ;-)

Well, that's a good explanation :-) So maybe there is no need to keep the micro-optimization and PR 11830 would be safer (use strong references), rather than PR 11828 (untrack the 2 internal tuples).
msg335353 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-12 19:29
Oh, Tim Peters succeded somehow to remove Josh Rosenberg from the nosy list: I add him again ;-)

Thanks Josh for your analysis, it seems like we agree :-) I wrote PR 11830 to use strong references, as you proposed.
msg335355 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2019-02-12 19:31
> Oh, Tim Peters succeded somehow to
> remove Josh Rosenberg from the nosy list: I add him again ;-)

Certainly wasn't my intent!  That happens too often on the tracker.  Thanks for noticing! :-(
msg335356 - (view) Author: Josh Rosenberg (josh.r) * (Python triager) Date: 2019-02-12 19:37
+1 on PR 11830 from me. Can always revisit if #11107 is ever implemented and it turns out that the reference count manipulation means startup is too slow due to all the slice interning triggered comparisons (unlikely, but theoretically possible I guess).
msg335416 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-13 11:32
New changeset dcb68f47f74b0cc8a1896d4a4c5a6b83c0bbeeae by Victor Stinner in branch 'master':
bpo-35961: Fix a crash in slice_richcompare() (GH-11830)
https://github.com/python/cpython/commit/dcb68f47f74b0cc8a1896d4a4c5a6b83c0bbeeae
msg335417 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-13 11:34
Python 2.7 is not affected: it doesn't have the slice_richcompare() function, but the old slice_compare() implementation.

Python 3.6 is affected but doesn't accept bugfixes anymore: https://devguide.python.org/#status-of-python-branches This bug is 13 years old, I don't think that it's really useful to fix it. It mostly impact test_slice and only test_slice.
msg335418 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-13 11:37
> This bug is 13 years old, I don't think that it's really useful to fix it. It mostly impact test_slice and only test_slice.

To be clear, I compiled Python 3.6 in release mode and applied test_slice patch of msg335333: no crash after 1500 runs. The bug is an assertion error, but assertions are only compiled in debug mode.
msg335420 - (view) Author: miss-islington (miss-islington) Date: 2019-02-13 11:49
New changeset a78251e2d6de37f46c230be924032a87df730761 by Miss Islington (bot) in branch '3.7':
bpo-35961: Fix a crash in slice_richcompare() (GH-11830)
https://github.com/python/cpython/commit/a78251e2d6de37f46c230be924032a87df730761
msg335423 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-02-13 11:52
Thanks everyone for helping on the analysis and for reviews obviously.
History
Date User Action Args
2019-02-13 11:52:47vstinnersetstatus: open -> closed
resolution: fixed
messages: + msg335423

stage: patch review -> resolved
2019-02-13 11:49:38miss-islingtonsetnosy: + miss-islington
messages: + msg335420
2019-02-13 11:37:21vstinnersetmessages: + msg335418
2019-02-13 11:34:32vstinnersetmessages: + msg335417
versions: - Python 3.6
2019-02-13 11:32:25miss-islingtonsetpull_requests: + pull_request11869
2019-02-13 11:32:01vstinnersetmessages: + msg335416
2019-02-12 19:37:23josh.rsetmessages: + msg335356
2019-02-12 19:31:09tim.peterssetmessages: + msg335355
2019-02-12 19:29:15vstinnersetnosy: tim.peters, vstinner, josh.r, pablogsal, xtreak
messages: + msg335353
2019-02-12 19:21:44vstinnersetmessages: + msg335352
2019-02-12 19:20:37tim.peterssetmessages: + msg335351
2019-02-12 19:19:51vstinnersetmessages: + msg335350
2019-02-12 19:18:24vstinnersetpull_requests: + pull_request11861
2019-02-12 19:11:40josh.rsetnosy: + josh.r

messages: + msg335349
versions: + Python 3.6, Python 3.7
2019-02-12 19:00:07tim.peterssetnosy: + tim.peters, - josh.r
messages: + msg335347
2019-02-12 18:59:49josh.rsetnosy: + josh.r
messages: + msg335346
2019-02-12 18:46:48vstinnersetmessages: + msg335344
2019-02-12 18:24:43vstinnersetmessages: + msg335341
2019-02-12 18:23:18vstinnersetkeywords: + patch
stage: patch review
pull_requests: + pull_request11859
2019-02-12 17:56:05vstinnersetnosy: - lukasz.langa
messages: + msg335339
2019-02-12 17:25:01xtreaksetmessages: + msg335336
2019-02-12 17:14:11vstinnersetmessages: + msg335334
2019-02-12 17:13:39vstinnersetpriority: release blocker ->

messages: + msg335333
2019-02-12 17:06:22xtreaksetmessages: + msg335332
2019-02-12 17:05:43vstinnersetmessages: + msg335331
2019-02-12 16:55:44vstinnersetpriority: normal -> release blocker
nosy: + lukasz.langa
messages: + msg335330

2019-02-12 16:54:43vstinnersetmessages: + msg335329
2019-02-12 16:49:58vstinnersetmessages: + msg335328
2019-02-12 16:49:43vstinnersetmessages: + msg335327
2019-02-12 16:47:35vstinnersettitle: gc_decref: Assertion "gc_get_refs(g) > 0" failed: refcount is too small -> test_slice: gc_decref: Assertion "gc_get_refs(g) > 0" failed: refcount is too small
2019-02-12 16:47:27vstinnersetnosy: + vstinner
messages: + msg335326
2019-02-12 16:47:07vstinnerlinkissue35977 superseder
2019-02-11 02:55:33xtreaksetnosy: + xtreak
messages: + msg335191
2019-02-11 01:25:10pablogsalcreate