@@ -18,7 +18,7 @@ pub enum CmpOperator {
18
18
}
19
19
20
20
impl CmpOperator {
21
- pub fn from_bytecode ( n : u8 ) -> Self {
21
+ pub fn from_bytecode ( n : usize ) -> Self {
22
22
match n {
23
23
0 => CmpOperator :: Lt ,
24
24
1 => CmpOperator :: Leq ,
@@ -70,7 +70,7 @@ pub enum Instruction {
70
70
StoreFast ( usize ) ,
71
71
LoadGlobal ( usize ) ,
72
72
CallFunction ( usize , usize ) , // nb_args, nb_kwargs
73
- RaiseVarargs ( u16 ) ,
73
+ RaiseVarargs ( usize ) ,
74
74
MakeFunction { has_defaults : bool , has_kwdefaults : bool , has_annotations : bool , has_closure : bool } ,
75
75
BuildConstKeyMap ( usize ) ,
76
76
}
@@ -124,11 +124,15 @@ impl<'a, I> Iterator for InstructionDecoder<I> where I: Iterator<Item=&'a u8> {
124
124
self . pending_nops -= 1 ;
125
125
return Some ( Instruction :: Nop )
126
126
} ;
127
- let opcode = self . bytestream . next ( ) ;
128
- let oparg = self . bytestream . next ( ) ;
129
- if let ( Some ( opcode) , Some ( oparg) ) = ( opcode, oparg) {
130
- let opcode = * opcode;
131
- let oparg = * oparg;
127
+ let mut opcode = 144 ;
128
+ let mut oparg: usize = 0 ;
129
+ while opcode == 144 {
130
+ match self . bytestream . next ( ) {
131
+ Some ( op) => { opcode = * op } ,
132
+ None => return None ,
133
+ }
134
+ oparg = ( oparg << 8 ) | ( * self . bytestream . next ( ) . unwrap ( ) as usize ) ;
135
+ }
132
136
let inst = match opcode {
133
137
1 => Instruction :: PopTop ,
134
138
4 => Instruction :: DupTop ,
@@ -139,40 +143,36 @@ impl<'a, I> Iterator for InstructionDecoder<I> where I: Iterator<Item=&'a u8> {
139
143
87 => Instruction :: PopBlock ,
140
144
88 => Instruction :: EndFinally ,
141
145
89 => Instruction :: PopExcept ,
142
- 90 => Instruction :: StoreName ( oparg as usize ) ,
143
- 93 => Instruction :: ForIter ( oparg as usize ) ,
144
- 95 => Instruction :: StoreAttr ( oparg as usize ) ,
145
- 97 => Instruction :: StoreGlobal ( oparg as usize ) ,
146
- 100 => Instruction :: LoadConst ( oparg as usize ) ,
147
- 101 => Instruction :: LoadName ( oparg as usize ) ,
148
- 102 => Instruction :: BuildTuple ( oparg as usize ) ,
149
- 106 => Instruction :: LoadAttr ( oparg as usize ) ,
146
+ 90 => Instruction :: StoreName ( oparg) ,
147
+ 93 => Instruction :: ForIter ( oparg) ,
148
+ 95 => Instruction :: StoreAttr ( oparg) ,
149
+ 97 => Instruction :: StoreGlobal ( oparg) ,
150
+ 100 => Instruction :: LoadConst ( oparg) ,
151
+ 101 => Instruction :: LoadName ( oparg) ,
152
+ 102 => Instruction :: BuildTuple ( oparg) ,
153
+ 106 => Instruction :: LoadAttr ( oparg) ,
150
154
107 => Instruction :: CompareOp ( CmpOperator :: from_bytecode ( oparg) ) ,
151
- 110 => Instruction :: JumpForward ( oparg as usize ) ,
152
- 113 => Instruction :: JumpAbsolute ( oparg as usize ) ,
153
- 114 => Instruction :: PopJumpIfFalse ( oparg as usize ) ,
154
- 116 => Instruction :: LoadGlobal ( oparg as usize ) ,
155
- 120 => Instruction :: SetupLoop ( oparg as usize + 1 ) ,
156
- 121 => Instruction :: SetupExcept ( oparg as usize + 1 ) ,
157
- 124 => Instruction :: LoadFast ( oparg as usize ) ,
158
- 125 => Instruction :: StoreFast ( oparg as usize ) ,
159
- 130 => Instruction :: RaiseVarargs ( self . read_argument ( ) as u16 ) ,
160
- 131 => Instruction :: CallFunction ( oparg as usize , 0 ) ,
155
+ 110 => Instruction :: JumpForward ( oparg) ,
156
+ 113 => Instruction :: JumpAbsolute ( oparg) ,
157
+ 114 => Instruction :: PopJumpIfFalse ( oparg) ,
158
+ 116 => Instruction :: LoadGlobal ( oparg) ,
159
+ 120 => Instruction :: SetupLoop ( oparg + 1 ) ,
160
+ 121 => Instruction :: SetupExcept ( oparg + 1 ) ,
161
+ 124 => Instruction :: LoadFast ( oparg) ,
162
+ 125 => Instruction :: StoreFast ( oparg) ,
163
+ 130 => Instruction :: RaiseVarargs ( oparg ) ,
164
+ 131 => Instruction :: CallFunction ( oparg, 0 ) ,
161
165
132 => Instruction :: MakeFunction {
162
166
has_defaults : oparg & 0x01 != 0 ,
163
167
has_kwdefaults : oparg & 0x02 != 0 ,
164
168
has_annotations : oparg & 0x04 != 0 ,
165
169
has_closure : oparg & 0x08 != 0 ,
166
170
} ,
167
- 156 => Instruction :: BuildConstKeyMap ( oparg as usize ) ,
171
+ 156 => Instruction :: BuildConstKeyMap ( oparg) ,
168
172
144 => { self . arg_prefix = Some ( self . read_argument ( ) ) ; Instruction :: Nop } ,
169
173
_ => panic ! ( format!( "Opcode not supported: {:?}" , ( opcode, oparg) ) ) ,
170
174
} ;
171
175
Some ( inst)
172
- }
173
- else {
174
- None
175
- }
176
176
}
177
177
}
178
178
0 commit comments