mirror of
				https://github.com/python/cpython.git
				synced 2025-10-27 03:34:32 +00:00 
			
		
		
		
	gh-102676: Add more convenience properties to dis.Instruction (#103969)
				
					
				
			Adds start_offset, cache_offset, end_offset, baseopcode, baseopname, jump_target and oparg to dis.Instruction. Also slightly improves the disassembly output by allowing opnames to overflow into the space reserved for opargs.
This commit is contained in:
		
							parent
							
								
									845e593c4e
								
							
						
					
					
						commit
						18d16e93b6
					
				
					 4 changed files with 435 additions and 196 deletions
				
			
		|  | @ -342,10 +342,25 @@ details of bytecode instructions as :class:`Instruction` instances: | |||
|       human readable name for operation | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: baseopcode | ||||
| 
 | ||||
|       numeric code for the base operation if operation is specialized; | ||||
|       otherwise equal to :data:`opcode` | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: baseopname | ||||
| 
 | ||||
|       human readable name for the base operation if operation is specialized; | ||||
|       otherwise equal to :data:`opname` | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: arg | ||||
| 
 | ||||
|       numeric argument to operation (if any), otherwise ``None`` | ||||
| 
 | ||||
|    .. data:: oparg | ||||
| 
 | ||||
|       alias for :data:`arg` | ||||
| 
 | ||||
|    .. data:: argval | ||||
| 
 | ||||
|  | @ -363,6 +378,22 @@ details of bytecode instructions as :class:`Instruction` instances: | |||
|       start index of operation within bytecode sequence | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: start_offset | ||||
| 
 | ||||
|       start index of operation within bytecode sequence, including prefixed | ||||
|       ``EXTENDED_ARG`` operations if present; otherwise equal to :data:`offset` | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: cache_offset | ||||
| 
 | ||||
|       start index of the cache entries following the operation | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: end_offset | ||||
| 
 | ||||
|       end index of the cache entries following the operation | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: starts_line | ||||
| 
 | ||||
|       line started by this opcode (if any), otherwise ``None`` | ||||
|  | @ -373,6 +404,12 @@ details of bytecode instructions as :class:`Instruction` instances: | |||
|       ``True`` if other code jumps to here, otherwise ``False`` | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: jump_target | ||||
| 
 | ||||
|       bytecode index of the jump target if this is a jump operation, | ||||
|       otherwise ``None`` | ||||
| 
 | ||||
| 
 | ||||
|    .. data:: positions | ||||
| 
 | ||||
|       :class:`dis.Positions` object holding the | ||||
|  | @ -384,6 +421,11 @@ details of bytecode instructions as :class:`Instruction` instances: | |||
| 
 | ||||
|       Field ``positions`` is added. | ||||
| 
 | ||||
|    .. versionchanged:: 3.13 | ||||
| 
 | ||||
|       Added fields ``start_offset``, ``cache_offset``, ``end_offset``, | ||||
|       ``baseopname``, ``baseopcode``, ``jump_target`` and ``oparg``. | ||||
| 
 | ||||
| 
 | ||||
| .. class:: Positions | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										110
									
								
								Lib/dis.py
									
										
									
									
									
								
							
							
						
						
									
										110
									
								
								Lib/dis.py
									
										
									
									
									
								
							|  | @ -265,6 +265,7 @@ def show_code(co, *, file=None): | |||
|         'argval', | ||||
|         'argrepr', | ||||
|         'offset', | ||||
|         'start_offset', | ||||
|         'starts_line', | ||||
|         'is_jump_target', | ||||
|         'positions' | ||||
|  | @ -278,6 +279,10 @@ def show_code(co, *, file=None): | |||
| _Instruction.argval.__doc__ = "Resolved arg value (if known), otherwise same as arg" | ||||
| _Instruction.argrepr.__doc__ = "Human readable description of operation argument" | ||||
| _Instruction.offset.__doc__ = "Start index of operation within bytecode sequence" | ||||
| _Instruction.start_offset.__doc__ = ( | ||||
|     "Start index of operation within bytecode sequence, including extended args if present; " | ||||
|     "otherwise equal to Instruction.offset" | ||||
| ) | ||||
| _Instruction.starts_line.__doc__ = "Line started by this opcode (if any), otherwise None" | ||||
| _Instruction.is_jump_target.__doc__ = "True if other code jumps to here, otherwise False" | ||||
| _Instruction.positions.__doc__ = "dis.Positions object holding the span of source code covered by this instruction" | ||||
|  | @ -288,8 +293,26 @@ def show_code(co, *, file=None): | |||
| _OPNAME_WIDTH = 20 | ||||
| _OPARG_WIDTH = 5 | ||||
| 
 | ||||
| def _get_jump_target(op, arg, offset): | ||||
|     """Gets the bytecode offset of the jump target if this is a jump instruction. | ||||
| 
 | ||||
|     Otherwise return None. | ||||
|     """ | ||||
|     deop = _deoptop(op) | ||||
|     caches = _inline_cache_entries[deop] | ||||
|     if deop in hasjrel: | ||||
|         if _is_backward_jump(deop): | ||||
|             arg = -arg | ||||
|         target = offset + 2 + arg*2 | ||||
|         target += 2 * caches | ||||
|     elif deop in hasjabs: | ||||
|         target = arg*2 | ||||
|     else: | ||||
|         target = None | ||||
|     return target | ||||
| 
 | ||||
| class Instruction(_Instruction): | ||||
|     """Details for a bytecode operation | ||||
|     """Details for a bytecode operation. | ||||
| 
 | ||||
|        Defined fields: | ||||
|          opname - human readable name for operation | ||||
|  | @ -298,14 +321,55 @@ class Instruction(_Instruction): | |||
|          argval - resolved arg value (if known), otherwise same as arg | ||||
|          argrepr - human readable description of operation argument | ||||
|          offset - start index of operation within bytecode sequence | ||||
|          start_offset - start index of operation within bytecode sequence including extended args if present; | ||||
|                         otherwise equal to Instruction.offset | ||||
|          starts_line - line started by this opcode (if any), otherwise None | ||||
|          is_jump_target - True if other code jumps to here, otherwise False | ||||
|          positions - Optional dis.Positions object holding the span of source code | ||||
|                      covered by this instruction | ||||
|     """ | ||||
| 
 | ||||
|     @property | ||||
|     def oparg(self): | ||||
|         """Alias for Instruction.arg.""" | ||||
|         return self.arg | ||||
| 
 | ||||
|     @property | ||||
|     def baseopcode(self): | ||||
|         """Numeric code for the base operation if operation is specialized. | ||||
| 
 | ||||
|         Otherwise equal to Instruction.opcode. | ||||
|         """ | ||||
|         return _deoptop(self.opcode) | ||||
| 
 | ||||
|     @property | ||||
|     def baseopname(self): | ||||
|         """Human readable name for the base operation if operation is specialized. | ||||
| 
 | ||||
|         Otherwise equal to Instruction.opname. | ||||
|         """ | ||||
|         return opname[self.baseopcode] | ||||
| 
 | ||||
|     @property | ||||
|     def cache_offset(self): | ||||
|         """Start index of the cache entries following the operation.""" | ||||
|         return self.offset + 2 | ||||
| 
 | ||||
|     @property | ||||
|     def end_offset(self): | ||||
|         """End index of the cache entries following the operation.""" | ||||
|         return self.cache_offset + _inline_cache_entries[self.opcode]*2 | ||||
| 
 | ||||
|     @property | ||||
|     def jump_target(self): | ||||
|         """Bytecode index of the jump target if this is a jump operation. | ||||
| 
 | ||||
|         Otherwise return None. | ||||
|         """ | ||||
|         return _get_jump_target(self.opcode, self.arg, self.offset) | ||||
| 
 | ||||
|     def _disassemble(self, lineno_width=3, mark_as_current=False, offset_width=4): | ||||
|         """Format instruction details for inclusion in disassembly output | ||||
|         """Format instruction details for inclusion in disassembly output. | ||||
| 
 | ||||
|         *lineno_width* sets the width of the line number field (0 omits it) | ||||
|         *mark_as_current* inserts a '-->' marker arrow as part of the line | ||||
|  | @ -335,12 +399,19 @@ def _disassemble(self, lineno_width=3, mark_as_current=False, offset_width=4): | |||
|         fields.append(self.opname.ljust(_OPNAME_WIDTH)) | ||||
|         # Column: Opcode argument | ||||
|         if self.arg is not None: | ||||
|             fields.append(repr(self.arg).rjust(_OPARG_WIDTH)) | ||||
|             arg = repr(self.arg) | ||||
|             # If opname is longer than _OPNAME_WIDTH, we allow it to overflow into | ||||
|             # the space reserved for oparg. This results in fewer misaligned opargs | ||||
|             # in the disassembly output. | ||||
|             opname_excess = max(0, len(self.opname) - _OPNAME_WIDTH) | ||||
|             fields.append(repr(self.arg).rjust(_OPARG_WIDTH - opname_excess)) | ||||
|             # Column: Opcode argument details | ||||
|             if self.argrepr: | ||||
|                 fields.append('(' + self.argrepr + ')') | ||||
|         return ' '.join(fields).rstrip() | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return self._disassemble() | ||||
| 
 | ||||
| def get_instructions(x, *, first_line=None, show_caches=False, adaptive=False): | ||||
|     """Iterator for the opcodes in methods, functions or code | ||||
|  | @ -454,7 +525,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None, | |||
|         for i in range(start, end): | ||||
|             labels.add(target) | ||||
|     starts_line = None | ||||
|     for offset, op, arg in _unpack_opargs(code): | ||||
|     for offset, start_offset, op, arg in _unpack_opargs(code): | ||||
|         if linestarts is not None: | ||||
|             starts_line = linestarts.get(offset, None) | ||||
|             if starts_line is not None: | ||||
|  | @ -526,7 +597,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None, | |||
|                 argrepr = _intrinsic_2_descs[arg] | ||||
|         yield Instruction(_all_opname[op], op, | ||||
|                           arg, argval, argrepr, | ||||
|                           offset, starts_line, is_jump_target, positions) | ||||
|                           offset, start_offset, starts_line, is_jump_target, positions) | ||||
|         caches = _inline_cache_entries[deop] | ||||
|         if not caches: | ||||
|             continue | ||||
|  | @ -546,7 +617,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None, | |||
|                 else: | ||||
|                     argrepr = "" | ||||
|                 yield Instruction( | ||||
|                     "CACHE", CACHE, 0, None, argrepr, offset, None, False, | ||||
|                     "CACHE", CACHE, 0, None, argrepr, offset, offset, None, False, | ||||
|                     Positions(*next(co_positions, ())) | ||||
|                 ) | ||||
| 
 | ||||
