Commit 74482201 authored by Alexander Belopolsky's avatar Alexander Belopolsky

Issue #11823: disassembly now shows argument counts on calls with keyword args

parent 7bda2656
...@@ -190,6 +190,9 @@ def disassemble(co, lasti=-1): ...@@ -190,6 +190,9 @@ def disassemble(co, lasti=-1):
if free is None: if free is None:
free = co.co_cellvars + co.co_freevars free = co.co_cellvars + co.co_freevars
print('(' + free[oparg] + ')', end=' ') print('(' + free[oparg] + ')', end=' ')
elif op in hasnargs:
print('(%d positional, %d keyword pair)'
% (code[i-2], code[i-1]), end=' ')
print() print()
def _disassemble_bytes(code, lasti=-1, varnames=None, names=None, def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
...@@ -229,6 +232,9 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None, ...@@ -229,6 +232,9 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
print('(%d)' % oparg, end=' ') print('(%d)' % oparg, end=' ')
elif op in hascompare: elif op in hascompare:
print('(' + cmp_op[oparg] + ')', end=' ') print('(' + cmp_op[oparg] + ')', end=' ')
elif op in hasnargs:
print('(%d positional, %d keyword pair)'
% (code[i-2], code[i-1]), end=' ')
print() print()
def _disassemble_str(source): def _disassemble_str(source):
......
...@@ -6,7 +6,7 @@ operate on bytecodes (e.g. peephole optimizers). ...@@ -6,7 +6,7 @@ operate on bytecodes (e.g. peephole optimizers).
__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs", __all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs",
"haslocal", "hascompare", "hasfree", "opname", "opmap", "haslocal", "hascompare", "hasfree", "opname", "opmap",
"HAVE_ARGUMENT", "EXTENDED_ARG"] "HAVE_ARGUMENT", "EXTENDED_ARG", "hasnargs"]
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is',
'is not', 'exception match', 'BAD') 'is not', 'exception match', 'BAD')
...@@ -18,6 +18,7 @@ hasjabs = [] ...@@ -18,6 +18,7 @@ hasjabs = []
haslocal = [] haslocal = []
hascompare = [] hascompare = []
hasfree = [] hasfree = []
hasnargs = []
opmap = {} opmap = {}
opname = [''] * 256 opname = [''] * 256
...@@ -152,6 +153,7 @@ haslocal.append(126) ...@@ -152,6 +153,7 @@ haslocal.append(126)
def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3)
def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8) def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8)
hasnargs.append(131)
def_op('MAKE_FUNCTION', 132) # Number of args with default values def_op('MAKE_FUNCTION', 132) # Number of args with default values
def_op('BUILD_SLICE', 133) # Number of items def_op('BUILD_SLICE', 133) # Number of items
def_op('MAKE_CLOSURE', 134) def_op('MAKE_CLOSURE', 134)
...@@ -165,8 +167,11 @@ def_op('DELETE_DEREF', 138) ...@@ -165,8 +167,11 @@ def_op('DELETE_DEREF', 138)
hasfree.append(138) hasfree.append(138)
def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8) def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8)
hasnargs.append(140)
def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8)
hasnargs.append(141)
def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8)
hasnargs.append(142)
jrel_op('SETUP_WITH', 143) jrel_op('SETUP_WITH', 143)
......
...@@ -38,7 +38,7 @@ def _f(a): ...@@ -38,7 +38,7 @@ def _f(a):
dis_f = """\ dis_f = """\
%-4d 0 LOAD_GLOBAL 0 (print) %-4d 0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 0 (a) 3 LOAD_FAST 0 (a)
6 CALL_FUNCTION 1 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP 9 POP_TOP
%-4d 10 LOAD_CONST 1 (1) %-4d 10 LOAD_CONST 1 (1)
...@@ -50,7 +50,7 @@ dis_f = """\ ...@@ -50,7 +50,7 @@ dis_f = """\
dis_f_co_code = """\ dis_f_co_code = """\
0 LOAD_GLOBAL 0 (0) 0 LOAD_GLOBAL 0 (0)
3 LOAD_FAST 0 (0) 3 LOAD_FAST 0 (0)
6 CALL_FUNCTION 1 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP 9 POP_TOP
10 LOAD_CONST 1 (1) 10 LOAD_CONST 1 (1)
13 RETURN_VALUE 13 RETURN_VALUE
...@@ -68,7 +68,7 @@ dis_bug708901 = """\ ...@@ -68,7 +68,7 @@ dis_bug708901 = """\
6 LOAD_CONST 1 (1) 6 LOAD_CONST 1 (1)
%-4d 9 LOAD_CONST 2 (10) %-4d 9 LOAD_CONST 2 (10)
12 CALL_FUNCTION 2 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
15 GET_ITER 15 GET_ITER
>> 16 FOR_ITER 6 (to 25) >> 16 FOR_ITER 6 (to 25)
19 STORE_FAST 0 (res) 19 STORE_FAST 0 (res)
......
...@@ -21,6 +21,8 @@ Core and Builtins ...@@ -21,6 +21,8 @@ Core and Builtins
Library Library
------- -------
- Issue #11823: disassembly now shows argument counts on calls with keyword args.
- Issue #14711: os.stat_float_times() has been deprecated. - Issue #14711: os.stat_float_times() has been deprecated.
- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a". - LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment