Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/compiler/transformer.py

    r2 r391  
    582582    exprlist = testlist
    583583
    584     def testlist_gexp(self, nodelist):
    585         if len(nodelist) == 2 and nodelist[1][0] == symbol.gen_for:
     584    def testlist_comp(self, nodelist):
     585        # test ( comp_for | (',' test)* [','] )
     586        assert nodelist[0][0] == symbol.test
     587        if len(nodelist) == 2 and nodelist[1][0] == symbol.comp_for:
    586588            test = self.com_node(nodelist[0])
    587589            return self.com_generator_expression(test, nodelist[1])
     
    750752        if nodelist[1][0] == token.RBRACE:
    751753            return Dict((), lineno=nodelist[0][2])
    752         return self.com_dictmaker(nodelist[1])
     754        return self.com_dictorsetmaker(nodelist[1])
    753755
    754756    def atom_backquote(self, nodelist):
     
    966968
    967969    def com_with(self, nodelist):
    968         # with_stmt: 'with' expr [with_var] ':' suite
     970        # with_stmt: 'with' with_item (',' with_item)* ':' suite
     971        body = self.com_node(nodelist[-1])
     972        for i in range(len(nodelist) - 3, 0, -2):
     973            ret = self.com_with_item(nodelist[i], body, nodelist[0][2])
     974            if i == 1:
     975                return ret
     976            body = ret
     977
     978    def com_with_item(self, nodelist, body, lineno):
     979        # with_item: test ['as' expr]
     980        if len(nodelist) == 4:
     981            var = self.com_assign(nodelist[3], OP_ASSIGN)
     982        else:
     983            var = None
    969984        expr = self.com_node(nodelist[1])
    970         body = self.com_node(nodelist[-1])
    971         if nodelist[2][0] == token.COLON:
    972             var = None
    973         else:
    974             var = self.com_assign(nodelist[2][2], OP_ASSIGN)
    975         return With(expr, var, body, lineno=nodelist[0][2])
    976 
    977     def com_with_var(self, nodelist):
    978         # with_var: 'as' expr
    979         return self.com_node(nodelist[1])
     985        return With(expr, var, body, lineno=lineno)
    980986
    981987    def com_augassign_op(self, node):
     
    9981004        while 1:
    9991005            t = node[0]
    1000             if t in (symbol.exprlist, symbol.testlist, symbol.testlist_safe, symbol.testlist_gexp):
     1006            if t in (symbol.exprlist, symbol.testlist, symbol.testlist_safe, symbol.testlist_comp):
    10011007                if len(node) > 2:
    10021008                    return self.com_assign_tuple(node, assigning)
     
    10961102            stmts.append(result)
    10971103
    1098     if hasattr(symbol, 'list_for'):
    1099         def com_list_constructor(self, nodelist):
    1100             # listmaker: test ( list_for | (',' test)* [','] )
    1101             values = []
    1102             for i in range(1, len(nodelist)):
    1103                 if nodelist[i][0] == symbol.list_for:
    1104                     assert len(nodelist[i:]) == 1
    1105                     return self.com_list_comprehension(values[0],
    1106                                                        nodelist[i])
    1107                 elif nodelist[i][0] == token.COMMA:
    1108                     continue
    1109                 values.append(self.com_node(nodelist[i]))
    1110             return List(values, lineno=values[0].lineno)
    1111 
    1112         def com_list_comprehension(self, expr, node):
    1113             # list_iter: list_for | list_if
    1114             # list_for: 'for' exprlist 'in' testlist [list_iter]
    1115             # list_if: 'if' test [list_iter]
    1116 
    1117             # XXX should raise SyntaxError for assignment
    1118 
    1119             lineno = node[1][2]
    1120             fors = []
    1121             while node:
    1122                 t = node[1][1]
    1123                 if t == 'for':
    1124                     assignNode = self.com_assign(node[2], OP_ASSIGN)
    1125                     listNode = self.com_node(node[4])
    1126                     newfor = ListCompFor(assignNode, listNode, [])
    1127                     newfor.lineno = node[1][2]
    1128                     fors.append(newfor)
    1129                     if len(node) == 5:
    1130                         node = None
    1131                     else:
    1132                         node = self.com_list_iter(node[5])
    1133                 elif t == 'if':
    1134                     test = self.com_node(node[2])
    1135                     newif = ListCompIf(test, lineno=node[1][2])
    1136                     newfor.ifs.append(newif)
    1137                     if len(node) == 3:
    1138                         node = None
    1139                     else:
    1140                         node = self.com_list_iter(node[3])
     1104    def com_list_constructor(self, nodelist):
     1105        # listmaker: test ( list_for | (',' test)* [','] )
     1106        values = []
     1107        for i in range(1, len(nodelist)):
     1108            if nodelist[i][0] == symbol.list_for:
     1109                assert len(nodelist[i:]) == 1
     1110                return self.com_list_comprehension(values[0],
     1111                                                   nodelist[i])
     1112            elif nodelist[i][0] == token.COMMA:
     1113                continue
     1114            values.append(self.com_node(nodelist[i]))
     1115        return List(values, lineno=values[0].lineno)
     1116
     1117    def com_list_comprehension(self, expr, node):
     1118        return self.com_comprehension(expr, None, node, 'list')
     1119
     1120    def com_comprehension(self, expr1, expr2, node, type):
     1121        # list_iter: list_for | list_if
     1122        # list_for: 'for' exprlist 'in' testlist [list_iter]
     1123        # list_if: 'if' test [list_iter]
     1124
     1125        # XXX should raise SyntaxError for assignment
     1126        # XXX(avassalotti) Set and dict comprehensions should have generator
     1127        #                  semantics. In other words, they shouldn't leak
     1128        #                  variables outside of the comprehension's scope.
     1129
     1130        lineno = node[1][2]
     1131        fors = []
     1132        while node:
     1133            t = node[1][1]
     1134            if t == 'for':
     1135                assignNode = self.com_assign(node[2], OP_ASSIGN)
     1136                compNode = self.com_node(node[4])
     1137                newfor = ListCompFor(assignNode, compNode, [])
     1138                newfor.lineno = node[1][2]
     1139                fors.append(newfor)
     1140                if len(node) == 5:
     1141                    node = None
     1142                elif type == 'list':
     1143                    node = self.com_list_iter(node[5])
    11411144                else:
    1142                     raise SyntaxError, \
    1143                           ("unexpected list comprehension element: %s %d"
    1144                            % (node, lineno))
    1145             return ListComp(expr, fors, lineno=lineno)
    1146 
    1147         def com_list_iter(self, node):
    1148             assert node[0] == symbol.list_iter
    1149             return node[1]
    1150     else:
    1151         def com_list_constructor(self, nodelist):
    1152             values = []
    1153             for i in range(1, len(nodelist), 2):
    1154                 values.append(self.com_node(nodelist[i]))
    1155             return List(values, lineno=values[0].lineno)
    1156 
    1157     if hasattr(symbol, 'gen_for'):
    1158         def com_generator_expression(self, expr, node):
    1159             # gen_iter: gen_for | gen_if
    1160             # gen_for: 'for' exprlist 'in' test [gen_iter]
    1161             # gen_if: 'if' test [gen_iter]
    1162 
    1163             lineno = node[1][2]
    1164             fors = []
    1165             while node:
    1166                 t = node[1][1]
    1167                 if t == 'for':
    1168                     assignNode = self.com_assign(node[2], OP_ASSIGN)
    1169                     genNode = self.com_node(node[4])
    1170                     newfor = GenExprFor(assignNode, genNode, [],
    1171                                         lineno=node[1][2])
    1172                     fors.append(newfor)
    1173                     if (len(node)) == 5:
    1174                         node = None
    1175                     else:
    1176                         node = self.com_gen_iter(node[5])
    1177                 elif t == 'if':
    1178                     test = self.com_node(node[2])
    1179                     newif = GenExprIf(test, lineno=node[1][2])
    1180                     newfor.ifs.append(newif)
    1181                     if len(node) == 3:
    1182                         node = None
    1183                     else:
    1184                         node = self.com_gen_iter(node[3])
     1145                    node = self.com_comp_iter(node[5])
     1146            elif t == 'if':
     1147                test = self.com_node(node[2])
     1148                newif = ListCompIf(test, lineno=node[1][2])
     1149                newfor.ifs.append(newif)
     1150                if len(node) == 3:
     1151                    node = None
     1152                elif type == 'list':
     1153                    node = self.com_list_iter(node[3])
    11851154                else:
    1186                     raise SyntaxError, \
    1187                             ("unexpected generator expression element: %s %d"
    1188                              % (node, lineno))
    1189             fors[0].is_outmost = True
    1190             return GenExpr(GenExprInner(expr, fors), lineno=lineno)
    1191 
    1192         def com_gen_iter(self, node):
    1193             assert node[0] == symbol.gen_iter
    1194             return node[1]
    1195 
    1196     def com_dictmaker(self, nodelist):
    1197         # dictmaker: test ':' test (',' test ':' value)* [',']
    1198         items = []
    1199         for i in range(1, len(nodelist), 4):
    1200             items.append((self.com_node(nodelist[i]),
    1201                           self.com_node(nodelist[i+2])))
    1202         return Dict(items, lineno=items[0][0].lineno)
     1155                    node = self.com_comp_iter(node[3])
     1156            else:
     1157                raise SyntaxError, \
     1158                      ("unexpected comprehension element: %s %d"
     1159                       % (node, lineno))
     1160        if type == 'list':
     1161            return ListComp(expr1, fors, lineno=lineno)
     1162        elif type == 'set':
     1163            return SetComp(expr1, fors, lineno=lineno)
     1164        elif type == 'dict':
     1165            return DictComp(expr1, expr2, fors, lineno=lineno)
     1166        else:
     1167            raise ValueError("unexpected comprehension type: " + repr(type))
     1168
     1169    def com_list_iter(self, node):
     1170        assert node[0] == symbol.list_iter
     1171        return node[1]
     1172
     1173    def com_comp_iter(self, node):
     1174        assert node[0] == symbol.comp_iter
     1175        return node[1]
     1176
     1177    def com_generator_expression(self, expr, node):
     1178        # comp_iter: comp_for | comp_if
     1179        # comp_for: 'for' exprlist 'in' test [comp_iter]
     1180        # comp_if: 'if' test [comp_iter]
     1181
     1182        lineno = node[1][2]
     1183        fors = []
     1184        while node:
     1185            t = node[1][1]
     1186            if t == 'for':
     1187                assignNode = self.com_assign(node[2], OP_ASSIGN)
     1188                genNode = self.com_node(node[4])
     1189                newfor = GenExprFor(assignNode, genNode, [],
     1190                                    lineno=node[1][2])
     1191                fors.append(newfor)
     1192                if (len(node)) == 5:
     1193                    node = None
     1194                else:
     1195                    node = self.com_comp_iter(node[5])
     1196            elif t == 'if':
     1197                test = self.com_node(node[2])
     1198                newif = GenExprIf(test, lineno=node[1][2])
     1199                newfor.ifs.append(newif)
     1200                if len(node) == 3:
     1201                    node = None
     1202                else:
     1203                    node = self.com_comp_iter(node[3])
     1204            else:
     1205                raise SyntaxError, \
     1206                        ("unexpected generator expression element: %s %d"
     1207                         % (node, lineno))
     1208        fors[0].is_outmost = True
     1209        return GenExpr(GenExprInner(expr, fors), lineno=lineno)
     1210
     1211    def com_dictorsetmaker(self, nodelist):
     1212        # dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) |
     1213        #                   (test (comp_for | (',' test)* [','])) )
     1214        assert nodelist[0] == symbol.dictorsetmaker
     1215        nodelist = nodelist[1:]
     1216        if len(nodelist) == 1 or nodelist[1][0] == token.COMMA:
     1217            # set literal
     1218            items = []
     1219            for i in range(0, len(nodelist), 2):
     1220                items.append(self.com_node(nodelist[i]))
     1221            return Set(items, lineno=items[0].lineno)
     1222        elif nodelist[1][0] == symbol.comp_for:
     1223            # set comprehension
     1224            expr = self.com_node(nodelist[0])
     1225            return self.com_comprehension(expr, None, nodelist[1], 'set')
     1226        elif len(nodelist) > 3 and nodelist[3][0] == symbol.comp_for:
     1227            # dict comprehension
     1228            assert nodelist[1][0] == token.COLON
     1229            key = self.com_node(nodelist[0])
     1230            value = self.com_node(nodelist[2])
     1231            return self.com_comprehension(key, value, nodelist[3], 'dict')
     1232        else:
     1233            # dict literal
     1234            items = []
     1235            for i in range(0, len(nodelist), 4):
     1236                items.append((self.com_node(nodelist[i]),
     1237                              self.com_node(nodelist[i+2])))
     1238            return Dict(items, lineno=items[0][0].lineno)
    12031239
    12041240    def com_apply_trailer(self, primaryNode, nodelist):
     
    12461282
    12471283            if len_nodelist != 2 and isinstance(result, GenExpr) \
    1248                and len(node) == 3 and node[2][0] == symbol.gen_for:
     1284               and len(node) == 3 and node[2][0] == symbol.comp_for:
    12491285                # allow f(x for x in y), but reject f(x for x in y, 1)
    12501286                # should use f((x for x in y), 1) instead of f(x for x in y, 1)
     
    12581294
    12591295    def com_argument(self, nodelist, kw, star_node):
    1260         if len(nodelist) == 3 and nodelist[2][0] == symbol.gen_for:
     1296        if len(nodelist) == 3 and nodelist[2][0] == symbol.comp_for:
    12611297            test = self.com_node(nodelist[1])
    12621298            return 0, self.com_generator_expression(test, nodelist[2])
Note: See TracChangeset for help on using the changeset viewer.