|  | @ -632,6 +703,7 @@ def _disassemble_str(source, **kwargs): | |||
| 
 | ||||
| def _unpack_opargs(code): | ||||
|     extended_arg = 0 | ||||
|     extended_args_offset = 0  # Number of EXTENDED_ARG instructions preceding the current instruction | ||||
|     caches = 0 | ||||
|     for i in range(0, len(code), 2): | ||||
|         # Skip inline CACHE entries: | ||||
|  | @ -652,7 +724,13 @@ def _unpack_opargs(code): | |||
|         else: | ||||
|             arg = None | ||||
|             extended_arg = 0 | ||||
|         yield (i, op, arg) | ||||
|         if deop == EXTENDED_ARG: | ||||
|             extended_args_offset += 1 | ||||
|             yield (i, i, op, arg) | ||||
|         else: | ||||
|             start_offset = i - extended_args_offset*2 | ||||
|             yield (i, start_offset, op, arg) | ||||
|             extended_args_offset = 0 | ||||
| 
 | ||||
| def findlabels(code): | ||||
|     """Detect all offsets in a byte code which are jump targets. | ||||
|  | @ -661,18 +739,10 @@ def findlabels(code): | |||
| 
 | ||||
|     """ | ||||
|     labels = [] | ||||
|     for offset, op, arg in _unpack_opargs(code): | ||||
|     for offset, _, op, arg in _unpack_opargs(code): | ||||
|         if arg is not None: | ||||
|             deop = _deoptop(op) | ||||
|             caches = _inline_cache_entries[deop] | ||||
|             if deop in hasjrel: | ||||
|                 if _is_backward_jump(deop): | ||||
|                     arg = -arg | ||||
|                 label = offset + 2 + arg*2 | ||||
|                 label += 2 * caches | ||||
|             elif deop in hasjabs: | ||||
|                 label = arg*2 | ||||
|             else: | ||||
|             label = _get_jump_target(op, arg, offset) | ||||
|             if label is None: | ||||
|                 continue | ||||
|             if label not in labels: | ||||
|                 labels.append(label) | ||||
|  | @ -701,7 +771,7 @@ def _find_imports(co): | |||
| 
 | ||||
