@@ -56,14 +56,7 @@ def unmangle(name):
5656 if name .startswith (classname ) and name [- 2 :] != '__' :
5757 return name [len (classname ) - 2 :]
5858 return name
59-
60- # free = [ unmangle(name) for name in (co.co_cellvars + co.co_freevars) ]
61- # names = [ unmangle(name) for name in co.co_names ]
62- # varnames = [ unmangle(name) for name in co.co_varnames ]
6359 else :
64- # free = co.co_cellvars + co.co_freevars
65- # names = co.co_names
66- # varnames = co.co_varnames
6760 pass
6861
6962 # Scan for assertions. Later we will
@@ -157,147 +150,6 @@ def unmangle(name):
157150 pass
158151 return tokens , {}
159152
160- # FIXME: merge with scanner3 code
161- def detect_structure (self , offset ):
162- """
163- Detect structures and their boundaries to fix optimizied jumps
164- in python2.3+
165- """
166- code = self .code
167- op = code [offset ]
168- # Detect parent structure
169- parent = self .structs [0 ]
170- start = parent ['start' ]
171- end = parent ['end' ]
172-
173- # Pick inner-most parent for our offset
174- for struct in self .structs :
175- curent_start = struct ['start' ]
176- curent_end = struct ['end' ]
177- if (curent_start <= offset < curent_end ) and (curent_start >= start and curent_end <= end ):
178- start = curent_start
179- end = curent_end
180- parent = struct
181- pass
182-
183- if op in (POP_JUMP_IF_FALSE , POP_JUMP_IF_TRUE ):
184- start = offset + self .op_size (op )
185- target = self .get_target (offset )
186- rtarget = self .restrict_to_parent (target , parent )
187- prev_op = self .prev_op
188-
189- # Do not let jump to go out of parent struct bounds
190- if target != rtarget and parent ['type' ] == 'and/or' :
191- self .fixed_jumps [offset ] = rtarget
192- return
193-
194- # Does this jump to right after another cond jump?
195- # If so, it's part of a larger conditional
196- if (code [prev_op [target ]] in (JUMP_IF_FALSE_OR_POP , JUMP_IF_TRUE_OR_POP ,
197- POP_JUMP_IF_FALSE , POP_JUMP_IF_TRUE )) and (target > offset ):
198- self .fixed_jumps [offset ] = prev_op [target ]
199- self .structs .append ({'type' : 'and/or' ,
200- 'start' : start ,
201- 'end' : prev_op [target ]})
202- return
203- # Is it an and inside if block
204- if op == POP_JUMP_IF_FALSE :
205- # Search for other POP_JUMP_IF_FALSE targetting the same op,
206- # in current statement, starting from current offset, and filter
207- # everything inside inner 'or' jumps and midline ifs
208- match = self .rem_or (start , self .next_stmt [offset ], POP_JUMP_IF_FALSE , target )
209- match = self .remove_mid_line_ifs (match )
210- # If we still have any offsets in set, start working on it
211- if match :
212- if (code [prev_op [rtarget ]] in (JUMP_FORWARD , JUMP_ABSOLUTE ) and prev_op [rtarget ] not in self .stmts and
213- self .restrict_to_parent (self .get_target (prev_op [rtarget ]), parent ) == rtarget ):
214- if (code [prev_op [prev_op [rtarget ]]] == JUMP_ABSOLUTE and self .remove_mid_line_ifs ([offset ]) and
215- target == self .get_target (prev_op [prev_op [rtarget ]]) and
216- (prev_op [prev_op [rtarget ]] not in self .stmts or self .get_target (prev_op [prev_op [rtarget ]]) > prev_op [prev_op [rtarget ]]) and
217- 1 == len (self .remove_mid_line_ifs (self .rem_or (start , prev_op [prev_op [rtarget ]], (POP_JUMP_IF_FALSE , POP_JUMP_IF_TRUE ), target )))):
218- pass
219- elif (code [prev_op [prev_op [rtarget ]]] == RETURN_VALUE and self .remove_mid_line_ifs ([offset ]) and
220- 1 == (len (set (self .remove_mid_line_ifs (self .rem_or (start , prev_op [prev_op [rtarget ]],
221- (POP_JUMP_IF_FALSE , POP_JUMP_IF_TRUE ), target ))) |
222- set (self .remove_mid_line_ifs (self .rem_or (start , prev_op [prev_op [rtarget ]],
223- (POP_JUMP_IF_FALSE , POP_JUMP_IF_TRUE , JUMP_ABSOLUTE ),
224- prev_op [rtarget ], True )))))):
225- pass
226- else :
227- fix = None
228- jump_ifs = self .all_instr (start , self .next_stmt [offset ], POP_JUMP_IF_FALSE )
229- last_jump_good = True
230- for j in jump_ifs :
231- if target == self .get_target (j ):
232- if self .lines [j ].next == j + 3 and last_jump_good :
233- fix = j
234- break
235- else :
236- last_jump_good = False
237- self .fixed_jumps [offset ] = fix or match [- 1 ]
238- return
239- else :
240- self .fixed_jumps [offset ] = match [- 1 ]
241- return
242- # op == POP_JUMP_IF_TRUE
243- else :
244- next = self .next_stmt [offset ]
245- if prev_op [next ] == offset :
246- pass
247- elif code [next ] in (JUMP_FORWARD , JUMP_ABSOLUTE ) and target == self .get_target (next ):
248- if code [prev_op [next ]] == POP_JUMP_IF_FALSE :
249- if code [next ] == JUMP_FORWARD or target != rtarget or code [prev_op [prev_op [rtarget ]]] not in (JUMP_ABSOLUTE , RETURN_VALUE ):
250- self .fixed_jumps [offset ] = prev_op [next ]
251- return
252- elif (code [next ] == JUMP_ABSOLUTE and code [target ] in (JUMP_ABSOLUTE , JUMP_FORWARD ) and
253- self .get_target (target ) == self .get_target (next )):
254- self .fixed_jumps [offset ] = prev_op [next ]
255- return
256-
257- # Don't add a struct for a while test, it's already taken care of
258- if offset in self .ignore_if :
259- return
260-
261- if (code [prev_op [rtarget ]] == JUMP_ABSOLUTE and prev_op [rtarget ] in self .stmts and
262- prev_op [rtarget ] != offset and prev_op [prev_op [rtarget ]] != offset and
263- not (code [rtarget ] == JUMP_ABSOLUTE and code [rtarget + 3 ] == POP_BLOCK and code [prev_op [prev_op [rtarget ]]] != JUMP_ABSOLUTE )):
264- rtarget = prev_op [rtarget ]
265-
266- # Does the if jump just beyond a jump op, then this is probably an if statement
267- if code [prev_op [rtarget ]] in (JUMP_ABSOLUTE , JUMP_FORWARD ):
268- if_end = self .get_target (prev_op [rtarget ])
269-
270- # Is this a loop not an if?
271- if (if_end < prev_op [rtarget ]) and (code [prev_op [if_end ]] == SETUP_LOOP ):
272- if (if_end > start ):
273- return
274-
275- end = self .restrict_to_parent (if_end , parent )
276-
277- self .structs .append ({'type' : 'if-then' ,
278- 'start' : start ,
279- 'end' : prev_op [rtarget ]})
280- self .not_continue .add (prev_op [rtarget ])
281-
282- if rtarget < end :
283- self .structs .append ({'type' : 'if-else' ,
284- 'start' : rtarget ,
285- 'end' : end })
286- elif code [prev_op [rtarget ]] == RETURN_VALUE :
287- self .structs .append ({'type' : 'if-then' ,
288- 'start' : start ,
289- 'end' : rtarget })
290- self .return_end_ifs .add (prev_op [rtarget ])
291-
292- elif op in (JUMP_IF_FALSE_OR_POP , JUMP_IF_TRUE_OR_POP ):
293- target = self .get_target (offset )
294- if target > offset :
295- unop_target = self .last_instr (offset , target , JUMP_FORWARD , target )
296- if unop_target and code [unop_target + 3 ] != ROT_TWO :
297- self .fixed_jumps [offset ] = unop_target
298- else :
299- self .fixed_jumps [offset ] = self .restrict_to_parent (target , parent )
300-
301153if __name__ == "__main__" :
302154 co = inspect .currentframe ().f_code
303155 tokens , customize = Scanner34 (3.4 ).disassemble (co )
0 commit comments