[pypy-svn] r43536 - in pypy/dist/pypy/lang/js: . test

santagada at codespeak.net santagada at codespeak.net
Mon May 21 18:05:58 CEST 2007


Author: santagada
Date: Mon May 21 18:05:57 2007
New Revision: 43536

Modified:
   pypy/dist/pypy/lang/js/astbuilder.py
   pypy/dist/pypy/lang/js/jsgrammar.txt
   pypy/dist/pypy/lang/js/operations.py
   pypy/dist/pypy/lang/js/test/test_astbuilder.py
Log:
"new" preliminar support

Modified: pypy/dist/pypy/lang/js/astbuilder.py
==============================================================================
--- pypy/dist/pypy/lang/js/astbuilder.py	(original)
+++ pypy/dist/pypy/lang/js/astbuilder.py	Mon May 21 18:05:57 2007
@@ -102,7 +102,6 @@
         return left
     visit_additiveexpression = binaryop
     visit_multiplicativeexpression = binaryop
-    visit_memberexpression = binaryop
     visit_bitwisexorexpression = binaryop
     visit_bitwiseandexpression = binaryop
     visit_bitwiseorexpression = binaryop
@@ -110,6 +109,18 @@
     visit_logicalorexpression = binaryop
     visit_logicalandexpression = binaryop
     
+    def visit_memberexpression(self, node):
+        if isinstance(node.children[0], Symbol) and \
+           node.children[0].additional_info == 'new': # XXX could be a identifier?
+            # "new case"
+            pos = self.get_pos(node)
+            left = self.dispatch(node.children[1])
+            right = self.dispatch(node.children[2])
+            exp = operations.Call(pos, left, right)
+            return operations.New(pos, exp)            
+        else:
+            return self.binaryop(node)
+
 
     def literalop(self, node):
         pos = self.get_pos(node);
@@ -215,3 +226,11 @@
     def visit_emptystatement(self, node):
         return operations.astundef
     
+    def visit_newexpression(self, node):
+        if len(node.children) == 1:
+            return self.dispatch(node.children[0])
+        else:
+            pos = self.get_pos(node)
+            val = self.dispatch(node.children[0])
+            return operations.New(pos, val)
+    

Modified: pypy/dist/pypy/lang/js/jsgrammar.txt
==============================================================================
--- pypy/dist/pypy/lang/js/jsgrammar.txt	(original)
+++ pypy/dist/pypy/lang/js/jsgrammar.txt	Mon May 21 18:05:57 2007
@@ -213,8 +213,8 @@
                     | "[" expression ["]"]
                     ;
 
-newexpression   : "new" newexpression
-                | <memberexpression>
+newexpression   : <memberexpression>
+                | "new" newexpression                
                 ;
 
 callexpression  : memberexpression arguments >callexpressiona<*

Modified: pypy/dist/pypy/lang/js/operations.py
==============================================================================
--- pypy/dist/pypy/lang/js/operations.py	(original)
+++ pypy/dist/pypy/lang/js/operations.py	Mon May 21 18:05:57 2007
@@ -693,14 +693,13 @@
 ##############################################################################
 
 class New(UnaryOp):
-    opcode = 'NEW'
-
     def eval(self, ctx):
         x = self.expr.eval(ctx).GetValue()
         if not isinstance(x, W_PrimitiveObject):
             raise TypeError()
         
         return x.Construct(ctx=ctx)
+    
 
 class NewWithArgs(BinaryOp):
     opcode = 'NEW_WITH_ARGS'

Modified: pypy/dist/pypy/lang/js/test/test_astbuilder.py
==============================================================================
--- pypy/dist/pypy/lang/js/test/test_astbuilder.py	(original)
+++ pypy/dist/pypy/lang/js/test/test_astbuilder.py	Mon May 21 18:05:57 2007
@@ -3,7 +3,10 @@
 from pypy.lang.js import operations
 
 def to_ast(s):
-    ASTBuilder().dispatch(parse(s))
+    print s
+    tp = parse(s)
+    print tp
+    ASTBuilder().dispatch(tp)
 
 def test_simple():
     yield to_ast, "1;"
@@ -13,7 +16,9 @@
     yield to_ast, "x[1];"
     yield to_ast, "true;"
     yield to_ast, "false;"
-    yield to_ast, "null;"    
+    yield to_ast, "null;"
+    yield to_ast, "f();"
+    yield to_ast, "new f();"    
     #yield to_ast, ""
 
 def test_funcvarfinder():



More information about the Pypy-commit mailing list