| |
| """ |
| 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 _opcode |
| from _opcode import stack_effect |
| |
| from _opcode_metadata import (_specializations, _specialized_opmap, opmap, |
| HAVE_ARGUMENT, MIN_INSTRUMENTED_OPCODE) |
| EXTENDED_ARG = opmap['EXTENDED_ARG'] |
| |
| opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)] |
| for op, i in opmap.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() |
| _nb_ops = _opcode.get_nb_ops() |
| |
| hascompare = [opmap["COMPARE_OP"]] |
| |
| _cache_format = { |
| "LOAD_GLOBAL": { |
| "counter": 1, |
| "index": 1, |
| "module_keys_version": 1, |
| "builtin_keys_version": 1, |
| }, |
| "BINARY_OP": { |
| "counter": 1, |
| }, |
| "UNPACK_SEQUENCE": { |
| "counter": 1, |
| }, |
| "COMPARE_OP": { |
| "counter": 1, |
| }, |
| "BINARY_SUBSCR": { |
| "counter": 1, |
| }, |
| "FOR_ITER": { |
| "counter": 1, |
| }, |
| "LOAD_SUPER_ATTR": { |
| "counter": 1, |
| }, |
| "LOAD_ATTR": { |
| "counter": 1, |
| "version": 2, |
| "keys_version": 2, |
| "descr": 4, |
| }, |
| "STORE_ATTR": { |
| "counter": 1, |
| "version": 2, |
| "index": 1, |
| }, |
| "CALL": { |
| "counter": 1, |
| "func_version": 2, |
| }, |
| "STORE_SUBSCR": { |
| "counter": 1, |
| }, |
| "SEND": { |
| "counter": 1, |
| }, |
| "JUMP_BACKWARD": { |
| "counter": 1, |
| }, |
| "TO_BOOL": { |
| "counter": 1, |
| "version": 2, |
| }, |
| } |
| |
| _inline_cache_entries = { |
| name : sum(value.values()) for (name, value) in _cache_format.items() |
| } |