[pypy-svn] r29796 - in pypy/dist/pypy/interpreter: astcompiler test

mwh at codespeak.net mwh at codespeak.net
Sat Jul 8 12:00:04 CEST 2006


Author: mwh
Date: Sat Jul  8 11:59:58 2006
New Revision: 29796

Modified:
   pypy/dist/pypy/interpreter/astcompiler/ast.py
   pypy/dist/pypy/interpreter/astcompiler/astgen.py
   pypy/dist/pypy/interpreter/test/test_compiler.py
Log:
(mwh, misto)
exposed the Expression AST class to app level
added mutate to Node
wrote a very very simple constant folder as a test


Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py	Sat Jul  8 11:59:58 2006
@@ -44,6 +44,8 @@
         return [] # implemented by subclasses
     def accept(self, visitor):
         raise NotImplementedError
+    def mutate(self, visitor):
+        return visitor.visitNode(self)
     def flatten(self):
         res = []
         nodes = self.getChildNodes()
@@ -69,6 +71,11 @@
     args = Arguments(space, [ w_self ])
     return space.call_args( w_callable, args )
 
+def descr_node_mutate(space, w_self, w_visitor): 
+    w_visitNode = space.getattr(w_visitor, space.wrap("visitNode"))
+    w_visitNode_args = Arguments(space, [ w_self ])
+    return space.call_args(w_visitNode, w_visitNode_args)
+
 def descr_Node_new(space, w_subtype, lineno=-1):
     node = space.allocate_instance(Node, w_subtype)
     node.lineno = lineno
@@ -79,6 +86,7 @@
                        #__repr__ = interp2app(descr_node_repr, unwrap_spec=['self', ObjSpace] ),
                        getChildNodes = interp2app(Node.descr_getChildNodes, unwrap_spec=[ 'self', ObjSpace ] ),
                        accept = interp2app(descr_node_accept, unwrap_spec=[ ObjSpace, W_Root, W_Root ] ),
+                       mutate = interp2app(descr_node_mutate, unwrap_spec=[ ObjSpace, W_Root, W_Root ] ),
                        lineno = interp_attrproperty('lineno', cls=Node),
                        filename = interp_attrproperty('filename', cls=Node),
                        )
@@ -106,6 +114,45 @@
 
     def accept(self, visitor):
         return visitor.visitExpression(self)
+    def mutate(self, visitor):
+        self.node = self.node.mutate(visitor)
+        return visitor.visitExpression(self)
+
+    def fget_node(space, self):
+        return space.wrap(self.node)
+    def fset_node(space, self, w_arg):
+        self.node = space.interp_w(Node, w_arg, can_be_None=False)
+
+def descr_expression_new(space, w_subtype, w_node, lineno=-1):
+    self = space.allocate_instance(Expression, w_subtype)
+    node = space.interp_w(Node, w_node, can_be_None=False)
+    self.node = node
+    self.lineno = lineno
+    return space.wrap(self)
+
+def descr_expression_accept(space, w_self, w_visitor):
+    w_callable = space.getattr(w_visitor, space.wrap("visitExpression"))
+    args = Arguments(space, [ w_self ])
+    return space.call_args(w_callable, args)
+
+def descr_expression_mutate(space, w_self, w_visitor):
+    w_node = space.getattr(w_self, space.wrap("node"))
+    w_mutate_node = space.getattr(w_node, space.wrap("mutate"))
+    w_mutate_node_args = Arguments(space, [ w_visitor ])
+    w_new_node = space.call_args(w_mutate_node, w_mutate_node_args)
+    space.setattr(w_self, space.wrap("node"), w_new_node)
+
+    w_visitExpression = space.getattr(w_visitor, space.wrap("visitExpression"))
+    w_visitExpression_args = Arguments(space, [ w_self ])
+    return space.call_args(w_visitExpression, w_visitExpression_args)
+
+Expression.typedef = TypeDef('Expression', Node.typedef,
+                     __new__ = interp2app(descr_expression_new, unwrap_spec=[ObjSpace, W_Root, W_Root, int]),
+                     accept=interp2app(descr_expression_accept, unwrap_spec=[ObjSpace, W_Root, W_Root] ),
+                     mutate=interp2app(descr_expression_mutate, unwrap_spec=[ObjSpace, W_Root, W_Root] ),
+                     node=GetSetProperty(Expression.fget_node, Expression.fset_node ),
+                    )
+                    
 
 
 

Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py	Sat Jul  8 11:59:58 2006
@@ -641,6 +641,8 @@
         return [] # implemented by subclasses
     def accept(self, visitor):
         raise NotImplementedError
+    def mutate(self, visitor):
+        return visitor.visitNode(self)
     def flatten(self):
         res = []
         nodes = self.getChildNodes()
@@ -666,6 +668,11 @@
     args = Arguments(space, [ w_self ])
     return space.call_args( w_callable, args )
 
