Terry J. Reedy <tjre...@udel.edu> added the comment:

This is not a crash because IDLE does not crash.  It does not even exit with a 
traceback.  Some crash and freeze bugs have been fixed since 3.4.2.

I verified with 3.7.0a2 on Win10.  The failing example can be simplified to the 
first two lines.  Step over the import and into the Fraction call to get to 
fractions.Fraction.__new__, line 115
        self = super(Fraction, cls).__new__(cls)
(Step 8 in the report above has the wrong code.)  Step 2 gives this simplified 
traceback:

Traceback (most recent call last):
  File "F:\Python\a\tem2.py", line 3, in <module>
    U=Fraction(1)
  File "C:\Programs\Python37\lib\fractions.py", line 117, in __new__
    if denominator is None:
  File "C:\Programs\Python37\lib\fractions.py", line 117, in __new__
    if denominator is None:
  File "C:\Programs\Python37\lib\bdb.py", line 86, in trace_dispatch
    return self.dispatch_line(frame)
  File "C:\Programs\Python37\lib\bdb.py", line 110, in dispatch_line
    self.user_line(frame)
  File "C:\Programs\Python37\lib\idlelib\debugger.py", line 24, in user_line
    self.gui.interaction(message, frame)
AttributeError: _numerator

If I replace the line above with
        new = super(Fraction, cls)  # resolves to object.__new__
        self = new(cls)
stepping the first works.  For the new call, hitting 'step' or 'over' gives 
essentially the same traceback as above.  Hitting 'go' runs the code to 
completion.

If I add 'print('xxxx') after the new call, the print call shows up in the 
traceback, twice, but is not executed.

If I simplify the code to

class C():
    def __new__(cls):
        self = object.__new__(cls)
        return self
c = C()

and step into the C() code the the __new__ code, there is no problem.  Hence 
the revised title.

If I add slots make C, as with Fraction, there is still no problem.

class C():
        __slots__ = ('a',)
        def __new__(cls, a):
                self = object.__new__(cls)
                self.a = a
                return self
c = C(1)

Puzzles:
1. Why does the next line, 'if denominator...' show up in the traceback?  It 
does not have a function call.  Why is it printed twice?
2. Where does the _numerator error happen?  It is only set, never accessed.  
Setting should work because _numerator is one of the two slots.
3. What extra feature of Fraction results in the failure.

If I leave IDLE's debugger off and invoke pdb by adding
import pdb; pbd.set_trace()
as line 2, before the Fraction call, stepping with s works on the line where 
Debugger failed.  Until a fix is released, use this (and/or print) as a 
workaround for code that makes debugger croak.

I do not now know how to write a fully automated unittest for debugger.  But it 
does not now even have a human-driven htest, and it should.

----------
stage:  -> test needed
title: Probable bug in all python3 / idle3 debugger -> IDLE debugger fails with 
non-trivial __new__ super call
type: crash -> behavior
versions: +Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32140>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to