From aa4beb032d2e341eb26d603cc6fdea5b4650da5c Mon Sep 17 00:00:00 2001 From: Taeho Nam Date: Thu, 4 Apr 2019 19:58:40 +0900 Subject: [PATCH] Don't fail in DictResolver when there are more items than MAX_ITEMS_TO_HANDLE. Fixes #1301 (#1292) * Fix the size of the object to be appended to the list for normal unpacking. Fixes #1301 --- .../pydevd/_pydevd_bundle/pydevd_resolver.py | 2 +- .../test_suspended_frames_manager.py | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py b/src/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py index 1fa6c0de..b1ee5aec 100644 --- a/src/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py +++ b/src/ptvsd/_vendored/pydevd/_pydevd_bundle/pydevd_resolver.py @@ -290,7 +290,7 @@ class DictResolver: eval_key_str = self.key_to_str(key) # do not format the key ret.append((key_as_str, val, '[%s]' % (eval_key_str,))) if i > MAX_ITEMS_TO_HANDLE: - ret.append((TOO_LARGE_ATTR, TOO_LARGE_MSG)) + ret.append((TOO_LARGE_ATTR, TOO_LARGE_MSG, None)) break ret.append(('__len__', len(dct), partial(_apply_evaluate_name, evaluate_name='len(%s)'))) diff --git a/src/ptvsd/_vendored/pydevd/tests_python/test_suspended_frames_manager.py b/src/ptvsd/_vendored/pydevd/tests_python/test_suspended_frames_manager.py index f672484f..1abf4fac 100644 --- a/src/ptvsd/_vendored/pydevd/tests_python/test_suspended_frames_manager.py +++ b/src/ptvsd/_vendored/pydevd/tests_python/test_suspended_frames_manager.py @@ -1,5 +1,6 @@ import sys from _pydevd_bundle.pydevd_constants import int_types +from _pydevd_bundle.pydevd_resolver import MAX_ITEMS_TO_HANDLE def get_frame(): @@ -70,3 +71,30 @@ def test_suspended_frames_manager(): '33': {'name': '33', 'value': "[1]", 'type': 'list', 'evaluateName': 'var3[33]'}, '__len__': {'name': '__len__', 'value': '1', 'type': 'int', 'evaluateName': 'len(var3)'} }) + + +def get_large_frame(): + lst = {} + for idx in range(0, MAX_ITEMS_TO_HANDLE + 1): + lst[idx] = (1) + return sys._getframe() + +def test_get_child_variables(): + from _pydevd_bundle.pydevd_suspended_frames import SuspendedFramesManager + suspended_frames_manager = SuspendedFramesManager() + py_db = None + with suspended_frames_manager.track_frames(py_db) as tracker: + # : :type tracker: _FramesTracker + thread_id = 'thread1' + frame = get_large_frame() + tracker.track(thread_id, frame, frame_id_to_lineno={}) + + assert suspended_frames_manager.get_thread_id_for_variable_reference(id(frame)) == thread_id + + variable = suspended_frames_manager.get_variable(id(frame)) + + for x in variable.get_children_variables(): + try: + x.get_children_variables() + except: + raise AssertionError() \ No newline at end of file