+def descr_node_mutate(space, w_self, w_visitor): 
+    w_visitNode = space.getattr(w_visitor, space.wrap("visitNode"))
+    w_visitNode_args = Arguments(space, [ w_self ])
+    return space.call_args(w_visitNode, w_visitNode_args)
+
 def descr_Node_new(space, w_subtype, lineno=-1):
     node = space.allocate_instance(Node, w_subtype)
     node.lineno = lineno
@@ -676,6 +683,7 @@
                        #__repr__ = interp2app(descr_node_repr, unwrap_spec=['self', ObjSpace] ),
                        getChildNodes = interp2app(Node.descr_getChildNodes, unwrap_spec=[ 'self', ObjSpace ] ),
                        accept = interp2app(descr_node_accept, unwrap_spec=[ ObjSpace, W_Root, W_Root ] ),
+                       mutate = interp2app(descr_node_mutate, unwrap_spec=[ ObjSpace, W_Root, W_Root ] ),
                        lineno = interp_attrproperty('lineno', cls=Node),
                        filename = interp_attrproperty('filename', cls=Node),
                        )
@@ -703,6 +711,45 @@
 
     def accept(self, visitor):
         return visitor.visitExpression(self)
+    def mutate(self, visitor):
+        self.node = self.node.mutate(visitor)
+        return visitor.visitExpression(self)
+
+    def fget_node(space, self):
+        return space.wrap(self.node)
+    def fset_node(space, self, w_arg):
+        self.node = space.interp_w(Node, w_arg, can_be_None=False)
+
+def descr_expression_new(space, w_subtype, w_node, lineno=-1):
+    self = space.allocate_instance(Expression, w_subtype)
+    node = space.interp_w(Node, w_node, can_be_None=False)
+    self.node = node
+    self.lineno = lineno
+    return space.wrap(self)
+
+def descr_expression_accept(space, w_self, w_visitor):
+    w_callable = space.getattr(w_visitor, space.wrap("visitExpression"))
+    args = Arguments(space, [ w_self ])
+    return space.call_args(w_callable, args)
+
+def descr_expression_mutate(space, w_self, w_visitor):
+    w_node = space.getattr(w_self, space.wrap("node"))
+    w_mutate_node = space.getattr(w_node, space.wrap("mutate"))
+    w_mutate_node_args = Arguments(space, [ w_visitor ])
+    w_new_node = space.call_args(w_mutate_node, w_mutate_node_args)
+    space.setattr(w_self, space.wrap("node"), w_new_node)
+
+    w_visitExpression = space.getattr(w_visitor, space.wrap("visitExpression"))
+    w_visitExpression_args = Arguments(space, [ w_self ])
+    return space.call_args(w_visitExpression, w_visitExpression_args)
+
+Expression.typedef = TypeDef('Expression', Node.typedef,
+                     __new__ = interp2app(descr_expression_new, unwrap_spec=[ObjSpace, W_Root, W_Root, int]),
+                     accept=interp2app(descr_expression_accept, unwrap_spec=[ObjSpace, W_Root, W_Root] ),
+                     mutate=interp2app(descr_expression_mutate, unwrap_spec=[ObjSpace, W_Root, W_Root] ),
+                     node=GetSetProperty(Expression.fget_node, Expression.fset_node ),
+                    )
+                    
 
 '''
 

Modified: pypy/dist/pypy/interpreter/test/test_compiler.py
==============================================================================
--- pypy/dist/pypy/interpreter/test/test_compiler.py	(original)
+++ pypy/dist/pypy/interpreter/test/test_compiler.py	Sat Jul  8 11:59:58 2006
@@ -421,3 +421,45 @@
     def setup_method(self, method):
         self.compiler = PythonAstCompiler(self.space)
 
+
+
+
+class AppTestOptimizer:
+    def test_constant_fold_add(self):
+        import parser
+        class Folder:
+            def defaultvisit(self, node):
+                return node
+            
+            def __getattr__(self, attrname):
+                if attrname.startswith('visit'):
+                    return self.defaultvisit
+                raise AttributeError(attrname)
+
+            def visitAdd(self, node):
+                left = node.left
+                right = node.right
+                if isinstance(left, parser.ASTConst) and \
+                       isinstance(right, parser.ASTConst):
+                    if type(left.value) == type(right.value):
+                        return parser.ASTConst(left.value + right.value)
+                return node
+
+        def hook(ast, enc):
+            return ast.mutate(Folder())
+        
+        parser.install_compiler_hook(hook)
+        code = compile("1+2", "", "eval")
+        parser.install_compiler_hook(None)
+        import dis, sys, StringIO
+        s = StringIO.StringIO()
+        so = sys.stdout
+        sys.stdout = s
+        try:
+            dis.dis(code)
+        finally:
+            sys.stdout = so
+        output = s.getvalue()
+        assert 'BINARY_ADD' not in output
+        
+        



More information about the Pypy-commit mailing list