diff options
-rw-r--r-- | Lib/inspect.py | 22 | ||||
-rw-r--r-- | Lib/test/test_inspect.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 25 insertions, 7 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 7f73264..42eda77 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -624,14 +624,22 @@ def getargs(co): count.append(value) elif opname == 'STORE_FAST': stack.append(names[value]) - remain[-1] = remain[-1] - 1 - while remain[-1] == 0: - remain.pop() - size = count.pop() - stack[-size:] = [stack[-size:]] - if not remain: break + + # Special case for sublists of length 1: def foo((bar)) + # doesn't generate the UNPACK_TUPLE bytecode, so if + # `remain` is empty here, we have such a sublist. + if not remain: + stack[0] = [stack[0]] + break + else: remain[-1] = remain[-1] - 1 - if not remain: break + while remain[-1] == 0: + remain.pop() + size = count.pop() + stack[-size:] = [stack[-size:]] + if not remain: break + remain[-1] = remain[-1] - 1 + if not remain: break args[i] = stack[0] varargs = None diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index bdbec41..2f79fc3 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -374,3 +374,11 @@ test(defaults is None, 'A.m defaults') # Doc/lib/libinspect.tex claims there are 11 such functions count = len(filter(lambda x:x.startswith('is'), dir(inspect))) test(count == 11, "There are %d (not 11) is* functions", count) + +def sublistOfOne((foo)): return 1 + +args, varargs, varkw, defaults = inspect.getargspec(sublistOfOne) +test(args == [['foo']], 'sublistOfOne args') +test(varargs is None, 'sublistOfOne varargs') +test(varkw is None, 'sublistOfOne varkw') +test(defaults is None, 'sublistOfOn defaults') @@ -76,6 +76,8 @@ Library to return a list of all doctests, and you can filter that list by any computable criteria before passing it to a DocTestRunner instance. +- Bug #891637, patch #1005466: fix inspect.getargs() crash on def foo((bar)). + Tools/Demos ----------- |