[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