[Python-checkins] CVS: python/dist/src/Tools/compiler/compiler transformer.py,1.18,1.19

Jeremy Hylton python-dev@python.org
Mon, 6 Nov 2000 08:03:54 -0800


Update of /cvsroot/python/python/dist/src/Tools/compiler/compiler
In directory slayer.i.sourceforge.net:/tmp/cvs-serv26474

Modified Files:
	transformer.py 
Log Message:
a few small optimizations that seem to give a 5-10% speedup; the
further optimization of com_node makes the most difference.


Index: transformer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/transformer.py,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -r1.18 -r1.19
*** transformer.py	2000/11/06 03:33:52	1.18
--- transformer.py	2000/11/06 16:03:52	1.19
***************
*** 83,90 ****
  
      def __init__(self):
!         self._dispatch = { }
          for value, name in symbol.sym_name.items():
              if hasattr(self, name):
                  self._dispatch[value] = getattr(self, name)
  
      def transform(self, tree):
--- 83,99 ----
  
      def __init__(self):
!         self._dispatch = {}
          for value, name in symbol.sym_name.items():
              if hasattr(self, name):
                  self._dispatch[value] = getattr(self, name)
+         self._dispatch[token.NEWLINE] = self.com_NEWLINE
+         self._atom_dispatch = {token.LPAR: self.atom_lpar,
+                                token.LSQB: self.atom_lsqb,
+                                token.LBRACE: self.atom_lbrace,
+                                token.BACKQUOTE: self.atom_backquote,
+                                token.NUMBER: self.atom_number,
+                                token.STRING: self.atom_string,
+                                token.NAME: self.atom_name,
+                                }
  
      def transform(self, tree):
***************
*** 485,489 ****
          # testlist: expr (',' expr)* [',']
          # exprlist: expr (',' expr)* [',']
!         return self.com_binary('tuple', nodelist)
  
      exprlist = testlist
--- 494,498 ----
          # testlist: expr (',' expr)* [',']
          # exprlist: expr (',' expr)* [',']
!         return self.com_binary(Tuple, nodelist)
  
      exprlist = testlist
***************
*** 493,501 ****
          if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef:
              return self.lambdef(nodelist[0])
!         return self.com_binary('or', nodelist)
  
      def and_test(self, nodelist):
          # not_test ('and' not_test)*
!         return self.com_binary('and', nodelist)
  
      def not_test(self, nodelist):
--- 502,510 ----
          if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef:
              return self.lambdef(nodelist[0])
!         return self.com_binary(Or, nodelist)
  
      def and_test(self, nodelist):
          # not_test ('and' not_test)*
!         return self.com_binary(And, nodelist)
  
      def not_test(self, nodelist):
***************
*** 545,557 ****
      def expr(self, nodelist):
          # xor_expr ('|' xor_expr)*
!         return self.com_binary('bitor', nodelist)
  
      def xor_expr(self, nodelist):
          # xor_expr ('^' xor_expr)*
!         return self.com_binary('bitxor', nodelist)
  
      def and_expr(self, nodelist):
          # xor_expr ('&' xor_expr)*
!         return self.com_binary('bitand', nodelist)
  
      def shift_expr(self, nodelist):
--- 554,566 ----
      def expr(self, nodelist):
          # xor_expr ('|' xor_expr)*
!         return self.com_binary(Bitor, nodelist)
  
      def xor_expr(self, nodelist):
          # xor_expr ('^' xor_expr)*
!         return self.com_binary(Bitxor, nodelist)
  
      def and_expr(self, nodelist):
          # xor_expr ('&' xor_expr)*
!         return self.com_binary(Bitand, nodelist)
  
      def shift_expr(self, nodelist):
***************
*** 584,610 ****
          for i in range(2, len(nodelist), 2):
              right = self.com_node(nodelist[i])
!             if nodelist[i-1][0] == token.STAR:
                  node = Mul([node, right])
!                 node.lineno = nodelist[1][2]
!             elif nodelist[i-1][0] == token.SLASH:
                  node = Div([node, right])
-                 node.lineno = nodelist[1][2]
              else:
                  node = Mod([node, right])
!                 node.lineno = nodelist[1][2]
          return node
  
      def factor(self, nodelist):
!         t = nodelist[0][0]
          node = self.com_node(nodelist[-1])
          if t == token.PLUS:
              node = UnaryAdd(node)
!             node.lineno = nodelist[0][2]
          elif t == token.MINUS:
              node = UnarySub(node)
