erg_common/
opcode309.rs

1//! defines `Opcode` (represents Python bytecode opcodes).
2//!
3//! Opcode(Pythonバイトコードオペコードを表す)を定義する
4
5#![allow(dead_code)]
6#![allow(non_camel_case_types)]
7
8use crate::impl_u8_enum;
9
10impl_u8_enum! {Opcode309;
11    POP_TOP = 1,
12    ROT_TWO = 2,
13    ROT_THREE = 3,
14    DUP_TOP = 4,
15    DUP_TOP2 = 5,
16    ROT_FOUR = 6,
17    NOP = 9,
18    UNARY_POSITIVE = 10,
19    UNARY_NEGATIVE = 11,
20    UNARY_NOT = 12,
21    UNARY_INVERT = 15,
22    BINARY_MATRIX_MULTIPLY = 16,
23    INPLACE_MATRIX_MULTIPLY = 17,
24    BINARY_POWER = 19,
25    BINARY_MULTIPLY = 20,
26    BINARY_MODULO = 22,
27    BINARY_ADD = 23,
28    BINARY_SUBTRACT = 24,
29    BINARY_SUBSCR = 25,
30    BINARY_FLOOR_DIVIDE = 26,
31    BINARY_TRUE_DIVIDE = 27,
32    INPLACE_FLOOR_DIVIDE = 28,
33    INPLACE_TRUE_DIVIDE = 29,
34    // GET_LEN = 30,
35    // MATCH_MAPPING = 31,
36    // MATCH_SEQUENCE = 32,
37    // MATCH_KEYS = 33,
38    // PUSH_EXC_INFO = 35,
39    // CHECK_EXC_MATCH = 36,
40    // CHECK_EG_MATCH = 37,
41    RERAISE = 48,
42    WITH_EXCEPT_START = 49,
43    GET_AITER = 50,
44    GET_ANEXT = 51,
45    BEFORE_ASYNC_WITH = 52,
46    // BEGIN_FINALLY = 53,
47    END_ASYNC_FOR = 54,
48    // TODO:
49    INPLACE_ADD = 55,
50    INPLACE_SUBTRACT = 56,
51    INPLACE_MULTIPLY = 57,
52    INPLACE_MODULO = 59,
53    STORE_SUBSCR = 60,
54    BINARY_AND = 64,
55    BINARY_XOR = 65,
56    BINARY_OR = 66,
57    GET_ITER = 68,
58    GET_YIELD_FROM_ITER = 69,
59    PRINT_EXPR = 70,
60    LOAD_BUILD_CLASS = 71,
61    // LOAD_ASSERTION_ERROR = 74,
62    // WITH_CLEANUP_START = 81,
63    WITH_CLEANUP_FINISH = 82,
64    RETURN_VALUE = 83,
65    IMPORT_STAR = 84,
66    SETUP_ANNOTATIONS = 85,
67    YIELD_VALUE = 86,
68    POP_BLOCK = 87,
69    // END_FINALLY = 88,
70    POP_EXCEPT = 89,
71    /* ↓ These opcodes take an arg */
72    STORE_NAME = 90,
73    DELETE_NAME = 91,
74    UNPACK_SEQUENCE = 92,
75    FOR_ITER = 93,
76    UNPACK_EX = 94,
77    STORE_ATTR = 95,
78    STORE_GLOBAL = 97,
79    LOAD_CONST = 100,
80    LOAD_NAME = 101,
81    BUILD_TUPLE = 102,
82    BUILD_LIST = 103,
83    BUILD_SET = 104,
84    BUILD_MAP = 105, // build a Dict object
85    LOAD_ATTR = 106,
86    COMPARE_OP = 107,
87    IMPORT_NAME = 108,
88    IMPORT_FROM = 109,
89    JUMP_FORWARD = 110,
90    JUMP_IF_FALSE_OR_POP = 111,
91    JUMP_IF_TRUE_OR_POP = 112,
92    JUMP_ABSOLUTE = 113,
93    POP_JUMP_IF_FALSE = 114,
94    POP_JUMP_IF_TRUE = 115,
95    LOAD_GLOBAL = 116,
96    IS_OP = 117,
97    CONTAINS_OP = 118,
98    LOAD_FAST = 124,
99    STORE_FAST = 125,
100    DELETE_FAST = 126,
101    RAISE_VARARGS = 130,
102    CALL_FUNCTION = 131,
103    MAKE_FUNCTION = 132,
104    LOAD_CLOSURE = 135,
105    LOAD_DEREF = 136,
106    STORE_DEREF = 137,
107    CALL_FUNCTION_KW = 141,
108    CALL_FUNCTION_EX = 142,
109    SETUP_WITH = 143,
110    EXTENDED_ARG = 144,
111    BUILD_CONST_KEY_MAP = 156,
112    BUILD_STRING = 157,
113    BUILD_TUPLE_UNPACK_WITH_CALL = 158,
114    LOAD_METHOD = 160,
115    CALL_METHOD = 161,
116    LIST_EXTEND = 162,
117    SET_UPDATE = 163,
118    DICT_MERGE = 164,
119    DICT_UPDATE = 165,
120    // Erg-specific opcodes (must have a unary `ERG_`)
121    // Define in descending order from 219, 255
122    ERG_POP_NTH = 196,
123    ERG_PEEK_NTH = 197, // get ref to the arg-th element from TOS
124    ERG_INC = 198,      // name += 1; arg: typecode
125    ERG_DEC = 199,      // name -= 1
126    ERG_LOAD_FAST_IMMUT = 200,
127    ERG_STORE_FAST_IMMUT = 201,
128    ERG_MOVE_FAST = 202,
129    ERG_CLONE_FAST = 203,
130    ERG_COPY_FAST = 204,
131    ERG_REF_FAST = 205,
132    ERG_REF_MUT_FAST = 206,
133    ERG_MOVE_OUTER = 207,
134    ERG_CLONE_OUTER = 208,
135    ERG_COPY_OUTER = 209,
136    ERG_REF_OUTER = 210,
137    ERG_REF_MUT_OUTER = 211,
138    ERG_LESS_THAN = 212,
139    ERG_LESS_EQUAL = 213,
140    ERG_EQUAL = 214,
141    ERG_NOT_EQUAL = 215,
142    ERG_MAKE_SLOT = 216,
143    ERG_MAKE_TYPE = 217,
144    ERG_MAKE_PURE_FUNCTION = 218,
145    ERG_CALL_PURE_FUNCTION = 219,
146    /* ↑ These opcodes take an arg ↑ */
147    /* ↓ These opcodes take no arg ↓ */
148    // ... = 220,
149    ERG_LOAD_EMPTY_SLOT = 242,
150    ERG_LOAD_EMPTY_STR = 243,
151    ERG_LOAD_1_NAT = 244,
152    ERG_LOAD_1_INT = 245,
153    ERG_LOAD_1_REAL = 246,
154    ERG_LOAD_NONE = 247,
155    ERG_MUTATE = 248, // !x
156    // `[] =` (it doesn't cause any exceptions)
157    ERG_STORE_SUBSCR = 249,
158    // ... = 250,
159    // `= []` (it doesn't cause any exceptions)
160    ERG_BINARY_SUBSCR = 251,
161    ERG_BINARY_RANGE = 252,
162    // `/?` (rhs may be 0, it may cause a runtime panic)
163    ERG_TRY_BINARY_DIVIDE = 253,
164    // `/` (rhs could not be 0, it doesn't cause any exceptions)
165    ERG_BINARY_TRUE_DIVIDE = 254,
166    NOT_IMPLEMENTED = 255,
167}