|     consts = co.co_consts | ||||
|     names = co.co_names | ||||
|     opargs = [(op, arg) for _, op, arg in _unpack_opargs(co.co_code) | ||||
|     opargs = [(op, arg) for _, _, op, arg in _unpack_opargs(co.co_code) | ||||
|                   if op != EXTENDED_ARG] | ||||
|     for i, (op, oparg) in enumerate(opargs): | ||||
|         if op == IMPORT_NAME and i >= 2: | ||||
|  | @ -723,7 +793,7 @@ def _find_store_names(co): | |||
|     } | ||||
| 
 | ||||
|     names = co.co_names | ||||
|     for _, op, arg in _unpack_opargs(co.co_code): | ||||
|     for _, _, op, arg in _unpack_opargs(co.co_code): | ||||
|         if op in STORE_OPS: | ||||
|             yield names[arg] | ||||
| 
 | ||||
|  |  | |||
|  | @ -527,7 +527,7 @@ async def _asyncwith(c): | |||
|         >> SEND                     3 (to 24) | ||||
|            YIELD_VALUE              2 | ||||
|            RESUME                   3 | ||||
|            JUMP_BACKWARD_NO_INTERRUPT     5 (to 14) | ||||
|            JUMP_BACKWARD_NO_INTERRUPT 5 (to 14) | ||||
|         >> END_SEND | ||||
|            POP_TOP | ||||
| 
 | ||||
