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

fijal at codespeak.net fijal at codespeak.net
Mon Oct 30 18:08:29 CET 2006


Author: fijal
Date: Mon Oct 30 18:08:27 2006
New Revision: 33916

Modified:
   pypy/dist/pypy/lang/js/astgen.py
   pypy/dist/pypy/lang/js/interpreter.py
   pypy/dist/pypy/lang/js/test/test_interp.py
Log:
First attempt about making real JS objects.


Modified: pypy/dist/pypy/lang/js/astgen.py
==============================================================================
--- pypy/dist/pypy/lang/js/astgen.py	(original)
+++ pypy/dist/pypy/lang/js/astgen.py	Mon Oct 30 18:08:27 2006
@@ -66,7 +66,7 @@
     elif tp == 'SEMICOLON':
         return Semicolon(from_dict(d['expression']))
     elif tp == 'NUMBER':
-        return Number(int(d['value']))
+        return Number(float(d['value']))
     elif tp == 'IDENTIFIER':
         return Identifier(d['value'])
     elif tp == 'LIST':

Modified: pypy/dist/pypy/lang/js/interpreter.py
==============================================================================
--- pypy/dist/pypy/lang/js/interpreter.py	(original)
+++ pypy/dist/pypy/lang/js/interpreter.py	Mon Oct 30 18:08:27 2006
@@ -1,6 +1,7 @@
 
 from pypy.lang.js.astgen import *
 from pypy.lang.js.context import ExecutionContext
+from pypy.lang.js.jsobj import W_Number, W_String
 
 def writer(x):
     print x
@@ -13,11 +14,25 @@
 
 class __extend__(Number):
     def call(self, context):
-        return self.num
+        return W_Number(self.num)
 
 class __extend__(Plus):
     def call(self, context=None):
-        return self.left.call(context) + self.right.call(context)
+        left = self.left.call(context).GetValue()
+        right = self.right.call(context).GetValue()
+        prim_left = left.ToPrimitive()
+        prim_right = right.ToPrimitive()
+        # INSANE
+        if isinstance(prim_left, W_String) or isinstance(prim_right, W_String):
+            str_left = prim_left.ToString()
+            str_right = prim_right.ToString()
+            return W_String(str_left + str_right)
+        else:
+            num_left = prim_left.ToNumber()
+            num_right = prim_right.ToNumber()
+            # XXX: obey all the rules
+            return W_Number(num_left + num_right)
+        #return self.left.call(context).add(self.right.call(context))
 
 class __extend__(Semicolon):
     def call(self, context=None):

Modified: pypy/dist/pypy/lang/js/test/test_interp.py
==============================================================================
--- pypy/dist/pypy/lang/js/test/test_interp.py	(original)
+++ pypy/dist/pypy/lang/js/test/test_interp.py	Mon Oct 30 18:08:27 2006
@@ -11,7 +11,7 @@
 
 class TestInterp(object):
     def test_simple(self):
-        assert Plus(Number(3), Number(4)).call() == 7
+        assert Plus(Number(3), Number(4)).call().floatval == 7
         #    s = Script([Semicolon(Plus(Number(3), Number(4)))], [], [])
         #    s.call()
         l = []
@@ -32,3 +32,5 @@
 
     def test_var_assign(self):
         self.assert_prints(parse_d("x=3;print(x);"), ["3"])
+        self.assert_prints(parse_d("x=3;y=4;print(x+y);"), ["7"])
+



More information about the Pypy-commit mailing list