diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2021-09-14 09:09:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 09:09:05 (GMT) |
commit | c99fc4e53a60084df88ac5c69b3b13bc033677e1 (patch) | |
tree | dec1308bd562dfd578ee29d15d0bb8ea5acb0ac2 | |
parent | c2f1e953371c25f6c42b599ba3d8797effbb503e (diff) | |
download | cpython-c99fc4e53a60084df88ac5c69b3b13bc033677e1.zip cpython-c99fc4e53a60084df88ac5c69b3b13bc033677e1.tar.gz cpython-c99fc4e53a60084df88ac5c69b3b13bc033677e1.tar.bz2 |
bpo-45168: change dis output to omit missing values rather than replacing them by their index (GH-28313)
-rw-r--r-- | Doc/library/dis.rst | 5 | ||||
-rw-r--r-- | Lib/dis.py | 25 | ||||
-rw-r--r-- | Lib/test/test_dis.py | 16 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst | 1 |
4 files changed, 28 insertions, 19 deletions
diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 2174706..9b68308 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -293,12 +293,13 @@ details of bytecode instructions as :class:`Instruction` instances: .. data:: argval - resolved arg value (if known), otherwise same as arg + resolved arg value (if any), otherwise ``None`` .. data:: argrepr - human readable description of operation argument + human readable description of operation argument (if any), + otherwise an empty string. .. data:: offset @@ -125,6 +125,13 @@ def pretty_flags(flags): names.append(hex(flags)) return ", ".join(names) +class _Unknown: + def __repr__(self): + return "<unknown>" + +# Sentinel to represent values that cannot be calculated +UNKNOWN = _Unknown() + def _get_code_object(x): """Helper to handle methods, compiled or raw code objects, and strings.""" # Extract functions from methods. @@ -315,28 +322,28 @@ def _get_const_info(const_index, const_list): Returns the dereferenced constant and its repr if the constant list is defined. - Otherwise returns the constant index and its repr(). + Otherwise returns the sentinel value dis.UNKNOWN for the value + and an empty string for its repr. """ - argval = const_index if const_list is not None: argval = const_list[const_index] - return argval, repr(argval) + return argval, repr(argval) + else: + return UNKNOWN, '' def _get_name_info(name_index, get_name, **extrainfo): """Helper to get optional details about named references Returns the dereferenced name as both value and repr if the name list is defined. - Otherwise returns the name index and its repr(). + Otherwise returns the sentinel value dis.UNKNOWN for the value + and an empty string for its repr. """ - argval = name_index if get_name is not None: argval = get_name(name_index, **extrainfo) - argrepr = argval + return argval, argval else: - argrepr = repr(argval) - return argval, argrepr - + return UNKNOWN, '' def parse_varint(iterator): b = next(iterator) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index a140a89..0899db6 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -48,12 +48,12 @@ dis_c_instance_method = """\ """ % (_C.__init__.__code__.co_firstlineno + 1,) dis_c_instance_method_bytes = """\ - 0 LOAD_FAST 1 (1) - 2 LOAD_CONST 1 (1) + 0 LOAD_FAST 1 + 2 LOAD_CONST 1 4 COMPARE_OP 2 (==) - 6 LOAD_FAST 0 (0) - 8 STORE_ATTR 0 (0) - 10 LOAD_CONST 0 (0) + 6 LOAD_FAST 0 + 8 STORE_ATTR 0 + 10 LOAD_CONST 0 12 RETURN_VALUE """ @@ -105,11 +105,11 @@ dis_f = """\ dis_f_co_code = """\ - 0 LOAD_GLOBAL 0 (0) - 2 LOAD_FAST 0 (0) + 0 LOAD_GLOBAL 0 + 2 LOAD_FAST 0 4 CALL_FUNCTION 1 6 POP_TOP - 8 LOAD_CONST 1 (1) + 8 LOAD_CONST 1 10 RETURN_VALUE """ diff --git a/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst b/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst new file mode 100644 index 0000000..4e12e7d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst @@ -0,0 +1 @@ +Change :func:`dis.dis` output to omit op arg values that cannot be resolved due to ``co_consts``, ``co_names`` etc not being provided. Previously the oparg itself was repeated in the value field, which is not useful and can be confusing. |