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/pycodegen.py

    r2 r391  
    88from compiler import ast, parse, walk, syntax
    99from compiler import pyassem, misc, future, symbols
    10 from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL
     10from compiler.consts import SC_LOCAL, SC_GLOBAL_IMPLICIT, SC_GLOBAL_EXPLICIT, \
     11     SC_FREE, SC_CELL
    1112from compiler.consts import (CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,
    1213     CO_NESTED, CO_GENERATOR, CO_FUTURE_DIVISION,
     
    283284            else:
    284285                self.emit(prefix + '_FAST', name)
    285         elif scope == SC_GLOBAL:
     286        elif scope == SC_GLOBAL_EXPLICIT:
     287            self.emit(prefix + '_GLOBAL', name)
     288        elif scope == SC_GLOBAL_IMPLICIT:
    286289            if not self.optimized:
    287290                self.emit(prefix + '_NAME', name)
     
    419422            self.visit(test)
    420423            nextTest = self.newBlock()
    421             self.emit('JUMP_IF_FALSE', nextTest)
     424            self.emit('POP_JUMP_IF_FALSE', nextTest)
    422425            self.nextBlock()
    423             self.emit('POP_TOP')
    424426            self.visit(suite)
    425427            self.emit('JUMP_FORWARD', end)
    426428            self.startBlock(nextTest)
    427             self.emit('POP_TOP')
    428429        if node.else_:
    429430            self.visit(node.else_)
     
    444445        self.set_lineno(node, force=True)
    445446        self.visit(node.test)
    446         self.emit('JUMP_IF_FALSE', else_ or after)
     447        self.emit('POP_JUMP_IF_FALSE', else_ or after)
    447448
    448449        self.nextBlock()
    449         self.emit('POP_TOP')
    450450        self.visit(node.body)
    451451        self.emit('JUMP_ABSOLUTE', loop)
    452452
    453453        self.startBlock(else_) # or just the POPs if not else clause
    454         self.emit('POP_TOP')
    455454        self.emit('POP_BLOCK')
    456455        self.setups.pop()
     
    523522            self.emit(jump, end)
    524523            self.nextBlock()
    525             self.emit('POP_TOP')
    526524        self.visit(node.nodes[-1])
    527525        self.nextBlock(end)
    528526
    529527    def visitAnd(self, node):
    530         self.visitTest(node, 'JUMP_IF_FALSE')
     528        self.visitTest(node, 'JUMP_IF_FALSE_OR_POP')
    531529
    532530    def visitOr(self, node):
    533         self.visitTest(node, 'JUMP_IF_TRUE')
     531        self.visitTest(node, 'JUMP_IF_TRUE_OR_POP')
    534532
    535533    def visitIfExp(self, node):
     
    537535        elseblock = self.newBlock()
    538536        self.visit(node.test)
    539         self.emit('JUMP_IF_FALSE', elseblock)
    540         self.emit('POP_TOP')
     537        self.emit('POP_JUMP_IF_FALSE', elseblock)
    541538        self.visit(node.then)
    542539        self.emit('JUMP_FORWARD', endblock)
    543540        self.nextBlock(elseblock)
    544         self.emit('POP_TOP')
    545541        self.visit(node.else_)
    546542        self.nextBlock(endblock)
     
    554550            self.emit('ROT_THREE')
    555551            self.emit('COMPARE_OP', op)
    556             self.emit('JUMP_IF_FALSE', cleanup)
     552            self.emit('JUMP_IF_FALSE_OR_POP', cleanup)
    557553            self.nextBlock()
    558             self.emit('POP_TOP')
    559554        # now do the last comparison
    560555        if node.ops:
     
    571566
    572567    # list comprehensions
    573     __list_count = 0
    574 
    575568    def visitListComp(self, node):
    576569        self.set_lineno(node)
    577570        # setup list
    578         tmpname = "$list%d" % self.__list_count
    579         self.__list_count = self.__list_count + 1
    580571        self.emit('BUILD_LIST', 0)
    581         self.emit('DUP_TOP')
    582         self._implicitNameOp('STORE', tmpname)
    583572
    584573        stack = []
     
    592581            stack.insert(0, (start, cont, anchor))
    593582
    594         self._implicitNameOp('LOAD', tmpname)
    595583        self.visit(node.expr)
    596         self.emit('LIST_APPEND')
     584        self.emit('LIST_APPEND', len(node.quals) + 1)
    597585
    598586        for start, cont, anchor in stack:
    599587            if cont:
    600                 skip_one = self.newBlock()
    601                 self.emit('JUMP_FORWARD', skip_one)
    602                 self.startBlock(cont)
    603                 self.emit('POP_TOP')
    604                 self.nextBlock(skip_one)
     588                self.nextBlock(cont)
    605589            self.emit('JUMP_ABSOLUTE', start)
    606590            self.startBlock(anchor)
    607         self._implicitNameOp('DELETE', tmpname)
    608 
    609         self.__list_count = self.__list_count - 1
     591
     592    def visitSetComp(self, node):
     593        self.set_lineno(node)
     594        # setup list
     595        self.emit('BUILD_SET', 0)
     596
     597        stack = []
     598        for i, for_ in zip(range(len(node.quals)), node.quals):
     599            start, anchor = self.visit(for_)
     600            cont = None
     601            for if_ in for_.ifs:
     602                if cont is None:
     603                    cont = self.newBlock()
     604                self.visit(if_, cont)
     605            stack.insert(0, (start, cont, anchor))
     606
     607        self.visit(node.expr)
     608        self.emit('SET_ADD', len(node.quals) + 1)
     609
     610        for start, cont, anchor in stack:
     611            if cont:
     612                self.nextBlock(cont)
     613            self.emit('JUMP_ABSOLUTE', start)
     614            self.startBlock(anchor)
     615
     616    def visitDictComp(self, node):
     617        self.set_lineno(node)
     618        # setup list
     619        self.emit('BUILD_MAP', 0)
     620
     621        stack = []
     622        for i, for_ in zip(range(len(node.quals)), node.quals):
     623            start, anchor = self.visit(for_)
     624            cont = None
     625            for if_ in for_.ifs:
     626                if cont is None:
     627                    cont = self.newBlock()
     628                self.visit(if_, cont)
     629            stack.insert(0, (start, cont, anchor))
     630
     631        self.visit(node.value)
     632        self.visit(node.key)
     633        self.emit('MAP_ADD', len(node.quals) + 1)
     634
     635        for start, cont, anchor in stack:
     636            if cont:
     637                self.nextBlock(cont)
     638            self.emit('JUMP_ABSOLUTE', start)
     639            self.startBlock(anchor)
    610640
    611641    def visitListCompFor(self, node):
     
    625655        self.set_lineno(node, force=True)
    626656        self.visit(node.test)
    627         self.emit('JUMP_IF_FALSE', branch)
     657        self.emit('POP_JUMP_IF_FALSE', branch)
    628658        self.newBlock()
    629         self.emit('POP_TOP')
    630659
    631660    def _makeClosure(self, gen, args):
     
    673702        for start, cont, anchor, end in stack:
    674703            if cont:
    675                 skip_one = self.newBlock()
    676                 self.emit('JUMP_FORWARD', skip_one)
    677                 self.startBlock(cont)
    678                 self.emit('POP_TOP')
    679                 self.nextBlock(skip_one)
     704                self.nextBlock(cont)
    680705            self.emit('JUMP_ABSOLUTE', start)
    681706            self.startBlock(anchor)
    682707            self.emit('POP_BLOCK')
    683708            self.setups.pop()
    684             self.startBlock(end)
     709            self.nextBlock(end)
    685710
    686711        self.emit('LOAD_CONST', None)
     
    710735        self.set_lineno(node, force=True)
    711736        self.visit(node.test)
    712         self.emit('JUMP_IF_FALSE', branch)
     737        self.emit('POP_JUMP_IF_FALSE', branch)
    713738        self.newBlock()
    714         self.emit('POP_TOP')
    715739
    716740    # exception related
     
    727751            self.nextBlock()
    728752            self.visit(node.test)
    729             self.emit('JUMP_IF_TRUE', end)
     753            self.emit('POP_JUMP_IF_TRUE', end)
    730754            self.nextBlock()
    731             self.emit('POP_TOP')
    732755            self.emit('LOAD_GLOBAL', 'AssertionError')
    733756            if node.fail:
     
    737760                self.emit('RAISE_VARARGS', 1)
    738761            self.nextBlock(end)
    739             self.emit('POP_TOP')
    740762
    741763    def visitRaise(self, node):
     
    780802                self.emit('COMPARE_OP', 'exception match')
    781803                next = self.newBlock()
    782                 self.emit('JUMP_IF_FALSE', next)
     804                self.emit('POP_JUMP_IF_FALSE', next)
    783805                self.nextBlock()
    784                 self.emit('POP_TOP')
    785806            self.emit('POP_TOP')
    786807            if target:
     
    795816            else:
    796817                self.nextBlock()
    797             if expr: # XXX
    798                 self.emit('POP_TOP')
    799818        self.emit('END_FINALLY')
    800819        if node.else_:
     
    825844        body = self.newBlock()
    826845        final = self.newBlock()
    827         valuevar = "$value%d" % self.__with_count
    828846        self.__with_count += 1
     847        valuevar = "_[%d]" % self.__with_count
    829848        self.set_lineno(node)
    830849        self.visit(node.expr)
     
    901920        if level == 0 and not self.graph.checkFlag(CO_FUTURE_ABSIMPORT):
    902921            level = -1
    903         fromlist = map(lambda (name, alias): name, node.names)
     922        fromlist = tuple(name for (name, alias) in node.names)
    904923        if VERSION > 1:
    905924            self.emit('LOAD_CONST', level)
    906             self.emit('LOAD_CONST', tuple(fromlist))
     925            self.emit('LOAD_CONST', fromlist)
    907926        self.emit('IMPORT_NAME', node.modname)
    908927        for name, alias in node.names:
     
    12461265        self.emit('BUILD_LIST', len(node.nodes))
    12471266
     1267    def visitSet(self, node):
     1268        self.set_lineno(node)
     1269        for elt in node.nodes:
     1270            self.visit(elt)
     1271        self.emit('BUILD_SET', len(node.nodes))
     1272
    12481273    def visitSliceobj(self, node):
    12491274        for child in node.nodes:
Note: See TracChangeset for help on using the changeset viewer.