this repo has no description
at trunk 271 lines 9.1 kB view raw
1# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2from .opcodebase import Opcode 3 4opcode: Opcode = Opcode() 5opcode.def_op("POP_TOP", 1) 6opcode.def_op("ROT_TWO", 2) 7opcode.def_op("ROT_THREE", 3) 8opcode.def_op("DUP_TOP", 4) 9opcode.def_op("DUP_TOP_TWO", 5) 10opcode.def_op("NOP", 9) 11opcode.def_op("UNARY_POSITIVE", 10) 12opcode.def_op("UNARY_NEGATIVE", 11) 13opcode.def_op("UNARY_NOT", 12) 14opcode.def_op("UNARY_INVERT", 15) 15opcode.def_op("BINARY_MATRIX_MULTIPLY", 16) 16opcode.def_op("INPLACE_MATRIX_MULTIPLY", 17) 17opcode.def_op("BINARY_POWER", 19) 18opcode.def_op("BINARY_MULTIPLY", 20) 19opcode.def_op("BINARY_MODULO", 22) 20opcode.def_op("BINARY_ADD", 23) 21opcode.def_op("BINARY_SUBTRACT", 24) 22opcode.def_op("BINARY_SUBSCR", 25) 23opcode.def_op("BINARY_FLOOR_DIVIDE", 26) 24opcode.def_op("BINARY_TRUE_DIVIDE", 27) 25opcode.def_op("INPLACE_FLOOR_DIVIDE", 28) 26opcode.def_op("INPLACE_TRUE_DIVIDE", 29) 27opcode.def_op("GET_AITER", 50) 28opcode.def_op("GET_ANEXT", 51) 29opcode.def_op("BEFORE_ASYNC_WITH", 52) 30opcode.def_op("INPLACE_ADD", 55) 31opcode.def_op("INPLACE_SUBTRACT", 56) 32opcode.def_op("INPLACE_MULTIPLY", 57) 33opcode.def_op("INPLACE_MODULO", 59) 34opcode.def_op("STORE_SUBSCR", 60) 35opcode.def_op("DELETE_SUBSCR", 61) 36opcode.def_op("BINARY_LSHIFT", 62) 37opcode.def_op("BINARY_RSHIFT", 63) 38opcode.def_op("BINARY_AND", 64) 39opcode.def_op("BINARY_XOR", 65) 40opcode.def_op("BINARY_OR", 66) 41opcode.def_op("INPLACE_POWER", 67) 42opcode.def_op("GET_ITER", 68) 43opcode.def_op("GET_YIELD_FROM_ITER", 69) 44opcode.def_op("PRINT_EXPR", 70) 45opcode.def_op("LOAD_BUILD_CLASS", 71) 46opcode.def_op("YIELD_FROM", 72) 47opcode.def_op("GET_AWAITABLE", 73) 48opcode.def_op("INPLACE_LSHIFT", 75) 49opcode.def_op("INPLACE_RSHIFT", 76) 50opcode.def_op("INPLACE_AND", 77) 51opcode.def_op("INPLACE_XOR", 78) 52opcode.def_op("INPLACE_OR", 79) 53opcode.def_op("BREAK_LOOP", 80) 54opcode.def_op("WITH_CLEANUP_START", 81) 55opcode.def_op("WITH_CLEANUP_FINISH", 82) 56opcode.def_op("RETURN_VALUE", 83) 57opcode.def_op("IMPORT_STAR", 84) 58opcode.def_op("SETUP_ANNOTATIONS", 85) 59opcode.def_op("YIELD_VALUE", 86) 60opcode.def_op("POP_BLOCK", 87) 61opcode.def_op("END_FINALLY", 88) 62opcode.def_op("POP_EXCEPT", 89) 63# Opcodes from here have an argument: 64opcode.name_op("STORE_NAME", 90) # Index in name list 65opcode.name_op("DELETE_NAME", 91) # "" 66opcode.def_op("UNPACK_SEQUENCE", 92) # Number of tuple items 67opcode.jrel_op("FOR_ITER", 93) 68opcode.def_op("UNPACK_EX", 94) 69opcode.name_op("STORE_ATTR", 95) # Index in name list 70opcode.name_op("DELETE_ATTR", 96) # "" 71opcode.name_op("STORE_GLOBAL", 97) # "" 72opcode.name_op("DELETE_GLOBAL", 98) # "" 73opcode.def_op("LOAD_CONST", 100) # Index in const list 74opcode.hasconst.add(100) 75opcode.name_op("LOAD_NAME", 101) # Index in name list 76opcode.def_op("BUILD_TUPLE", 102) # Number of tuple items 77opcode.def_op("BUILD_LIST", 103) # Number of list items 78opcode.def_op("BUILD_SET", 104) # Number of set items 79opcode.def_op("BUILD_MAP", 105) # Number of dict entries 80opcode.name_op("LOAD_ATTR", 106) # Index in name list 81opcode.def_op("COMPARE_OP", 107) # Comparison operator 82opcode.hascompare.add(107) 83opcode.name_op("IMPORT_NAME", 108) # Index in name list 84opcode.name_op("IMPORT_FROM", 109) # Index in name list 85opcode.jrel_op("JUMP_FORWARD", 110) # Number of bytes to skip 86opcode.jabs_op("JUMP_IF_FALSE_OR_POP", 111) # Target byte offset from beginning of code 87opcode.jabs_op("JUMP_IF_TRUE_OR_POP", 112) # "" 88opcode.jabs_op("JUMP_ABSOLUTE", 113) # "" 89opcode.jabs_op("POP_JUMP_IF_FALSE", 114) # "" 90opcode.jabs_op("POP_JUMP_IF_TRUE", 115) # "" 91opcode.name_op("LOAD_GLOBAL", 116) # Index in name list 92opcode.jabs_op("CONTINUE_LOOP", 119) # Target address 93opcode.jrel_op("SETUP_LOOP", 120) # Distance to target address 94opcode.jrel_op("SETUP_EXCEPT", 121) # "" 95opcode.jrel_op("SETUP_FINALLY", 122) # "" 96opcode.def_op("LOAD_FAST", 124) # Local variable number 97opcode.haslocal.add(124) 98opcode.def_op("STORE_FAST", 125) # Local variable number 99opcode.haslocal.add(125) 100opcode.def_op("DELETE_FAST", 126) # Local variable number 101opcode.haslocal.add(126) 102opcode.name_op("STORE_ANNOTATION", 127) # Index in name list 103opcode.def_op("RAISE_VARARGS", 130) # Number of raise arguments (1, 2, or 3) 104opcode.def_op("CALL_FUNCTION", 131) # #args 105opcode.def_op("MAKE_FUNCTION", 132) # Flags 106opcode.def_op("BUILD_SLICE", 133) # Number of items 107opcode.def_op("LOAD_CLOSURE", 135) 108opcode.hasfree.add(135) 109opcode.def_op("LOAD_DEREF", 136) 110opcode.hasfree.add(136) 111opcode.def_op("STORE_DEREF", 137) 112opcode.hasfree.add(137) 113opcode.def_op("DELETE_DEREF", 138) 114opcode.hasfree.add(138) 115opcode.def_op("CALL_FUNCTION_KW", 141) # #args + #kwargs 116opcode.def_op("CALL_FUNCTION_EX", 142) # Flags 117opcode.jrel_op("SETUP_WITH", 143) 118opcode.def_op("LIST_APPEND", 145) 119opcode.def_op("SET_ADD", 146) 120opcode.def_op("MAP_ADD", 147) 121opcode.def_op("LOAD_CLASSDEREF", 148) 122opcode.hasfree.add(148) 123opcode.def_op("EXTENDED_ARG", 144) 124opcode.def_op("BUILD_LIST_UNPACK", 149) 125opcode.def_op("BUILD_MAP_UNPACK", 150) 126opcode.def_op("BUILD_MAP_UNPACK_WITH_CALL", 151) 127opcode.def_op("BUILD_TUPLE_UNPACK", 152) 128opcode.def_op("BUILD_SET_UNPACK", 153) 129opcode.jrel_op("SETUP_ASYNC_WITH", 154) 130opcode.def_op("FORMAT_VALUE", 155) 131opcode.def_op("BUILD_CONST_KEY_MAP", 156) 132opcode.def_op("BUILD_STRING", 157) 133opcode.def_op("BUILD_TUPLE_UNPACK_WITH_CALL", 158) 134 135FVC_MASK = 0x3 136FVC_NONE = 0x0 137FVC_STR = 0x1 138FVC_REPR = 0x2 139FVC_ASCII = 0x3 140FVS_MASK = 0x4 141FVS_HAVE_SPEC = 0x4 142 143opcode.stack_effects.update( 144 NOP=0, 145 POP_TOP=-1, 146 ROT_TWO=0, 147 ROT_THREE=0, 148 DUP_TOP=1, 149 DUP_TOP_TWO=2, 150 UNARY_POSITIVE=0, 151 UNARY_NEGATIVE=0, 152 UNARY_NOT=0, 153 UNARY_INVERT=0, 154 SET_ADD=-1, 155 LIST_APPEND=-1, 156 MAP_ADD=-2, 157 BINARY_POWER=-1, 158 BINARY_MULTIPLY=-1, 159 BINARY_MATRIX_MULTIPLY=-1, 160 BINARY_MODULO=-1, 161 BINARY_ADD=-1, 162 BINARY_SUBTRACT=-1, 163 BINARY_SUBSCR=-1, 164 BINARY_FLOOR_DIVIDE=-1, 165 BINARY_TRUE_DIVIDE=-1, 166 INPLACE_FLOOR_DIVIDE=-1, 167 INPLACE_TRUE_DIVIDE=-1, 168 INPLACE_ADD=-1, 169 INPLACE_SUBTRACT=-1, 170 INPLACE_MULTIPLY=-1, 171 INPLACE_MATRIX_MULTIPLY=-1, 172 INPLACE_MODULO=-1, 173 STORE_SUBSCR=-3, 174 DELETE_SUBSCR=-2, 175 BINARY_LSHIFT=-1, 176 BINARY_RSHIFT=-1, 177 BINARY_AND=-1, 178 BINARY_XOR=-1, 179 BINARY_OR=-1, 180 INPLACE_POWER=-1, 181 GET_ITER=0, 182 PRINT_EXPR=-1, 183 LOAD_BUILD_CLASS=1, 184 INPLACE_LSHIFT=-1, 185 INPLACE_RSHIFT=-1, 186 INPLACE_AND=-1, 187 INPLACE_XOR=-1, 188 INPLACE_OR=-1, 189 BREAK_LOOP=0, 190 SETUP_WITH=7, 191 WITH_CLEANUP_START=1, 192 WITH_CLEANUP_FINISH=-1, # XXX Sometimes more 193 RETURN_VALUE=-1, 194 IMPORT_STAR=-1, 195 SETUP_ANNOTATIONS=0, 196 YIELD_VALUE=0, 197 YIELD_FROM=-1, 198 POP_BLOCK=0, 199 POP_EXCEPT=0, # -3 except if bad bytecode 200 END_FINALLY=-1, # or -2 or -3 if exception occurred 201 STORE_NAME=-1, 202 DELETE_NAME=0, 203 UNPACK_SEQUENCE=lambda oparg, jmp=0: oparg - 1, 204 UNPACK_EX=lambda oparg, jmp=0: (oparg & 0xFF) + (oparg >> 8), 205 FOR_ITER=1, # or -1, at end of iterator 206 STORE_ATTR=-2, 207 DELETE_ATTR=-1, 208 STORE_GLOBAL=-1, 209 DELETE_GLOBAL=0, 210 LOAD_CONST=1, 211 LOAD_NAME=1, 212 BUILD_TUPLE=lambda oparg, jmp=0: 1 - oparg, 213 BUILD_LIST=lambda oparg, jmp=0: 1 - oparg, 214 BUILD_SET=lambda oparg, jmp=0: 1 - oparg, 215 BUILD_STRING=lambda oparg, jmp=0: 1 - oparg, 216 BUILD_LIST_UNPACK=lambda oparg, jmp=0: 1 - oparg, 217 BUILD_TUPLE_UNPACK=lambda oparg, jmp=0: 1 - oparg, 218 BUILD_TUPLE_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg, 219 BUILD_SET_UNPACK=lambda oparg, jmp=0: 1 - oparg, 220 BUILD_MAP_UNPACK=lambda oparg, jmp=0: 1 - oparg, 221 BUILD_MAP_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg, 222 BUILD_MAP=lambda oparg, jmp=0: 1 - 2 * oparg, 223 BUILD_CONST_KEY_MAP=lambda oparg, jmp=0: -oparg, 224 LOAD_ATTR=0, 225 COMPARE_OP=-1, 226 IMPORT_NAME=-1, 227 IMPORT_FROM=1, 228 JUMP_FORWARD=0, 229 JUMP_IF_TRUE_OR_POP=0, # -1 if jump not taken 230 JUMP_IF_FALSE_OR_POP=0, # "" 231 JUMP_ABSOLUTE=0, 232 POP_JUMP_IF_FALSE=-1, 233 POP_JUMP_IF_TRUE=-1, 234 LOAD_GLOBAL=1, 235 CONTINUE_LOOP=0, 236 SETUP_LOOP=0, 237 # close enough... 238 SETUP_EXCEPT=6, 239 SETUP_FINALLY=6, # can push 3 values for the new exception 240 # + 3 others for the previous exception state 241 LOAD_FAST=1, 242 STORE_FAST=-1, 243 DELETE_FAST=0, 244 STORE_ANNOTATION=-1, 245 RAISE_VARARGS=lambda oparg, jmp=0: -oparg, 246 CALL_FUNCTION=lambda oparg, jmp=0: -oparg, 247 CALL_FUNCTION_KW=lambda oparg, jmp=0: -oparg - 1, 248 CALL_FUNCTION_EX=lambda oparg, jmp=0: -1 - ((oparg & 0x01) != 0), 249 MAKE_FUNCTION=lambda oparg, jmp=0: -1 250 - ((oparg & 0x01) != 0) 251 - ((oparg & 0x02) != 0) 252 - ((oparg & 0x04) != 0) 253 - ((oparg & 0x08) != 0), 254 BUILD_SLICE=lambda oparg, jmp=0: -2 if oparg == 3 else -1, 255 LOAD_CLOSURE=1, 256 LOAD_DEREF=1, 257 LOAD_CLASSDEREF=1, 258 STORE_DEREF=-1, 259 DELETE_DEREF=0, 260 GET_AWAITABLE=0, 261 SETUP_ASYNC_WITH=6, 262 BEFORE_ASYNC_WITH=1, 263 GET_AITER=0, 264 GET_ANEXT=1, 265 GET_YIELD_FROM_ITER=0, 266 # If there's a fmt_spec on the stack, we go from 2->1, 267 # else 1->1. 268 FORMAT_VALUE=lambda oparg, jmp=0: -1 if (oparg & FVS_MASK) == FVS_HAVE_SPEC else 0, 269 SET_LINENO=0, 270 EXTENDED_ARG=0, 271)