X Tutup
Skip to content

Commit feec241

Browse files
committed
Misc: long lists, DRY 2/3 grammars, '%' count
parse{2,3,r}.py: DRY Python expressions between Python 2 and 3 pysource.py, fragment.py, parser.py: handle long lists by grouping in chunks of 32 and 256 bin/uncompyle6: count %s properly
1 parent ceb47ab commit feec241

File tree

10 files changed

+211
-292
lines changed

10 files changed

+211
-292
lines changed

bin/uncompyle6

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Extensions of generated files:
4747
'.pyc_dis' '.pyo_dis' successfully decompiled (and verified if --verify)
4848
+ '_unverified' successfully decompile but --verify failed
4949
+ '_failed' decompile failed (contact author for enhancement)
50-
""" % ((program,) * 6
50+
""" % ((program,) * 5)
5151

5252
program = os.path.basename(__file__)
5353

test/bytecode_2.7/05_long_list.pyc

250 Bytes
Binary file not shown.

test/bytecode_3.5/05_long_list.pyc

252 Bytes
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Long lists pose a slowdown in uncompiling.
2+
x = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
3+
print(x)

uncompyle6/main.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,14 @@ def _get_outstream(outfile):
118118
os.remove(outfile)
119119
sys.stderr.write("\nLast file: %s " % (infile))
120120
raise
121-
except:
122-
failed_files += 1
123-
if outfile:
124-
outstream.close()
125-
os.rename(outfile, outfile + '_failed')
126-
else:
127-
sys.stderr.write("\n# %s" % sys.exc_info()[1])
128-
sys.stderr.write("\n# Can't uncompile %s\n" % infile)
121+
# except:
122+
# failed_files += 1
123+
# if outfile:
124+
# outstream.close()
125+
# os.rename(outfile, outfile + '_failed')
126+
# else:
127+
# sys.stderr.write("\n# %s" % sys.exc_info()[1])
128+
# sys.stderr.write("\n# Can't uncompile %s\n" % infile)
129129
else: # uncompile successful
130130
if outfile:
131131
outstream.close()

