Skip to content

Stack frames missing in other threads when settrace used. #2072

Description

@mickp

Type checks in other threads were failing with ValueError: call stack not deep enough when I tried to trace my main thread. It looks like settrace causes stack to be lost. I do not see the same in CPython.

Repro

import argparse
import typing
import collections.abc
import sys
import threading

# This reproduction script demonstrates a "ValueError: call stack is not deep enough"
# in IronPython 3 when performing isinstance/issubclass checks against ABCs
# that have parameterized generics as subclasses.

class NotAMapping:
    pass
    
def tracer(frame, event, arg):
    return tracer

def do_check():
    print("Attempting isinstance check...")
    try:
        isinstance(NotAMapping(), collections.abc.Mapping)
        print("Success.")
    except Exception as e:
        print("\nCaught error: {}: {}".format(type(e).__name__, e))
        import traceback
        traceback.print_exc()

parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('-t', '--trace', action='store_true', help='Set tracer.')
args = parser.parse_args()
 
print(sys.version)

if args.trace:
    print("Enabling trace...")
    sys.settrace(tracer)

t = threading.Thread(target=do_check)
t.start()
t.join()

CPython 3.4

$ python repro_issue.py -t
3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)]
Enabling trace...
Attempting isinstance check...
Success.

IronPython 3.4

$ ipy.exe repro_issue.py -t
3.4.2 (3.4.2.1000)
[.NETFramework,Version=v4.6.2 on .NET Framework 4.8.9324.0 (64-bit)]
Enabling trace...
Attempting isinstance check...

Caught error: ValueError: call stack is not deep enough
Traceback (most recent call last):
  File "repro_issue.py", line 20, in do_check
    isinstance(NotAMapping(), collections.abc.Mapping)
  File "C:\Program Files\IronPython 3.4\lib\abc.py", line 191, in __instancecheck__
    return cls.__subclasscheck__(subclass)
  File "C:\Program Files\IronPython 3.4\lib\abc.py", line 226, in __subclasscheck__
    if issubclass(subclass, scls):
  File "C:\Program Files\IronPython 3.4\lib\abc.py", line 226, in __subclasscheck__
    if issubclass(subclass, scls):
  File "C:\Program Files\IronPython 3.4\lib\typing.py", line 1158, in __subclasscheck__
    return super().__subclasscheck__(cls)
  File "C:\Program Files\IronPython 3.4\lib\abc.py", line 226, in __subclasscheck__
    if issubclass(subclass, scls):
  File "C:\Program Files\IronPython 3.4\lib\typing.py", line 1151, in __subclasscheck__
    if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']:
ValueError: call stack is not deep enough

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions