Provides tools for disassembling bytecode.
Code Disassembly in Kuroko
The dis
module contains functions for dealing with code objects which represent the compiled bytecode of a Kuroko function. The bytecode compilation process is entirely static and bytecode analysis can be performed without calling into the VM to run dynamic code.
Debugger Breakpoints
Kuroko interpreters can provide a debugger hook through the C API's krk_debug_registerCallback() function. Breakpoints can be managed both from the C API and from this module's addbreakpoint, delbreakpoint, enablebreakpoint, and disablebreakpoint methods.
Functions
_addbreakpoint(func, line)
Attach a breakpoint to a code object.
func
may be a filename string, or a function, method, or code object. Returns the new breakpoint index, or raises Exception if a breakpoint code not be added.
_build(code)
Compile a string to a code object.
Compiles the string code
and returns a code object. If a syntax error is encountered, it will be raised.
_delbreakpoint(handle)
Delete a breakpoint.
Delete the breakpoint specified by handle
, disabling it if it was enabled. May raise IndexError if handle
is not a valid breakpoint handle.
_dis(obj)
Disassemble an object.
Dumps a disassembly of the bytecode in the code object associated with obj
. If obj
can not be disassembled, a TypeError is raised.
_disablebreakpoint(handle)
Disable a breakpoint.
Disable the breakpoint specified by handle
. May raise IndexError if handle
is not a valid breakpoint handle.
_enablebreakpoint(handle)
Enable a breakpoint.
Enable the breakpoint specified by handle
. May raise IndexError if handle
is not a valid breakpoint handle.
_examine(func)
Convert a code object to a list of instructions.
Examines the code object func
and returns a list representation of its instructions. Each instruction entry is a tuple of the opcode, total instruction size in bytes, and the operand of the argument, either as an integer for jump offsets, the actual value for constant operands, or the name of a local or global variable if available.
_ip_to_expression(func,ip)
Map an IP in a codeobject or function to an expression span.
For various reasons, the instruction pointer ip
must be the last byte of an opcode.
Constants
let BREAKPOINT_ONCE = 1
let BREAKPOINT_REPEAT = 2
let OP_ADD = 39
let OP_ANNOTATE = 70
let OP_BEGIN_FINALLY = 2
let OP_BITAND = 72
let OP_BITNEGATE = 137
let OP_BITOR = 12
let OP_BITXOR = 95
let OP_BREAKPOINT = 43
let OP_CALL = 100
let OP_CALL_ITER = 149
let OP_CALL_LONG = 101
let OP_CALL_METHOD = 41
let OP_CALL_METHOD_LONG = 42
let OP_CLEANUP_WITH = 52
let OP_CLOSE_MANY = 10
let OP_CLOSE_MANY_LONG = 11
let OP_CLOSE_UPVALUE = 20
let OP_CLOSURE = 15
let OP_CLOSURE_LONG = 16
let OP_CONSTANT = 0
let OP_CONSTANT_LONG = 1
let OP_DEFINE_GLOBAL = 92
let OP_DEFINE_GLOBAL_LONG = 93
let OP_DEL_GLOBAL = 119
let OP_DEL_GLOBAL_LONG = 120
let OP_DEL_PROPERTY = 133
let OP_DEL_PROPERTY_LONG = 134
let OP_DICT_SET = 77
let OP_DICT_SET_LONG = 78
let OP_DICT_SET_TOP = 156
let OP_DICT_UPDATE_TOP = 155
let OP_DIVIDE = 53
let OP_DUP = 131
let OP_DUP_LONG = 132
let OP_END_FINALLY = 112
let OP_ENTER_EXCEPT = 162
let OP_EQUAL = 58
let OP_EXIT_LOOP = 34
let OP_EXIT_LOOP_LONG = 35
let OP_EXPAND_ARGS = 147
let OP_EXPAND_ARGS_LONG = 148
let OP_FALSE = 129
let OP_FILTER_EXCEPT = 71
let OP_FLOORDIV = 130
let OP_FORMAT_VALUE = 50
let OP_FORMAT_VALUE_LONG = 51
let OP_GET_GLOBAL = 44
let OP_GET_GLOBAL_LONG = 45
let OP_GET_LOCAL = 144
let OP_GET_LOCAL_LONG = 145
let OP_GET_METHOD = 107
let OP_GET_METHOD_LONG = 108
let OP_GET_NAME = 109
let OP_GET_NAME_LONG = 110
let OP_GET_PROPERTY = 126
let OP_GET_PROPERTY_LONG = 127
let OP_GET_SUPER = 84
let OP_GET_SUPER_LONG = 85
let OP_GET_UPVALUE = 7
let OP_GET_UPVALUE_LONG = 8
let OP_GREATER = 128
let OP_GREATER_EQUAL = 103
let OP_IMPORT = 21
let OP_IMPORT_FROM = 75
let OP_IMPORT_FROM_LONG = 76
let OP_IMPORT_LONG = 22
let OP_INPLACE_ADD = 106
let OP_INPLACE_BITAND = 30
let OP_INPLACE_BITOR = 89
let OP_INPLACE_BITXOR = 117
let OP_INPLACE_DIVIDE = 83
let OP_INPLACE_FLOORDIV = 29
let OP_INPLACE_MATMUL = 118
let OP_INPLACE_MODULO = 90
let OP_INPLACE_MULTIPLY = 146
let OP_INPLACE_POW = 140
let OP_INPLACE_SHIFTLEFT = 27
let OP_INPLACE_SHIFTRIGHT = 121
let OP_INPLACE_SUBTRACT = 96
let OP_INVOKE_AWAIT = 38
let OP_INVOKE_CONTAINS = 81
let OP_INVOKE_DELETE = 66
let OP_INVOKE_GETTER = 80
let OP_INVOKE_ITER = 49
let OP_INVOKE_SETTER = 82
let OP_IS = 3
let OP_JUMP = 23
let OP_JUMP_IF_FALSE_OR_POP = 24
let OP_JUMP_IF_TRUE_OR_POP = 150
let OP_KWARGS = 56
let OP_KWARGS_LONG = 57
let OP_LESS = 94
let OP_LESS_EQUAL = 111
let OP_LIST_APPEND = 25
let OP_LIST_APPEND_LONG = 26
let OP_LIST_APPEND_TOP = 154
let OP_LIST_EXTEND_TOP = 153
let OP_LOOP = 136
let OP_LOOP_ITER = 60
let OP_MAKE_DICT = 115
let OP_MAKE_DICT_LONG = 116
let OP_MAKE_LIST = 142
let OP_MAKE_LIST_LONG = 143
let OP_MAKE_SET = 18
let OP_MAKE_SET_LONG = 19
let OP_MAKE_STRING = 36
let OP_MAKE_STRING_LONG = 37
let OP_MATMUL = 113
let OP_MISSING_KW = 151
let OP_MISSING_KW_LONG = 152
let OP_MODULO = 114
let OP_MULTIPLY = 135
let OP_NEGATE = 48
let OP_NONE = 73
let OP_NOT = 99
let OP_OVERLONG_JUMP = 164
let OP_POP = 74
let OP_POP_JUMP_IF_FALSE = 69
let OP_POP_MANY = 4
let OP_POP_MANY_LONG = 5
let OP_POS = 91
let OP_POW = 139
let OP_PUSH_BUILD_CLASS = 165
let OP_PUSH_TRY = 6
let OP_PUSH_WITH = 102
let OP_RAISE = 33
let OP_RAISE_FROM = 67
let OP_RETURN = 138
let OP_REVERSE = 124
let OP_REVERSE_LONG = 125
let OP_SET_ADD = 13
let OP_SET_ADD_LONG = 14
let OP_SET_ADD_TOP = 158
let OP_SET_GLOBAL = 31
let OP_SET_GLOBAL_LONG = 32
let OP_SET_LOCAL = 64
let OP_SET_LOCAL_LONG = 65
let OP_SET_LOCAL_POP = 46
let OP_SET_LOCAL_POP_LONG = 47
let OP_SET_NAME = 104
let OP_SET_NAME_LONG = 105
let OP_SET_PROPERTY = 61
let OP_SET_PROPERTY_LONG = 62
let OP_SET_UPDATE_TOP = 157
let OP_SET_UPVALUE = 54
let OP_SET_UPVALUE_LONG = 55
let OP_SHIFTLEFT = 68
let OP_SHIFTRIGHT = 17
let OP_SLICE = 97
let OP_SLICE_LONG = 98
let OP_SUBTRACT = 40
let OP_SWAP = 9
let OP_SWAP_POP = 163
let OP_TEST_ARG = 79
let OP_TRUE = 28
let OP_TRY_ELSE = 63
let OP_TUPLE = 87
let OP_TUPLE_FROM_LIST = 159
let OP_TUPLE_LONG = 88
let OP_UNPACK = 122
let OP_UNPACK_EX = 160
let OP_UNPACK_EX_LONG = 161
let OP_UNPACK_LONG = 123
let OP_UNSET = 59
let OP_YIELD = 86
let OP_YIELD_FROM = 141