From 38cf835c95273dc20dd6cb3376c11a88b72c7fa9 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 13 Feb 2014 09:40:12 +0900 Subject: [PATCH 1/4] Rename --- test/test_unpack.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 test/test_unpack.py diff --git a/test/test_unpack.py b/test/test_unpack.py new file mode 100644 index 0000000..1563008 --- /dev/null +++ b/test/test_unpack.py @@ -0,0 +1,19 @@ +from io import BytesIO +from msgpack import Unpacker, packb, OutOfData +from pytest import raises + + +def test_unpack_array_header_from_file(): + f = BytesIO(packb([1,2,3,4])) + unpacker = Unpacker(f) + assert unpacker.read_array_header() == 4 + assert unpacker.unpack() == 1 + assert unpacker.unpack() == 2 + assert unpacker.unpack() == 3 + assert unpacker.unpack() == 4 + with raises(OutOfData): + unpacker.unpack() + + +if __name__ == '__main__': + test_unpack_array_header_from_file() From 0cab6092e456ffa04834233ffb01acb48d0869c3 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 13 Feb 2014 09:55:17 +0900 Subject: [PATCH 2/4] Add refcount check. --- test/test_unpack.py | 30 +++++++++++++++++++++++++++++- test/test_unpack_file.py | 19 ------------------- 2 files changed, 29 insertions(+), 20 deletions(-) delete mode 100644 test/test_unpack_file.py diff --git a/test/test_unpack.py b/test/test_unpack.py index 1563008..d6ca435 100644 --- a/test/test_unpack.py +++ b/test/test_unpack.py @@ -1,6 +1,7 @@ from io import BytesIO +import sys from msgpack import Unpacker, packb, OutOfData -from pytest import raises +from pytest import raises, mark def test_unpack_array_header_from_file(): @@ -15,5 +16,32 @@ def test_unpack_array_header_from_file(): unpacker.unpack() +@mark.skipif(not hasattr(sys, 'getrefcount'), + reason='sys.getrefcount() is needed to pass this test') +def test_unpacker_hook_refcnt(): + result = [] + + def hook(x): + result.append(x) + return x + + basecnt = sys.getrefcount(hook) + + up = Unpacker(object_pairs_hook=hook, list_hook=hook) + + assert sys.getrefcount(hook) >= basecnt + 2 + + up.feed(packb([{}])) + up.feed(packb([{}])) + assert up.unpack() == [{}] + assert up.unpack() == [{}] + assert result == [[{}], [{}]] + + del up + + assert sys.getrefcount(hook) == basecnt + + if __name__ == '__main__': test_unpack_array_header_from_file() + test_unpacker_hook_refcnt() diff --git a/test/test_unpack_file.py b/test/test_unpack_file.py deleted file mode 100644 index 1563008..0000000 --- a/test/test_unpack_file.py +++ /dev/null @@ -1,19 +0,0 @@ -from io import BytesIO -from msgpack import Unpacker, packb, OutOfData -from pytest import raises - - -def test_unpack_array_header_from_file(): - f = BytesIO(packb([1,2,3,4])) - unpacker = Unpacker(f) - assert unpacker.read_array_header() == 4 - assert unpacker.unpack() == 1 - assert unpacker.unpack() == 2 - assert unpacker.unpack() == 3 - assert unpacker.unpack() == 4 - with raises(OutOfData): - unpacker.unpack() - - -if __name__ == '__main__': - test_unpack_array_header_from_file() From cf63f19211797261b117227f23066952efebca29 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 13 Feb 2014 09:57:51 +0900 Subject: [PATCH 3/4] Fix test --- test/test_unpack.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_unpack.py b/test/test_unpack.py index d6ca435..544cebf 100644 --- a/test/test_unpack.py +++ b/test/test_unpack.py @@ -27,7 +27,7 @@ def test_unpacker_hook_refcnt(): basecnt = sys.getrefcount(hook) - up = Unpacker(object_pairs_hook=hook, list_hook=hook) + up = Unpacker(object_hook=hook, list_hook=hook) assert sys.getrefcount(hook) >= basecnt + 2 @@ -35,7 +35,7 @@ def test_unpacker_hook_refcnt(): up.feed(packb([{}])) assert up.unpack() == [{}] assert up.unpack() == [{}] - assert result == [[{}], [{}]] + assert result == [{}, [{}], {}, [{}]] del up From 6d80569b9b7ec6f3756ecc91928e4ce127eb7a4b Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 13 Feb 2014 09:58:38 +0900 Subject: [PATCH 4/4] Unpacker: maintain refcnt (fix #67). --- msgpack/_unpacker.pyx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx index 16aca5c..0df6ab3 100644 --- a/msgpack/_unpacker.pyx +++ b/msgpack/_unpacker.pyx @@ -206,7 +206,8 @@ cdef class Unpacker(object): cdef object file_like cdef object file_like_read cdef Py_ssize_t read_size - cdef object object_hook + # To maintain refcnt. + cdef object object_hook, object_pairs_hook, list_hook cdef object encoding, unicode_errors cdef size_t max_buffer_size @@ -224,6 +225,10 @@ cdef class Unpacker(object): cdef char *cenc=NULL, cdef char *cerr=NULL + self.object_hook = object_hook + self.object_pairs_hook = object_pairs_hook + self.list_hook = list_hook + self.file_like = file_like if file_like: self.file_like_read = file_like.read