Skip to content

Commit

Permalink
bpo-33065: Fix problem debugging user classes with __repr__ method (G…
Browse files Browse the repository at this point in the history
…H-24183)

If __repr__ uses instance attributes, as normal, and one steps
through the __init__ method, debugger may try to get repr before
the instance attributes exist.  reprlib.repr handles the error.
(cherry picked from commit 81f87bb)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
  • Loading branch information
miss-islington and terryjreedy committed Jan 10, 2021
1 parent ca8e96d commit 5ded7ef
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 3 deletions.
2 changes: 2 additions & 0 deletions Lib/idlelib/NEWS.txt
Expand Up @@ -3,6 +3,8 @@ Released on 2020-12-??
======================================


bpo-33065: Fix problem debugging user classes with __repr__ method.

bpo-32631: Finish zzdummy example extension module: make menu entries
work; add docstrings and tests with 100% coverage.

Expand Down
6 changes: 3 additions & 3 deletions Lib/idlelib/debugger_r.py
Expand Up @@ -19,7 +19,7 @@
barrier, in particular frame and traceback objects.
"""

import reprlib
import types
from idlelib import debugger

Expand Down Expand Up @@ -170,7 +170,7 @@ def dict_keys_list(self, did):
def dict_item(self, did, key):
dict = dicttable[did]
value = dict[key]
value = repr(value) ### can't pickle module 'builtins'
value = reprlib.repr(value) ### can't pickle module 'builtins'
return value

#----------end class IdbAdapter----------
Expand Down Expand Up @@ -390,4 +390,4 @@ def restart_subprocess_debugger(rpcclt):

if __name__ == "__main__":
from unittest import main
main('idlelib.idle_test.test_debugger', verbosity=2, exit=False)
main('idlelib.idle_test.test_debugger_r', verbosity=2, exit=False)
14 changes: 14 additions & 0 deletions Lib/idlelib/idle_test/test_debugger_r.py
Expand Up @@ -25,5 +25,19 @@ def test_init(self):
# Classes GUIProxy, IdbAdapter, FrameProxy, CodeProxy, DictProxy,
# GUIAdapter, IdbProxy plus 7 module functions.

class IdbAdapterTest(unittest.TestCase):

def test_dict_item_noattr(self): # Issue 33065.

class BinData:
def __repr__(self):
return self.length

debugger_r.dicttable[0] = {'BinData': BinData()}
idb = debugger_r.IdbAdapter(None)
self.assertTrue(idb.dict_item(0, 'BinData'))
debugger_r.dicttable.clear()


if __name__ == '__main__':
unittest.main(verbosity=2)
@@ -0,0 +1 @@
Fix problem debugging user classes with __repr__ method.

0 comments on commit 5ded7ef

Please sign in to comment.