|  | @ -543,7 +543,7 @@ async def _asyncwith(c): | |||
|         >> SEND                     3 (to 60) | ||||
|            YIELD_VALUE              2 | ||||
|            RESUME                   3 | ||||
|            JUMP_BACKWARD_NO_INTERRUPT     5 (to 50) | ||||
|            JUMP_BACKWARD_NO_INTERRUPT 5 (to 50) | ||||
|         >> END_SEND | ||||
|            POP_TOP | ||||
| 
 | ||||
|  | @ -562,7 +562,7 @@ async def _asyncwith(c): | |||
|         >> SEND                     4 (to 102) | ||||
|            YIELD_VALUE              3 | ||||
|            RESUME                   3 | ||||
|            JUMP_BACKWARD_NO_INTERRUPT     5 (to 90) | ||||
|            JUMP_BACKWARD_NO_INTERRUPT 5 (to 90) | ||||
|         >> CLEANUP_THROW | ||||
|         >> END_SEND | ||||
|            POP_JUMP_IF_TRUE         1 (to 108) | ||||
|  | @ -761,7 +761,7 @@ def load_test(x, y=0): | |||
| %3d           0 RESUME                   0 | ||||
| 
 | ||||
| %3d           2 LOAD_FAST_LOAD_FAST      1 (x, y) | ||||
|               4 STORE_FAST_STORE_FAST    50 (b, a) | ||||
|               4 STORE_FAST_STORE_FAST   50 (b, a) | ||||
| 
 | ||||
| %3d           6 LOAD_FAST_LOAD_FAST     35 (a, b) | ||||
|               8 BUILD_TUPLE              2 | ||||
|  | @ -788,7 +788,7 @@ def loop_test(): | |||
| 
 | ||||
| %3d        LOAD_GLOBAL_MODULE       1 (NULL + load_test) | ||||
|            LOAD_FAST                0 (i) | ||||
|            CALL_PY_WITH_DEFAULTS     1 | ||||
|            CALL_PY_WITH_DEFAULTS    1 | ||||
|            POP_TOP | ||||
|            JUMP_BACKWARD           16 (to 16) | ||||
| 
 | ||||
|  | @ -1183,7 +1183,7 @@ def test_binary_specialize(self): | |||
|         co_unicode = compile('a + b', "<unicode>", "eval") | ||||
|         self.code_quicken(lambda: exec(co_unicode, {}, {'a': 'a', 'b': 'b'})) | ||||
|         got = self.get_disassembly(co_unicode, adaptive=True) | ||||
|         self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE     0 (+)", True) | ||||
|         self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE    0 (+)", True) | ||||
| 
 | ||||
