1 2""" 3opcode module - potentially shared between dis and other modules which 4operate on bytecodes (e.g. peephole optimizers). 5""" 6 7 8__all__ = ["cmp_op", "stack_effect", "hascompare", "opname", "opmap", 9 "HAVE_ARGUMENT", "EXTENDED_ARG", "hasarg", "hasconst", "hasname", 10 "hasjump", "hasjrel", "hasjabs", "hasfree", "haslocal", "hasexc"] 11 12import _opcode 13from _opcode import stack_effect 14 15from _opcode_metadata import (_specializations, _specialized_opmap, opmap, 16 HAVE_ARGUMENT, MIN_INSTRUMENTED_OPCODE) 17EXTENDED_ARG = opmap['EXTENDED_ARG'] 18 19opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)] 20for op, i in opmap.items(): 21 opname[i] = op 22 23cmp_op = ('<', '<=', '==', '!=', '>', '>=') 24 25# These lists are documented as part of the dis module's API 26hasarg = [op for op in opmap.values() if _opcode.has_arg(op)] 27hasconst = [op for op in opmap.values() if _opcode.has_const(op)] 28hasname = [op for op in opmap.values() if _opcode.has_name(op)] 29hasjump = [op for op in opmap.values() if _opcode.has_jump(op)] 30hasjrel = hasjump # for backward compatibility 31hasjabs = [] 32hasfree = [op for op in opmap.values() if _opcode.has_free(op)] 33haslocal = [op for op in opmap.values() if _opcode.has_local(op)] 34hasexc = [op for op in opmap.values() if _opcode.has_exc(op)] 35 36 37_intrinsic_1_descs = _opcode.get_intrinsic1_descs() 38_intrinsic_2_descs = _opcode.get_intrinsic2_descs() 39_nb_ops = _opcode.get_nb_ops() 40 41hascompare = [opmap["COMPARE_OP"]] 42 43_cache_format = { 44 "LOAD_GLOBAL": { 45 "counter": 1, 46 "index": 1, 47 "module_keys_version": 1, 48 "builtin_keys_version": 1, 49 }, 50 "BINARY_OP": { 51 "counter": 1, 52 }, 53 "UNPACK_SEQUENCE": { 54 "counter": 1, 55 }, 56 "COMPARE_OP": { 57 "counter": 1, 58 }, 59 "CONTAINS_OP": { 60 "counter": 1, 61 }, 62 "BINARY_SUBSCR": { 63 "counter": 1, 64 }, 65 "FOR_ITER": { 66 "counter": 1, 67 }, 68 "LOAD_SUPER_ATTR": { 69 "counter": 1, 70 }, 71 "LOAD_ATTR": { 72 "counter": 1, 73 "version": 2, 74 "keys_version": 2, 75 "descr": 4, 76 }, 77 "STORE_ATTR": { 78 "counter": 1, 79 "version": 2, 80 "index": 1, 81 }, 82 "CALL": { 83 "counter": 1, 84 "func_version": 2, 85 }, 86 "STORE_SUBSCR": { 87 "counter": 1, 88 }, 89 "SEND": { 90 "counter": 1, 91 }, 92 "JUMP_BACKWARD": { 93 "counter": 1, 94 }, 95 "TO_BOOL": { 96 "counter": 1, 97 "version": 2, 98 }, 99 "POP_JUMP_IF_TRUE": { 100 "counter": 1, 101 }, 102 "POP_JUMP_IF_FALSE": { 103 "counter": 1, 104 }, 105 "POP_JUMP_IF_NONE": { 106 "counter": 1, 107 }, 108 "POP_JUMP_IF_NOT_NONE": { 109 "counter": 1, 110 }, 111} 112 113_inline_cache_entries = { 114 name : sum(value.values()) for (name, value) in _cache_format.items() 115} 116