-
Notifications
You must be signed in to change notification settings - Fork 1
/
pybytecode.go
135 lines (128 loc) · 1.87 KB
/
pybytecode.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package vm
type PyOpCode int
const (
STOP_CODE PyOpCode = iota
NOP
POP_TOP
ROT_TWO
ROT_THREE
DUP_TOP
DUP_TOP_TWO
UNARY_POSITIVE
UNARY_NEGATIVE
UNARY_NOT
UNARY_INVERT
GET_ITER
BINARY_POWER
BINARY_MULTIPLY
BINARY_FLOOR_DIVIDE
BINARY_TRUE_DIVIDE
BINARY_MODULO
BINARY_ADD
BINARY_SUBTRACT
BINARY_SUBSCR
BINARY_LSHIFT
BINARY_RSHIFT
BINARY_AND
BINARY_XOR
BINARY_OR
INPLACE_POWER
INPLACE_MULTIPLY
INPLACE_FLOOR_DIVIDE
INPLACE_TRUE_DIVIDE
INPLACE_MODULO
INPLACE_ADD
INPLACE_SUBTRACT
INPLACE_LSHIFT
INPLACE_RSHIFT
INPLACE_AND
INPLACE_XOR
INPLACE_OR
STORE_SUBSCR
DELETE_SUBSCR
PRINT_EXPR
BREAK_LOOP
CONTINUE_LOOP
SET_ADD
LIST_APPEND
MAP_ADD
RETURN_VALUE
YIELD_VALUE
IMPORT_STAR
POP_BLOCK
POP_EXCEPT
END_FINALLY
LOAD_BUILD_CLASS
SETUP_WITH
WITH_CLEANUP
STORE_LOCALS
STORE_NAME
DELETE_NAME
UNPACK_SEQUENCE
UNPACK_EX
STORE_ATTR
DELETE_ATTR
STORE_GLOBAL
DELETE_GLOBAL
LOAD_CONST
LOAD_NAME
BUILD_TUPLE
SELECT_TUPLE
BUILD_LIST
BUILD_SET
BUILD_MAP
LOAD_ATTR
COMPARE_OP
IMPORT_NAME
IMPORT_FROM
JUMP_FORWARD
POP_JUMP_IF_TRUE
POP_JUMP_IF_FALSE
JUMP_IF_TRUE_OR_POP
JUMP_IF_FALSE_OR_POP
JUMP_ABSOLUTE
FOR_ITER
LOAD_GLOBAL
SETUP_LOOP
SETUP_EXCEPT
SETUP_FINALLY
STORE_MAP
LOAD_FAST
STORE_FAST
DELETE_FAST
LOAD_CLOSURE
LOAD_DEREF
STORE_DEREF
DELETE_DEREF
RAISE_VARARGS
CALL_FUNCTION
MAKE_FUNCTION
MAKE_CLOSURE
BUILD_SLICE
EXTENDED_ARG
CALL_FUNCTION_VAR
CALL_FUNCTION_KW
CALL_FUNCTION_VAR_KW
HAVE_ARGUMENT
)
var opIndex map[string]PyOpCode
var cmpOp []string
var opName []string
type PyByteCode struct {
opcode PyOpCode
operand int
label string
}
func NewPyByteCode(opcode PyOpCode, operand int) *PyByteCode {
return &PyByteCode{
opcode: opcode,
operand: operand,
}
}
func getInstrIdx(opName string) PyOpCode {
if ret, ok := opIndex[opName]; ok {
return ret
} else {
panic("Unsupported instruction: " + opName)
}
}