uncompyle6/parser.py

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,154 @@ def p_setcomp(self, args):
237237
comp_ifnot ::= expr jmp_true comp_iter
238238
"""
239239

240+
def p_expr(self, args):
241+
'''
242+
expr ::= _mklambda
243+
expr ::= SET_LINENO
244+
expr ::= LOAD_FAST
245+
expr ::= LOAD_NAME
246+
expr ::= LOAD_CONST
247+
expr ::= LOAD_GLOBAL
248+
expr ::= LOAD_DEREF
249+
expr ::= load_attr
250+
expr ::= binary_expr
251+
expr ::= binary_expr_na
252+
expr ::= build_list
253+
expr ::= cmp
254+
expr ::= mapexpr
255+
expr ::= and
256+
expr ::= and2
257+
expr ::= or
258+
expr ::= unary_expr
259+
expr ::= call_function
260+
expr ::= unary_not
261+
expr ::= unary_convert
262+
expr ::= binary_subscr
263+
expr ::= binary_subscr2
264+
expr ::= load_attr
265+
expr ::= get_iter
266+
expr ::= slice0
267+
expr ::= slice1
268+
expr ::= slice2
269+
expr ::= slice3
270+
expr ::= buildslice2
271+
expr ::= buildslice3
272+
expr ::= yield
273+
274+
binary_expr ::= expr expr binary_op
275+
binary_op ::= BINARY_ADD
276+
binary_op ::= BINARY_MULTIPLY
277+
binary_op ::= BINARY_AND
278+
binary_op ::= BINARY_OR
279+
binary_op ::= BINARY_XOR
280+
binary_op ::= BINARY_SUBTRACT
281+
binary_op ::= BINARY_DIVIDE
282+
binary_op ::= BINARY_TRUE_DIVIDE
283+
binary_op ::= BINARY_FLOOR_DIVIDE
284+
binary_op ::= BINARY_MODULO
285+
binary_op ::= BINARY_LSHIFT
286+
binary_op ::= BINARY_RSHIFT
287+
binary_op ::= BINARY_POWER
288+
289+
unary_expr ::= expr unary_op
290+
unary_op ::= UNARY_POSITIVE
291+
unary_op ::= UNARY_NEGATIVE
292+
unary_op ::= UNARY_INVERT
293+
294+
unary_not ::= expr UNARY_NOT
295+
unary_convert ::= expr UNARY_CONVERT
296+
297+
binary_subscr ::= expr expr BINARY_SUBSCR
298+
binary_subscr2 ::= expr expr DUP_TOPX_2 BINARY_SUBSCR
299+
300+
load_attr ::= expr LOAD_ATTR
301+
get_iter ::= expr GET_ITER
302+
slice0 ::= expr SLICE+0
303+
slice0 ::= expr DUP_TOP SLICE+0
304+
slice1 ::= expr expr SLICE+1
305+
slice1 ::= expr expr DUP_TOPX_2 SLICE+1
306+
slice2 ::= expr expr SLICE+2
307+
slice2 ::= expr expr DUP_TOPX_2 SLICE+2
308+
slice3 ::= expr expr expr SLICE+3
309+
slice3 ::= expr expr expr DUP_TOPX_3 SLICE+3
310+
buildslice3 ::= expr expr expr BUILD_SLICE_3
311+
buildslice2 ::= expr expr BUILD_SLICE_2
312+
313+
yield ::= expr YIELD_VALUE
314+
315+
_mklambda ::= load_closure mklambda
316+
_mklambda ::= mklambda
317+
318+
or ::= expr JUMP_IF_TRUE_OR_POP expr COME_FROM
319+
or ::= expr jmp_true expr _come_from
320+
and ::= expr jmp_false expr _come_from
321+
and ::= expr JUMP_IF_FALSE_OR_POP expr COME_FROM
322+
and2 ::= _jump jmp_false COME_FROM expr COME_FROM
323+
324+
expr ::= conditional
325+
conditional ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM
326+
conditional ::= expr jmp_false expr JUMP_ABSOLUTE expr
327+
expr ::= conditionalnot
328+
conditionalnot ::= expr jmp_true expr _jump expr COME_FROM
329+
330+
ret_expr ::= expr
331+
ret_expr ::= ret_and
332+
ret_expr ::= ret_or
333+
334+
ret_expr_or_cond ::= ret_expr
335+
ret_expr_or_cond ::= ret_cond
336+
ret_expr_or_cond ::= ret_cond_not
337+
338+
ret_and ::= expr JUMP_IF_FALSE_OR_POP ret_expr_or_cond COME_FROM
339+
ret_or ::= expr JUMP_IF_TRUE_OR_POP ret_expr_or_cond COME_FROM
340+
ret_cond ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF ret_expr_or_cond
341+
ret_cond_not ::= expr POP_JUMP_IF_TRUE expr RETURN_END_IF ret_expr_or_cond
342+
343+
stmt ::= return_lambda
344+
stmt ::= conditional_lambda
345+
346+
return_lambda ::= ret_expr RETURN_VALUE LAMBDA_MARKER
347+
conditional_lambda ::= expr jmp_false return_if_stmt return_stmt LAMBDA_MARKER
348+
349+
cmp ::= cmp_list
350+
cmp ::= compare
351+
compare ::= expr expr COMPARE_OP
352+
cmp_list ::= expr cmp_list1 ROT_TWO POP_TOP
353+
_come_from
354+
cmp_list1 ::= expr DUP_TOP ROT_THREE
355+
COMPARE_OP JUMP_IF_FALSE_OR_POP
356+
cmp_list1 COME_FROM
357+
cmp_list1 ::= expr DUP_TOP ROT_THREE
358+
COMPARE_OP jmp_false
359+
cmp_list1 _come_from
360+
cmp_list1 ::= expr DUP_TOP ROT_THREE
361+
COMPARE_OP JUMP_IF_FALSE_OR_POP
362+
cmp_list2 COME_FROM
363+
cmp_list1 ::= expr DUP_TOP ROT_THREE
364+
COMPARE_OP jmp_false
365+
cmp_list2 _come_from
366+
cmp_list2 ::= expr COMPARE_OP JUMP_FORWARD
367+
cmp_list2 ::= expr COMPARE_OP RETURN_VALUE
368+
mapexpr ::= BUILD_MAP kvlist
369+
370+
kvlist ::= kvlist kv
371+
kvlist ::= kvlist kv2
372+
kvlist ::= kvlist kv3
373+
kvlist ::=
374+
375+
kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
376+
kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
377+
kv3 ::= expr expr STORE_MAP
378+
379+
exprlist ::= exprlist expr
380+
exprlist ::= expr
381+
382+
nullexprlist ::=
383+
384+
expr32 ::= expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr
385+
expr1024 ::= expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32 expr32
386+
'''
387+
240388

241389
def parse(p, tokens, customize):
242390
p.add_custom_rules(tokens, customize)

uncompyle6/parsers/parse2.py

Lines changed: 4 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -362,69 +362,10 @@ def p_grammar(self, args):
362362
363363
'''
364364

365-
def p_expr(self, args):
365+
def p_expr2(self, args):
366366
'''
367-
expr ::= _mklambda
368-
expr ::= SET_LINENO
369-
expr ::= LOAD_FAST
370-
expr ::= LOAD_NAME
371-
expr ::= LOAD_CONST
372-
expr ::= LOAD_GLOBAL
373-
expr ::= LOAD_DEREF
374367
expr ::= LOAD_LOCALS
375-
expr ::= load_attr
376-
expr ::= binary_expr
377-
expr ::= binary_expr_na
378-
expr ::= build_list
379-
expr ::= cmp
380-
expr ::= mapexpr
381-
expr ::= and
382-
expr ::= and2
383-
expr ::= or
384-
expr ::= unary_expr
385-
expr ::= call_function
386-
expr ::= unary_not
387-
expr ::= unary_convert
388-
expr ::= binary_subscr
389-
expr ::= binary_subscr2
390-
expr ::= load_attr
391-
expr ::= get_iter
392-
expr ::= slice0
393-
expr ::= slice1
394-
expr ::= slice2
395-
expr ::= slice3
396-
expr ::= buildslice2
397-
expr ::= buildslice3
398-
expr ::= yield
399-
400-
binary_expr ::= expr expr binary_op
401-
binary_op ::= BINARY_ADD
402-
binary_op ::= BINARY_MULTIPLY
403-
binary_op ::= BINARY_AND
404-
binary_op ::= BINARY_OR
405-
binary_op ::= BINARY_XOR
406-
binary_op ::= BINARY_SUBTRACT
407-
binary_op ::= BINARY_DIVIDE
408-
binary_op ::= BINARY_TRUE_DIVIDE
409-
binary_op ::= BINARY_FLOOR_DIVIDE
410-
binary_op ::= BINARY_MODULO
411-
binary_op ::= BINARY_LSHIFT
412-
binary_op ::= BINARY_RSHIFT
413-
binary_op ::= BINARY_POWER
414-
415-
unary_expr ::= expr unary_op
416-
unary_op ::= UNARY_POSITIVE
417-
unary_op ::= UNARY_NEGATIVE
418-
unary_op ::= UNARY_INVERT
419-
420-
unary_not ::= expr UNARY_NOT
421-
unary_convert ::= expr UNARY_CONVERT
422-
423-
binary_subscr ::= expr expr BINARY_SUBSCR
424-
binary_subscr2 ::= expr expr DUP_TOPX_2 BINARY_SUBSCR
425-
426-
load_attr ::= expr LOAD_ATTR
427-
get_iter ::= expr GET_ITER
368+
428369
slice0 ::= expr SLICE+0
429370
slice0 ::= expr DUP_TOP SLICE+0
430371
slice1 ::= expr expr SLICE+1
@@ -433,79 +374,6 @@ def p_expr(self, args):
433374
slice2 ::= expr expr DUP_TOPX_2 SLICE+2
434375
slice3 ::= expr expr expr SLICE+3
435376
slice3 ::= expr expr expr DUP_TOPX_3 SLICE+3
436-
buildslice3 ::= expr expr expr BUILD_SLICE_3
437-
buildslice2 ::= expr expr BUILD_SLICE_2
438-
439-
yield ::= expr YIELD_VALUE
440-
441-
_mklambda ::= load_closure mklambda
442-
_mklambda ::= mklambda
443-
444-
or ::= expr JUMP_IF_TRUE_OR_POP expr COME_FROM
445-
or ::= expr jmp_true expr _come_from
446-
and ::= expr jmp_false expr _come_from
447-
and ::= expr JUMP_IF_FALSE_OR_POP expr COME_FROM
448-
and2 ::= _jump jmp_false COME_FROM expr COME_FROM
449-
450-
expr ::= conditional
451-
conditional ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM
452-
conditional ::= expr jmp_false expr JUMP_ABSOLUTE expr
453-
expr ::= conditionalnot
454-
conditionalnot ::= expr jmp_true expr _jump expr COME_FROM
455-
456-
ret_expr ::= expr
457-
ret_expr ::= ret_and
458-
ret_expr ::= ret_or
459-
460-
ret_expr_or_cond ::= ret_expr
461-
ret_expr_or_cond ::= ret_cond
462-
ret_expr_or_cond ::= ret_cond_not
463-
464-
ret_and ::= expr JUMP_IF_FALSE_OR_POP ret_expr_or_cond COME_FROM
465-
ret_or ::= expr JUMP_IF_TRUE_OR_POP ret_expr_or_cond COME_FROM
466-
ret_cond ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF ret_expr_or_cond
467-
ret_cond_not ::= expr POP_JUMP_IF_TRUE expr RETURN_END_IF ret_expr_or_cond
468-
469-
stmt ::= return_lambda
470-
stmt ::= conditional_lambda
471-
472-
return_lambda ::= ret_expr RETURN_VALUE LAMBDA_MARKER
473-
conditional_lambda ::= expr jmp_false return_if_stmt return_stmt LAMBDA_MARKER
474-
475-
cmp ::= cmp_list
476-
cmp ::= compare
477-
compare ::= expr expr COMPARE_OP
478-
cmp_list ::= expr cmp_list1 ROT_TWO POP_TOP
479-
_come_from
480-
cmp_list1 ::= expr DUP_TOP ROT_THREE
481-
COMPARE_OP JUMP_IF_FALSE_OR_POP
482-
cmp_list1 COME_FROM
483-
cmp_list1 ::= expr DUP_TOP ROT_THREE
484-
COMPARE_OP jmp_false
485-
cmp_list1 _come_from
486-
cmp_list1 ::= expr DUP_TOP ROT_THREE
487-
COMPARE_OP JUMP_IF_FALSE_OR_POP
488-
cmp_list2 COME_FROM
489-
cmp_list1 ::= expr DUP_TOP ROT_THREE
490-
COMPARE_OP jmp_false
491-
cmp_list2 _come_from
492-
cmp_list2 ::= expr COMPARE_OP JUMP_FORWARD
493-
cmp_list2 ::= expr COMPARE_OP RETURN_VALUE
494-
mapexpr ::= BUILD_MAP kvlist
495-
496-
kvlist ::= kvlist kv
497-
kvlist ::= kvlist kv2
498-
kvlist ::= kvlist kv3
499-
kvlist ::=
500-
501-
kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
502-
kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
503-
kv3 ::= expr expr STORE_MAP
504-
505-
exprlist ::= exprlist expr
506-
exprlist ::= expr
507-
508-
nullexprlist ::=
509377
'''
510378

511379
def add_custom_rules(self, tokens, customize):
@@ -535,7 +403,8 @@ def add_custom_rules(self, tokens, customize):
535403

536404
op = k[:k.rfind('_')]
537405
if op in ('BUILD_LIST', 'BUILD_TUPLE', 'BUILD_SET'):
538-
rule = 'build_list ::= ' + 'expr '*v + k
406+
rule = ('build_list ::= ' + 'expr1024 '*(v//1024) +
407+
'expr32 '*((v//32)%32) + 'expr '*(v%32) + k)
539408
elif op in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
540409
rule = 'unpack ::= ' + k + ' designator'*v
541410
elif op == 'UNPACK_LIST':

0 commit comments

Comments
 (0)
X Tutup