X Tutup
Skip to content

Commit 61c4a71

Browse files
committed
DRY scanner 3.{4,5} code
1 parent 406df29 commit 61c4a71

File tree

2 files changed

+0
-296
lines changed

2 files changed

+0
-296
lines changed

uncompyle6/scanners/scanner34.py

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
301153
if __name__ == "__main__":
302154
co = inspect.currentframe().f_code
303155
tokens, customize = Scanner34(3.4).disassemble(co)

uncompyle6/scanners/scanner35.py

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,7 @@ def unmangle(name):
5050
if name.startswith(classname) and name[-2:] != '__':
5151
return name[len(classname) - 2:]
5252
return name
53-
54-
# free = [ unmangle(name) for name in (co.co_cellvars + co.co_freevars) ]
55-
# names = [ unmangle(name) for name in co.co_names ]
56-
# varnames = [ unmangle(name) for name in co.co_varnames ]
5753
else:
58-
# free = co.co_cellvars + co.co_freevars
59-
# names = co.co_names
60-
# varnames = co.co_varnames
6154
pass
6255

6356
# 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-
301153
if __name__ == "__main__":
302154
co = inspect.currentframe().f_code
303155
tokens, customize = Scanner35(3.5).disassemble(co)

0 commit comments

Comments
 (0)
X Tutup