5858from uncompyle6 .semantics import pysource
5959from uncompyle6 import parser
6060from uncompyle6 .scanner import Token , Code , get_scanner
61+ import uncompyle6 .parser as python_parser
6162from uncompyle6 .semantics .check_ast import checker
6263
6364from uncompyle6 .show import (
7273
7374from uncompyle6 .semantics .consts import (
7475 INDENT_PER_LEVEL , NONE , PRECEDENCE ,
75- TABLE_DIRECT , escape , minint , MAP
76+ TABLE_DIRECT , escape , MAP , PASS
7677 )
7778
7879from spark_parser import DEFAULT_DEBUG as PARSER_DEFAULT_DEBUG
@@ -974,14 +975,27 @@ def gen_source(self, ast, name, customize, is_lambda=False, returnNone=False):
974975 self .name = old_name
975976 self .return_none = rn
976977
977- def build_ast (self , tokens , customize , is_lambda = False , noneInNames = False ):
978- # assert type(tokens) == ListType
978+ def build_ast (self , tokens , customize , is_lambda = False ,
979+ noneInNames = False , isTopLevel = False ):
980+
981+ # FIXME: DRY with pysource.py
982+
979983 # assert isinstance(tokens[0], Token)
980984
981985 if is_lambda :
986+ for t in tokens :
987+ if t .kind == 'RETURN_END_IF' :
988+ t .kind = 'RETURN_END_IF_LAMBDA'
989+ elif t .kind == 'RETURN_VALUE' :
990+ t .kind = 'RETURN_VALUE_LAMBDA'
982991 tokens .append (Token ('LAMBDA_MARKER' ))
983992 try :
984- ast = parser .parse (self .p , tokens , customize )
993+ # FIXME: have p.insts update in a better way
994+ # modularity is broken here
995+ p_insts = self .p .insts
996+ self .p .insts = self .scanner .insts
997+ ast = python_parser .parse (self .p , tokens , customize )
998+ self .p .insts = p_insts
985999 except (parser .ParserError , AssertionError ) as e :
9861000 raise ParserError (e , tokens )
9871001 maybe_show_ast (self .showast , ast )
@@ -997,16 +1011,29 @@ def build_ast(self, tokens, customize, is_lambda=False, noneInNames=False):
9971011 #
9981012 # NOTE: this differs from behavior in pysource.py
9991013
1000- if len (tokens ) >= 2 and not noneInNames :
1001- if tokens [- 1 ].kind == 'RETURN_VALUE' :
1002- if tokens [- 2 ].kind != 'LOAD_CONST' :
1003- tokens .append (Token ('RETURN_LAST' ))
1004- if len (tokens ) == 0 :
1005- return
1014+ if self .hide_internal :
1015+ if len (tokens ) >= 2 and not noneInNames :
1016+ if tokens [- 1 ].kind in ('RETURN_VALUE' , 'RETURN_VALUE_LAMBDA' ):
1017+ # Python 3.4's classes can add a "return None" which is
1018+ # invalid syntax.
1019+ if tokens [- 2 ].kind == 'LOAD_CONST' :
1020+ if isTopLevel or tokens [- 2 ].pattr is None :
1021+ del tokens [- 2 :]
1022+ else :
1023+ tokens .append (Token ('RETURN_LAST' ))
1024+ else :
1025+ tokens .append (Token ('RETURN_LAST' ))
1026+ if len (tokens ) == 0 :
1027+ return PASS
10061028
10071029 # Build AST from disassembly.
10081030 try :
1031+ # FIXME: have p.insts update in a better way
1032+ # modularity is broken here
1033+ p_insts = self .p .insts
1034+ self .p .insts = self .scanner .insts
10091035 ast = parser .parse (self .p , tokens , customize )
1036+ self .p .insts = p_insts
10101037 except (parser .ParserError , AssertionError ) as e :
10111038 raise ParserError (e , tokens )
10121039
0 commit comments