!             node.lineno = nodelist[0][2]
          elif t == token.TILDE:
              node = Invert(node)
!             node.lineno = nodelist[0][2]
          return node
  
--- 593,619 ----
          for i in range(2, len(nodelist), 2):
              right = self.com_node(nodelist[i])
!             t = nodelist[i-1][0]
!             if t == token.STAR:
                  node = Mul([node, right])
!             elif t == token.SLASH:
                  node = Div([node, right])
              else:
                  node = Mod([node, right])
!             node.lineno = nodelist[1][2]
          return node
  
      def factor(self, nodelist):
!         elt = nodelist[0]
!         t = elt[0]
          node = self.com_node(nodelist[-1])
          if t == token.PLUS:
              node = UnaryAdd(node)
!             node.lineno = elt[2]
          elif t == token.MINUS:
              node = UnarySub(node)
!             node.lineno = elt[2]
          elif t == token.TILDE:
              node = Invert(node)
!             node.lineno = elt[2]
          return node
  
***************
*** 613,674 ****
          node = self.com_node(nodelist[0])
          for i in range(1, len(nodelist)):
!             if nodelist[i][0] == token.DOUBLESTAR:
                  n = Power([node, self.com_node(nodelist[i+1])])
!                 n.lineno = nodelist[i][2]
                  return n
  
!             node = self.com_apply_trailer(node, nodelist[i])
  
          return node
  
      def atom(self, nodelist):
!         t = nodelist[0][0]
!         if t == token.LPAR:
!             if nodelist[1][0] == token.RPAR:
!                 n = Tuple(())
!                 n.lineno = nodelist[0][2]
!                 return n
!             return self.com_node(nodelist[1])
! 
!         if t == token.LSQB:
!             if nodelist[1][0] == token.RSQB:
!                 n = List(())
!                 n.lineno = nodelist[0][2]
!                 return n
!             return self.com_list_constructor(nodelist[1])
  
!         if t == token.LBRACE:
!             if nodelist[1][0] == token.RBRACE:
!                 return Dict(())
!             return self.com_dictmaker(nodelist[1])
! 
!         if t == token.BACKQUOTE:
!             n = Backquote(self.com_node(nodelist[1]))
              n.lineno = nodelist[0][2]
              return n
  
!         if t == token.NUMBER:
!             ### need to verify this matches compile.c
!             k = eval(nodelist[0][1])
!             n = Const(k)
              n.lineno = nodelist[0][2]
              return n
  
!         if t == token.STRING:
!             ### need to verify this matches compile.c
!             k = ''
!             for node in nodelist:
!                 k = k + eval(node[1])
!             n = Const(k)
!             n.lineno = nodelist[0][2]
!             return n
  
!         if t == token.NAME:
!             ### any processing to do?
!             n = Name(nodelist[0][1])
!             n.lineno = nodelist[0][2]
!             return n
  
!         raise error, "unknown node type"
  
      # --------------------------------------------------------------
--- 622,683 ----
          node = self.com_node(nodelist[0])
          for i in range(1, len(nodelist)):
!             elt = nodelist[i]
!             if elt[0] == token.DOUBLESTAR:
                  n = Power([node, self.com_node(nodelist[i+1])])
!                 n.lineno = elt[2]
                  return n
  
!             node = self.com_apply_trailer(node, elt)
  
          return node
  
      def atom(self, nodelist):
!         return self._atom_dispatch[nodelist[0][0]](nodelist)
  
!     def atom_lpar(self, nodelist):
!         if nodelist[1][0] == token.RPAR:
!             n = Tuple(())
              n.lineno = nodelist[0][2]
              return n
+         return self.com_node(nodelist[1])
  
!     def atom_lsqb(self, nodelist):
!         if nodelist[1][0] == token.RSQB:
!             n = List(())
              n.lineno = nodelist[0][2]
              return n
+         return self.com_list_constructor(nodelist[1])
  
!     def atom_lbrace(self, nodelist):
!         if nodelist[1][0] == token.RBRACE:
!             return Dict(())
!         return self.com_dictmaker(nodelist[1])
  
!     def atom_backquote(self, nodelist):
!         n = Backquote(self.com_node(nodelist[1]))
!         n.lineno = nodelist[0][2]
!         return n
!     
!     def atom_number(self, nodelist):
!         ### need to verify this matches compile.c
!         k = eval(nodelist[0][1])
!         n = Const(k)
!         n.lineno = nodelist[0][2]
!         return n
!         
!     def atom_string(self, nodelist):
!         ### need to verify this matches compile.c
!         k = ''
!         for node in nodelist:
!             k = k + eval(node[1])
!         n = Const(k)
!         n.lineno = nodelist[0][2]
!         return n
  