|         binary_subscr_quicken = """\ | ||||
|   0           0 RESUME                   0 | ||||
|  | @ -1588,191 +1588,191 @@ def _prepare_test_cases(): | |||
| Instruction = dis.Instruction | ||||
| 
 | ||||
| expected_opinfo_outer = [ | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=0, argval='a', argrepr='a', offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='b', argrepr='b', offset=2, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=4, starts_line=1, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, starts_line=2, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='a', argrepr='a', offset=8, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='b', argrepr='b', offset=10, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=20, starts_line=7, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='a', argrepr='a', offset=30, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='b', argrepr='b', offset=32, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='', argrepr="''", offset=34, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=1, argrepr='1', offset=36, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=38, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=7, argval=7, argrepr='', offset=44, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=54, starts_line=8, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=1, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=18, start_offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=20, start_offset=20, starts_line=7, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='a', argrepr='a', offset=30, start_offset=30, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='b', argrepr='b', offset=32, start_offset=32, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='', argrepr="''", offset=34, start_offset=34, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=1, argrepr='1', offset=36, start_offset=36, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=38, start_offset=38, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=40, start_offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Hello world!', argrepr="'Hello world!'", offset=42, start_offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=7, argval=7, argrepr='', offset=44, start_offset=44, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, start_offset=52, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=54, start_offset=54, starts_line=8, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
| ] | ||||
| 
 | ||||
| expected_opinfo_f = [ | ||||
|   Instruction(opname='COPY_FREE_VARS', opcode=149, arg=2, argval=2, argrepr='', offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=0, argval='c', argrepr='c', offset=2, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='d', argrepr='d', offset=4, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=6, starts_line=2, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=3, argval='a', argrepr='a', offset=10, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=4, argval='b', argrepr='b', offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='c', argrepr='c', offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='d', argrepr='d', offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=24, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=26, starts_line=5, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=3, argval='a', argrepr='a', offset=36, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=4, argval='b', argrepr='b', offset=38, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='c', argrepr='c', offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='d', argrepr='d', offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=4, argval=4, argrepr='', offset=44, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=54, starts_line=6, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY_FREE_VARS', opcode=149, arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=2, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CLOSURE', opcode=136, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='MAKE_FUNCTION', opcode=132, arg=9, argval=9, argrepr='defaults, closure', offset=22, start_offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=24, start_offset=24, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=26, start_offset=26, starts_line=5, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=3, argval='a', argrepr='a', offset=36, start_offset=36, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=4, argval='b', argrepr='b', offset=38, start_offset=38, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='c', argrepr='c', offset=40, start_offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='d', argrepr='d', offset=42, start_offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=4, argval=4, argrepr='', offset=44, start_offset=44, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, start_offset=52, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=54, start_offset=54, starts_line=6, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
| ] | ||||
| 
 | ||||
| expected_opinfo_inner = [ | ||||
|   Instruction(opname='COPY_FREE_VARS', opcode=149, arg=4, argval=4, argrepr='', offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=2, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=4, starts_line=4, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=2, argval='a', argrepr='a', offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=3, argval='b', argrepr='b', offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=4, argval='c', argrepr='c', offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=5, argval='d', argrepr='d', offset=20, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=168, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=6, argval=6, argrepr='', offset=24, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=32, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=34, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY_FREE_VARS', opcode=149, arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='NULL + print', offset=4, start_offset=4, starts_line=4, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_DEREF', opcode=137, arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST_LOAD_FAST', opcode=168, arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=None, is_jump_target=False, positions=None), | ||||
| ] | ||||
| 
 | ||||
| 
 | ||||
| expected_opinfo_jumpy = [ | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=0, starts_line=1, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='range', argrepr='NULL + range', offset=2, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='FOR_ITER', opcode=93, arg=28, argval=84, argrepr='to 84', offset=24, starts_line=None, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=28, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=30, starts_line=4, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=50, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=52, starts_line=5, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=54, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=66, argrepr='to 66', offset=60, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=21, argval=24, argrepr='to 24', offset=62, starts_line=6, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=66, starts_line=7, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=68, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=70, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=2, argval=80, argrepr='to 80', offset=74, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=28, argval=24, argrepr='to 24', offset=76, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=80, starts_line=8, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='JUMP_FORWARD', opcode=110, arg=12, argval=108, argrepr='to 108', offset=82, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='END_FOR', opcode=4, arg=None, argval=None, argrepr='', offset=84, starts_line=3, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=86, starts_line=10, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=106, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST_CHECK', opcode=127, arg=0, argval='i', argrepr='i', offset=108, starts_line=11, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=33, argval=178, argrepr='to 178', offset=110, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=112, starts_line=12, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=122, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=124, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=132, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=134, starts_line=13, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=136, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=138, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=142, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=14, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=146, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=148, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=158, argrepr='to 158', offset=152, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=25, argval=108, argrepr='to 108', offset=154, starts_line=15, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=158, starts_line=16, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=160, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=162, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=170, argrepr='to 170', offset=166, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=200, argrepr='to 200', offset=168, starts_line=17, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=170, starts_line=11, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=178, argrepr='to 178', offset=172, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=33, argval=112, argrepr='to 112', offset=174, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=178, starts_line=19, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=188, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=190, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=200, starts_line=20, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=202, starts_line=21, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=204, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=206, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=212, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=214, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=216, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=218, starts_line=26, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=228, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=230, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=238, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=240, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=242, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=244, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=246, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=254, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=256, starts_line=28, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=266, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=268, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=276, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=278, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=280, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=282, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=288, argrepr='to 288', offset=284, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=286, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=288, starts_line=None, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=290, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=292, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=22, argval=256, argrepr='to 256', offset=296, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=300, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=304, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=306, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=308, starts_line=22, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=318, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=15, argval=352, argrepr='to 352', offset=320, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=322, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=324, starts_line=23, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=334, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=336, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=344, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=346, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=48, argval=256, argrepr='to 256', offset=348, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=352, starts_line=22, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=354, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=356, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=358, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=360, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=362, starts_line=28, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=372, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=374, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=382, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=384, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=386, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=390, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=1, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='range', argrepr='NULL + range', offset=2, start_offset=2, starts_line=3, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=12, start_offset=12, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='FOR_ITER', opcode=93, arg=28, argval=84, argrepr='to 84', offset=24, start_offset=24, starts_line=None, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=30, start_offset=30, starts_line=4, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=5, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=54, start_offset=54, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=56, start_offset=56, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=66, argrepr='to 66', offset=60, start_offset=60, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=21, argval=24, argrepr='to 24', offset=62, start_offset=62, starts_line=6, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=66, start_offset=66, starts_line=7, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=68, start_offset=68, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=70, start_offset=70, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=2, argval=80, argrepr='to 80', offset=74, start_offset=74, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=28, argval=24, argrepr='to 24', offset=76, start_offset=76, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=80, start_offset=80, starts_line=8, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='JUMP_FORWARD', opcode=110, arg=12, argval=108, argrepr='to 108', offset=82, start_offset=82, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='END_FOR', opcode=4, arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=3, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=86, start_offset=86, starts_line=10, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=96, start_offset=96, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=98, start_offset=98, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=106, start_offset=106, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST_CHECK', opcode=127, arg=0, argval='i', argrepr='i', offset=108, start_offset=108, starts_line=11, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=33, argval=178, argrepr='to 178', offset=110, start_offset=110, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=112, start_offset=112, starts_line=12, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=122, start_offset=122, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=124, start_offset=124, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=134, start_offset=134, starts_line=13, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=136, start_offset=136, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=138, start_offset=138, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=142, start_offset=142, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=14, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=146, start_offset=146, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=68, argval='>', argrepr='>', offset=148, start_offset=148, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=158, argrepr='to 158', offset=152, start_offset=152, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=25, argval=108, argrepr='to 108', offset=154, start_offset=154, starts_line=15, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=16, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=160, start_offset=160, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COMPARE_OP', opcode=107, arg=2, argval='<', argrepr='<', offset=162, start_offset=162, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=1, argval=170, argrepr='to 170', offset=166, start_offset=166, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=200, argrepr='to 200', offset=168, start_offset=168, starts_line=17, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=170, start_offset=170, starts_line=11, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=2, argval=178, argrepr='to 178', offset=172, start_offset=172, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=33, argval=112, argrepr='to 112', offset=174, start_offset=174, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=178, start_offset=178, starts_line=19, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=188, start_offset=188, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=190, start_offset=190, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=198, start_offset=198, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=200, start_offset=200, starts_line=20, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=202, start_offset=202, starts_line=21, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=204, start_offset=204, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=206, start_offset=206, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=210, start_offset=210, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=212, start_offset=212, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=214, start_offset=214, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=216, start_offset=216, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=218, start_offset=218, starts_line=26, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=228, start_offset=228, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=230, start_offset=230, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=240, start_offset=240, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=242, start_offset=242, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=244, start_offset=244, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=246, start_offset=246, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=254, start_offset=254, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=256, start_offset=256, starts_line=28, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=266, start_offset=266, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=268, start_offset=268, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=276, start_offset=276, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=278, start_offset=278, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=280, start_offset=280, starts_line=25, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=282, start_offset=282, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=1, argval=288, argrepr='to 288', offset=284, start_offset=284, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=286, start_offset=286, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=288, start_offset=288, starts_line=None, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=290, start_offset=290, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=292, start_offset=292, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=294, start_offset=294, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=22, argval=256, argrepr='to 256', offset=296, start_offset=296, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=300, start_offset=300, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=302, start_offset=302, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=304, start_offset=304, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=306, start_offset=306, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=308, start_offset=308, starts_line=22, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=318, start_offset=318, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=15, argval=352, argrepr='to 352', offset=320, start_offset=320, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=322, start_offset=322, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=324, start_offset=324, starts_line=23, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=334, start_offset=334, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=336, start_offset=336, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='JUMP_BACKWARD', opcode=140, arg=48, argval=256, argrepr='to 256', offset=348, start_offset=348, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=352, start_offset=352, starts_line=22, is_jump_target=True, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=354, start_offset=354, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=358, start_offset=358, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=362, start_offset=362, starts_line=28, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=372, start_offset=372, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=374, start_offset=374, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=382, start_offset=382, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=384, start_offset=384, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=386, start_offset=386, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=388, start_offset=388, starts_line=None, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=390, start_offset=390, starts_line=None, is_jump_target=False, positions=None), | ||||
| ] | ||||
| 
 | ||||
| # One last piece of inspect fodder to check the default line number handling | ||||
| def simple(): pass | ||||
| expected_opinfo_simple = [ | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=0, starts_line=simple.__code__.co_firstlineno, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False), | ||||
|   Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=simple.__code__.co_firstlineno, is_jump_target=False, positions=None), | ||||
|   Instruction(opname='RETURN_CONST', opcode=121, arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=None, is_jump_target=False), | ||||
| ] | ||||
| 
 | ||||
| 
 | ||||
|  | @ -1889,6 +1889,130 @@ def roots(a, b, c): | |||
|                     ] | ||||
|                     self.assertEqual(co_positions, dis_positions) | ||||
| 
 | ||||
|     def test_oparg_alias(self): | ||||
|         instruction = Instruction(opname="NOP", opcode=dis.opmap["NOP"], arg=None, argval=None, | ||||
|                                   argrepr='', offset=10, start_offset=10, starts_line=1, is_jump_target=False, | ||||
|                                   positions=None) | ||||
|         self.assertEqual(instruction.arg, instruction.oparg) | ||||
| 
 | ||||
|     def test_baseopname_and_baseopcode(self): | ||||
|         # Standard instructions | ||||
|         for name, code in dis.opmap.items(): | ||||
|             instruction = Instruction(opname=name, opcode=code, arg=None, argval=None, argrepr='', offset=0, | ||||
|                                       start_offset=0, starts_line=1, is_jump_target=False, positions=None) | ||||
|             baseopname = instruction.baseopname | ||||
|             baseopcode = instruction.baseopcode | ||||
|             self.assertIsNotNone(baseopname) | ||||
|             self.assertIsNotNone(baseopcode) | ||||
|             self.assertEqual(name, baseopname) | ||||
|             self.assertEqual(code, baseopcode) | ||||
| 
 | ||||
|         # Specialized instructions | ||||
|         for name in opcode._specialized_instructions: | ||||
|             instruction = Instruction(opname=name, opcode=dis._all_opmap[name], arg=None, argval=None, argrepr='', | ||||
|                                       offset=0, start_offset=0, starts_line=1, is_jump_target=False, positions=None) | ||||
|             baseopname = instruction.baseopname | ||||
|             baseopcode = instruction.baseopcode | ||||
|             self.assertIn(name, opcode._specializations[baseopname]) | ||||
|             self.assertEqual(opcode.opmap[baseopname], baseopcode) | ||||
| 
 | ||||
|     def test_jump_target(self): | ||||
|         # Non-jump instructions should return None | ||||
|         instruction = Instruction(opname="NOP", opcode=dis.opmap["NOP"], arg=None, argval=None, | ||||
|                                   argrepr='', offset=10, start_offset=10, starts_line=1, is_jump_target=False, | ||||
|                                   positions=None) | ||||
|         self.assertIsNone(instruction.jump_target) | ||||
| 
 | ||||
|         delta = 100 | ||||
|         instruction = Instruction(opname="JUMP_FORWARD", opcode=dis.opmap["JUMP_FORWARD"], arg=delta, argval=delta, | ||||
|                                   argrepr='', offset=10, start_offset=10, starts_line=1, is_jump_target=False, | ||||
|                                   positions=None) | ||||
|         self.assertEqual(10 + 2 + 100*2, instruction.jump_target) | ||||
| 
 | ||||
|         # Test negative deltas | ||||
|         instruction = Instruction(opname="JUMP_BACKWARD", opcode=dis.opmap["JUMP_BACKWARD"], arg=delta, argval=delta, | ||||
|                                   argrepr='', offset=200, start_offset=200, starts_line=1, is_jump_target=False, | ||||
|                                   positions=None) | ||||
|         self.assertEqual(200 + 2 - 100*2 + 2*1, instruction.jump_target) | ||||
| 
 | ||||
|         # Make sure cache entries are handled | ||||
|         instruction = Instruction(opname="SEND", opcode=dis.opmap["SEND"], arg=delta, argval=delta, | ||||
|                                   argrepr='', offset=10, start_offset=10, starts_line=1, is_jump_target=False, | ||||
|                                   positions=None) | ||||
|         self.assertEqual(10 + 2 + 1*2 + 100*2, instruction.jump_target) | ||||
| 
 | ||||
|     def test_start_offset(self): | ||||
|         # When no extended args are present, | ||||
|         # start_offset should be equal to offset | ||||
|         instructions = list(dis.Bytecode(_f)) | ||||
|         for instruction in instructions: | ||||
|             self.assertEqual(instruction.offset, instruction.start_offset) | ||||
| 
 | ||||
|         code = bytes([ | ||||
|             opcode.opmap["LOAD_FAST"], 0x00, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, | ||||
|         ]) | ||||
|         jump = list(dis._get_instructions_bytes(code))[-1] | ||||
|         self.assertEqual(4, jump.offset) | ||||
|         self.assertEqual(2, jump.start_offset) | ||||
| 
 | ||||
|         code = bytes([ | ||||
|             opcode.opmap["LOAD_FAST"], 0x00, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, | ||||
|         ]) | ||||
|         jump = list(dis._get_instructions_bytes(code))[-1] | ||||
|         self.assertEqual(8, jump.offset) | ||||
|         self.assertEqual(2, jump.start_offset) | ||||
| 
 | ||||
|         code = bytes([ | ||||
|             opcode.opmap["LOAD_FAST"], 0x00, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["EXTENDED_ARG"], 0x01, | ||||
|             opcode.opmap["POP_JUMP_IF_TRUE"], 0xFF, | ||||
|         ]) | ||||
|         instructions = list(dis._get_instructions_bytes(code)) | ||||
|         # 1st jump | ||||
|         self.assertEqual(4, instructions[2].offset) | ||||
|         self.assertEqual(2, instructions[2].start_offset) | ||||
|         # 2nd jump | ||||
|         self.assertEqual(12, instructions[6].offset) | ||||
|         self.assertEqual(6, instructions[6].start_offset) | ||||
| 
 | ||||
|     def test_cache_offset_and_end_offset(self): | ||||
|         code = bytes([ | ||||
|             opcode.opmap["LOAD_GLOBAL"], 0x01, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["LOAD_FAST"], 0x00, | ||||
|             opcode.opmap["CALL"], 0x01, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["CACHE"], 0x00, | ||||
|             opcode.opmap["CACHE"], 0x00 | ||||
|         ]) | ||||
|         instructions = list(dis._get_instructions_bytes(code)) | ||||
|         self.assertEqual(2, instructions[0].cache_offset) | ||||
|         self.assertEqual(10, instructions[0].end_offset) | ||||
|         self.assertEqual(12, instructions[1].cache_offset) | ||||
|         self.assertEqual(12, instructions[1].end_offset) | ||||
|         self.assertEqual(14, instructions[2].cache_offset) | ||||
|         self.assertEqual(20, instructions[2].end_offset) | ||||
| 
 | ||||
|         # end_offset of the previous instruction should be equal to the | ||||
|         # start_offset of the following instruction | ||||
|         instructions = list(dis.Bytecode(self.test_cache_offset_and_end_offset)) | ||||
|         for prev, curr in zip(instructions, instructions[1:]): | ||||
|             self.assertEqual(prev.end_offset, curr.start_offset) | ||||
| 
 | ||||
| 
 | ||||
| # get_instructions has its own tests above, so can rely on it to validate | ||||
| # the object oriented API | ||||
| class BytecodeTests(InstructionTestCase, DisTestBase): | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| Add fields ``start_offset``, ``cache_offset``, ``end_offset``, | ||||
| ``baseopname``, ``baseopcode``, ``jump_target`` and ``oparg`` to | ||||
| :class:`dis.Instruction`. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tomas R
						Tomas R