summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/inspect.py22
-rw-r--r--Lib/test/test_inspect.py8
-rw-r--r--Misc/NEWS2
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')
diff --git a/Misc/NEWS b/Misc/NEWS
index 3dfa18a..75ab5cc 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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
-----------