!     def atom_name(self, nodelist):
!         ### any processing to do?
!         n = Name(nodelist[0][1])
!         n.lineno = nodelist[0][2]
!         return n
  
      # --------------------------------------------------------------
***************
*** 682,699 ****
          #       and compound_stmt.
          #       We'll just dispatch them.
  
          # A ';' at the end of a line can make a NEWLINE token appear
          # here, Render it harmless. (genc discards ('discard',
          # ('const', xxxx)) Nodes)
!         key = node[0]
!         
!         meth = self._dispatch.get(key, None)
!         if meth:
!             return meth(node[1:])
!         else:
!             if key == token.NEWLINE:
!                 return Discard(Const(None))
! 
!             raise error, 'illegal node passed to com_node: %s' % `node`
      
      def com_arglist(self, nodelist):
--- 691,701 ----
          #       and compound_stmt.
          #       We'll just dispatch them.
+         return self._dispatch[node[0]](node[1:])
  
+     def com_NEWLINE(self):
          # A ';' at the end of a line can make a NEWLINE token appear
          # here, Render it harmless. (genc discards ('discard',
          # ('const', xxxx)) Nodes)
!         return Discard(Const(None))
      
      def com_arglist(self, nodelist):
***************
*** 908,917 ****
      def com_assign_trailer(self, primary, node, assigning):
          t = node[1][0]
-         if t == token.LPAR:
-             raise SyntaxError, "can't assign to function call"
          if t == token.DOT:
              return self.com_assign_attr(primary, node[2], assigning)
          if t == token.LSQB:
              return self.com_subscriptlist(primary, node[2], assigning)
          raise SyntaxError, "unknown trailer type: %s" % t
  
--- 910,919 ----
      def com_assign_trailer(self, primary, node, assigning):
          t = node[1][0]
          if t == token.DOT:
              return self.com_assign_attr(primary, node[2], assigning)
          if t == token.LSQB:
              return self.com_subscriptlist(primary, node[2], assigning)
+         if t == token.LPAR:
+             raise SyntaxError, "can't assign to function call"
          raise SyntaxError, "unknown trailer type: %s" % t
  
***************
*** 919,923 ****
          return AssAttr(primary, node[1], assigning)
  
!     def com_binary(self, type, nodelist):
          "Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])."
          l = len(nodelist)
--- 921,925 ----
          return AssAttr(primary, node[1], assigning)
  
!     def com_binary(self, constructor, nodelist):
          "Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])."
          l = len(nodelist)
***************
*** 927,931 ****
          for i in range(0, l, 2):
              items.append(self.com_node(nodelist[i]))
!         return Node(type, items)
  
      def com_stmt(self, node):
--- 929,933 ----
          for i in range(0, l, 2):
              items.append(self.com_node(nodelist[i]))
!         return constructor(items)
  
      def com_stmt(self, node):
***************
*** 965,969 ****
              fors = []
              while node:
!                 if node[1][1] == 'for':
                      assignNode = self.com_assign(node[2], OP_ASSIGN)
                      listNode = self.com_node(node[4])
--- 967,972 ----
              fors = []
              while node:
!                 t = node[1][1]
!                 if t == 'for':
                      assignNode = self.com_assign(node[2], OP_ASSIGN)
                      listNode = self.com_node(node[4])
***************
*** 975,979 ****
                      else:
                          node = self.com_list_iter(node[5])
!                 elif node[1][1] == 'if':
                      test = self.com_node(node[2])
                      newif = ListCompIf(test)
--- 978,982 ----
                      else:
                          node = self.com_list_iter(node[5])
!                 elif t == 'if':
                      test = self.com_node(node[2])
                      newif = ListCompIf(test)
***************
*** 1102,1108 ****
          # slice_item: expression | proper_slice | ellipsis
          ch = node[1]
!         if ch[0] == token.DOT and node[2][0] == token.DOT:
              return Ellipsis()
!         if ch[0] == token.COLON or len(node) > 2:
              return self.com_sliceobj(node)
          return self.com_node(ch)
--- 1105,1112 ----
          # slice_item: expression | proper_slice | ellipsis
          ch = node[1]
!         t = ch[0]
!         if t == token.DOT and node[2][0] == token.DOT:
              return Ellipsis()
!         if t == token.COLON or len(node) > 2:
              return self.com_sliceobj(node)
          return self.com_node(ch)