Changeset 391 for python/trunk/Lib/compiler/pycodegen.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/compiler/pycodegen.py
r2 r391 8 8 from compiler import ast, parse, walk, syntax 9 9 from compiler import pyassem, misc, future, symbols 10 from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL 10 from compiler.consts import SC_LOCAL, SC_GLOBAL_IMPLICIT, SC_GLOBAL_EXPLICIT, \ 11 SC_FREE, SC_CELL 11 12 from compiler.consts import (CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS, 12 13 CO_NESTED, CO_GENERATOR, CO_FUTURE_DIVISION, … … 283 284 else: 284 285 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: 286 289 if not self.optimized: 287 290 self.emit(prefix + '_NAME', name) … … 419 422 self.visit(test) 420 423 nextTest = self.newBlock() 421 self.emit(' JUMP_IF_FALSE', nextTest)424 self.emit('POP_JUMP_IF_FALSE', nextTest) 422 425 self.nextBlock() 423 self.emit('POP_TOP')424 426 self.visit(suite) 425 427 self.emit('JUMP_FORWARD', end) 426 428 self.startBlock(nextTest) 427 self.emit('POP_TOP')428 429 if node.else_: 429 430 self.visit(node.else_) … … 444 445 self.set_lineno(node, force=True) 445 446 self.visit(node.test) 446 self.emit(' JUMP_IF_FALSE', else_ or after)447 self.emit('POP_JUMP_IF_FALSE', else_ or after) 447 448 448 449 self.nextBlock() 449 self.emit('POP_TOP')450 450 self.visit(node.body) 451 451 self.emit('JUMP_ABSOLUTE', loop) 452 452 453 453 self.startBlock(else_) # or just the POPs if not else clause 454 self.emit('POP_TOP')455 454 self.emit('POP_BLOCK') 456 455 self.setups.pop() … … 523 522 self.emit(jump, end) 524 523 self.nextBlock() 525 self.emit('POP_TOP')526 524 self.visit(node.nodes[-1]) 527 525 self.nextBlock(end) 528 526 529 527 def visitAnd(self, node): 530 self.visitTest(node, 'JUMP_IF_FALSE ')528 self.visitTest(node, 'JUMP_IF_FALSE_OR_POP') 531 529 532 530 def visitOr(self, node): 533 self.visitTest(node, 'JUMP_IF_TRUE ')531 self.visitTest(node, 'JUMP_IF_TRUE_OR_POP') 534 532 535 533 def visitIfExp(self, node): … … 537 535 elseblock = self.newBlock() 538 536 self.visit(node.test) 539 self.emit('JUMP_IF_FALSE', elseblock) 540 self.emit('POP_TOP') 537 self.emit('POP_JUMP_IF_FALSE', elseblock) 541 538 self.visit(node.then) 542 539 self.emit('JUMP_FORWARD', endblock) 543 540 self.nextBlock(elseblock) 544 self.emit('POP_TOP')545 541 self.visit(node.else_) 546 542 self.nextBlock(endblock) … … 554 550 self.emit('ROT_THREE') 555 551 self.emit('COMPARE_OP', op) 556 self.emit('JUMP_IF_FALSE ', cleanup)552 self.emit('JUMP_IF_FALSE_OR_POP', cleanup) 557 553 self.nextBlock() 558 self.emit('POP_TOP')559 554 # now do the last comparison 560 555 if node.ops: … … 571 566 572 567 # list comprehensions 573 __list_count = 0574 575 568 def visitListComp(self, node): 576 569 self.set_lineno(node) 577 570 # setup list 578 tmpname = "$list%d" % self.__list_count579 self.__list_count = self.__list_count + 1580 571 self.emit('BUILD_LIST', 0) 581 self.emit('DUP_TOP')582 self._implicitNameOp('STORE', tmpname)583 572 584 573 stack = [] … … 592 581 stack.insert(0, (start, cont, anchor)) 593 582 594 self._implicitNameOp('LOAD', tmpname)595 583 self.visit(node.expr) 596 self.emit('LIST_APPEND' )584 self.emit('LIST_APPEND', len(node.quals) + 1) 597 585 598 586 for start, cont, anchor in stack: 599 587 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) 605 589 self.emit('JUMP_ABSOLUTE', start) 606 590 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) 610 640 611 641 def visitListCompFor(self, node): … … 625 655 self.set_lineno(node, force=True) 626 656 self.visit(node.test) 627 self.emit(' JUMP_IF_FALSE', branch)657 self.emit('POP_JUMP_IF_FALSE', branch) 628 658 self.newBlock() 629 self.emit('POP_TOP')630 659 631 660 def _makeClosure(self, gen, args): … … 673 702 for start, cont, anchor, end in stack: 674 703 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) 680 705 self.emit('JUMP_ABSOLUTE', start) 681 706 self.startBlock(anchor) 682 707 self.emit('POP_BLOCK') 683 708 self.setups.pop() 684 self. startBlock(end)709 self.nextBlock(end) 685 710 686 711 self.emit('LOAD_CONST', None) … … 710 735 self.set_lineno(node, force=True) 711 736 self.visit(node.test) 712 self.emit(' JUMP_IF_FALSE', branch)737 self.emit('POP_JUMP_IF_FALSE', branch) 713 738 self.newBlock() 714 self.emit('POP_TOP')715 739 716 740 # exception related … … 727 751 self.nextBlock() 728 752 self.visit(node.test) 729 self.emit(' JUMP_IF_TRUE', end)753 self.emit('POP_JUMP_IF_TRUE', end) 730 754 self.nextBlock() 731 self.emit('POP_TOP')732 755 self.emit('LOAD_GLOBAL', 'AssertionError') 733 756 if node.fail: … … 737 760 self.emit('RAISE_VARARGS', 1) 738 761 self.nextBlock(end) 739 self.emit('POP_TOP')740 762 741 763 def visitRaise(self, node): … … 780 802 self.emit('COMPARE_OP', 'exception match') 781 803 next = self.newBlock() 782 self.emit(' JUMP_IF_FALSE', next)804 self.emit('POP_JUMP_IF_FALSE', next) 783 805 self.nextBlock() 784 self.emit('POP_TOP')785 806 self.emit('POP_TOP') 786 807 if target: … … 795 816 else: 796 817 self.nextBlock() 797 if expr: # XXX798 self.emit('POP_TOP')799 818 self.emit('END_FINALLY') 800 819 if node.else_: … … 825 844 body = self.newBlock() 826 845 final = self.newBlock() 827 valuevar = "$value%d" % self.__with_count828 846 self.__with_count += 1 847 valuevar = "_[%d]" % self.__with_count 829 848 self.set_lineno(node) 830 849 self.visit(node.expr) … … 901 920 if level == 0 and not self.graph.checkFlag(CO_FUTURE_ABSIMPORT): 902 921 level = -1 903 fromlist = map(lambda (name, alias): name,node.names)922 fromlist = tuple(name for (name, alias) in node.names) 904 923 if VERSION > 1: 905 924 self.emit('LOAD_CONST', level) 906 self.emit('LOAD_CONST', tuple(fromlist))925 self.emit('LOAD_CONST', fromlist) 907 926 self.emit('IMPORT_NAME', node.modname) 908 927 for name, alias in node.names: … … 1246 1265 self.emit('BUILD_LIST', len(node.nodes)) 1247 1266 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 1248 1273 def visitSliceobj(self, node): 1249 1274 for child in node.nodes:
Note:
See TracChangeset
for help on using the changeset viewer.