|
17 | 17 | _specialized_opmap, |
18 | 18 | ) |
19 | 19 |
|
| 20 | +from _opcode import get_executor |
| 21 | + |
20 | 22 | __all__ = ["code_info", "dis", "disassemble", "distb", "disco", |
21 | 23 | "findlinestarts", "findlabels", "show_code", |
22 | 24 | "get_instructions", "Instruction", "Bytecode"] + _opcodes_all |
@@ -205,7 +207,27 @@ def _deoptop(op): |
205 | 207 | return _all_opmap[deoptmap[name]] if name in deoptmap else op |
206 | 208 |
|
207 | 209 | def _get_code_array(co, adaptive): |
208 | | - return co._co_code_adaptive if adaptive else co.co_code |
| 210 | + if adaptive: |
| 211 | + code = co._co_code_adaptive |
| 212 | + res = [] |
| 213 | + found = False |
| 214 | + for i in range(0, len(code), 2): |
| 215 | + op, arg = code[i], code[i+1] |
| 216 | + if op == ENTER_EXECUTOR: |
| 217 | + try: |
| 218 | + ex = get_executor(co, i) |
| 219 | + except ValueError: |
| 220 | + ex = None |
| 221 | + |
| 222 | + if ex: |
| 223 | + op, arg = ex.get_opcode(), ex.get_oparg() |
| 224 | + found = True |
| 225 | + |
| 226 | + res.append(op.to_bytes()) |
| 227 | + res.append(arg.to_bytes()) |
| 228 | + return code if not found else b''.join(res) |
| 229 | + else: |
| 230 | + return co.co_code |
209 | 231 |
|
210 | 232 | def code_info(x): |
211 | 233 | """Formatted details of methods, functions, or code.""" |
@@ -514,8 +536,6 @@ def offset_from_jump_arg(self, op, arg, offset): |
514 | 536 | argval = offset + 2 + signed_arg*2 |
515 | 537 | caches = _get_cache_size(_all_opname[deop]) |
516 | 538 | argval += 2 * caches |
517 | | - if deop == ENTER_EXECUTOR: |
518 | | - argval += 2 |
519 | 539 | return argval |
520 | 540 | return None |
521 | 541 |
|
@@ -680,8 +700,7 @@ def _parse_exception_table(code): |
680 | 700 |
|
681 | 701 | def _is_backward_jump(op): |
682 | 702 | return opname[op] in ('JUMP_BACKWARD', |
683 | | - 'JUMP_BACKWARD_NO_INTERRUPT', |
684 | | - 'ENTER_EXECUTOR') |
| 703 | + 'JUMP_BACKWARD_NO_INTERRUPT') |
685 | 704 |
|
686 | 705 | def _get_instructions_bytes(code, linestarts=None, line_offset=0, co_positions=None, |
687 | 706 | original_code=None, arg_resolver=None): |
|
0 commit comments