| |
| """ |
| opcode module - potentially shared between dis and other modules which |
| operate on bytecodes (e.g. peephole optimizers). |
| """ |
| |
| |
| __all__ = ["cmp_op", "stack_effect", "hascompare", "opname", "opmap", |
| "HAVE_ARGUMENT", "EXTENDED_ARG", "hasarg", "hasconst", "hasname", |
| "hasjump", "hasjrel", "hasjabs", "hasfree", "haslocal", "hasexc"] |
| |
| import builtins |
| import _opcode |
| from _opcode import stack_effect |
| |
| from _opcode_metadata import (_specializations, _specialized_opmap, opmap, # noqa: F401 |
| HAVE_ARGUMENT, MIN_INSTRUMENTED_OPCODE) # noqa: F401 |
| EXTENDED_ARG = opmap['EXTENDED_ARG'] |
| |
| opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)] |
| for m in (opmap, _specialized_opmap): |
| for op, i in m.items(): |
| opname[i] = op |
| |
| cmp_op = ('<', '<=', '==', '!=', '>', '>=') |
| |
| # These lists are documented as part of the dis module's API |
| hasarg = [op for op in opmap.values() if _opcode.has_arg(op)] |
| hasconst = [op for op in opmap.values() if _opcode.has_const(op)] |
| hasname = [op for op in opmap.values() if _opcode.has_name(op)] |
| hasjump = [op for op in opmap.values() if _opcode.has_jump(op)] |
| hasjrel = hasjump # for backward compatibility |
| hasjabs = [] |
| hasfree = [op for op in opmap.values() if _opcode.has_free(op)] |
| haslocal = [op for op in opmap.values() if _opcode.has_local(op)] |
| hasexc = [op for op in opmap.values() if _opcode.has_exc(op)] |
| |
| |
| _intrinsic_1_descs = _opcode.get_intrinsic1_descs() |
| _intrinsic_2_descs = _opcode.get_intrinsic2_descs() |
| _special_method_names = _opcode.get_special_method_names() |
| _common_constants = [builtins.AssertionError, builtins.NotImplementedError, |
| builtins.tuple, builtins.all, builtins.any, builtins.list, |
| builtins.set] |
| _nb_ops = _opcode.get_nb_ops() |
| |
| hascompare = [opmap["COMPARE_OP"]] |
| |
| _cache_format = frozendict( |
| LOAD_GLOBAL=frozendict( |
| counter=1, |
| index=1, |
| module_keys_version=1, |
| builtin_keys_version=1, |
| ), |
| BINARY_OP=frozendict( |
| counter=1, |
| descr=4, |
| ), |
| UNPACK_SEQUENCE=frozendict( |
| counter=1, |
| ), |
| COMPARE_OP=frozendict( |
| counter=1, |
| ), |
| CONTAINS_OP=frozendict( |
| counter=1, |
| ), |
| FOR_ITER=frozendict( |
| counter=1, |
| ), |
| LOAD_SUPER_ATTR=frozendict( |
| counter=1, |
| ), |
| LOAD_ATTR=frozendict( |
| counter=1, |
| version=2, |
| keys_version=2, |
| descr=4, |
| ), |
| STORE_ATTR=frozendict( |
| counter=1, |
| version=2, |
| index=1, |
| ), |
| CALL=frozendict( |
| counter=1, |
| func_version=2, |
| ), |
| CALL_KW=frozendict( |
| counter=1, |
| func_version=2, |
| ), |
| CALL_FUNCTION_EX=frozendict( |
| counter=1, |
| ), |
| STORE_SUBSCR=frozendict( |
| counter=1, |
| ), |
| SEND=frozendict( |
| counter=1, |
| ), |
| JUMP_BACKWARD=frozendict( |
| counter=1, |
| ), |
| TO_BOOL=frozendict( |
| counter=1, |
| version=2, |
| ), |
| POP_JUMP_IF_TRUE=frozendict( |
| counter=1, |
| ), |
| POP_JUMP_IF_FALSE=frozendict( |
| counter=1, |
| ), |
| POP_JUMP_IF_NONE=frozendict( |
| counter=1, |
| ), |
| POP_JUMP_IF_NOT_NONE=frozendict( |
| counter=1, |
| ), |
| RESUME=frozendict( |
| counter=1, |
| ), |
| ) |
| |
| _inline_cache_entries = frozendict({ |
| name : sum(value.values()) for (name, value) in _cache_format.items() |
| }) |