[pypy-svn] r53320 - in pypy/branch/js-refactoring/pypy/lang/js: . test

fijal at codespeak.net fijal at codespeak.net
Fri Apr 4 07:03:09 CEST 2008


Author: fijal
Date: Fri Apr  4 07:03:08 2008
New Revision: 53320

Modified:
   pypy/branch/js-refactoring/pypy/lang/js/baseop.py
   pypy/branch/js-refactoring/pypy/lang/js/interpreter.py
   pypy/branch/js-refactoring/pypy/lang/js/jsobj.py
   pypy/branch/js-refactoring/pypy/lang/js/test/test_interp.py
Log:
THIS is an important test.


Modified: pypy/branch/js-refactoring/pypy/lang/js/baseop.py
==============================================================================
--- pypy/branch/js-refactoring/pypy/lang/js/baseop.py	(original)
+++ pypy/branch/js-refactoring/pypy/lang/js/baseop.py	Fri Apr  4 07:03:08 2008
@@ -22,8 +22,8 @@
         except OverflowError:
             return W_FloatNumber(float(ileft) + float(iright))
     else:
-        fleft = nleft.ToNumber()
-        fright = nright.ToNumber()
+        fleft = nleft.ToNumber(ctx)
+        fright = nright.ToNumber(ctx)
         return W_FloatNumber(fleft + fright)
 
 def increment(ctx, nleft, constval=1):
@@ -40,8 +40,8 @@
             return W_IntNumber(ovfcheck(ileft - iright))
         except OverflowError:
             return W_FloatNumber(float(ileft) - float(iright))
-    fleft = nleft.ToNumber()
-    fright = nright.ToNumber()
+    fleft = nleft.ToNumber(ctx)
+    fright = nright.ToNumber(ctx)
     return W_FloatNumber(fleft - fright)
 
 def mult(ctx, nleft, nright):
@@ -52,8 +52,8 @@
             return W_IntNumber(ovfcheck(ileft * iright))
         except OverflowError:
             return W_FloatNumber(float(ileft) * float(iright))
-    fleft = nleft.ToNumber()
-    fright = nright.ToNumber()
+    fleft = nleft.ToNumber(ctx)
+    fright = nright.ToNumber(ctx)
     return W_FloatNumber(fleft * fright)
 
 def mod(ctx, nleft, nright): # XXX this one is really not following spec
@@ -63,8 +63,8 @@
 
 def division(ctx, nleft, nright):
     # XXX optimise for ints and floats
-    fleft = nleft.ToNumber()
-    fright = nright.ToNumber()
+    fleft = nleft.ToNumber(ctx)
+    fright = nright.ToNumber(ctx)
     if fright == 0:
         if fleft < 0:
             val = -INFINITY
@@ -86,8 +86,8 @@
     s1 = x.ToPrimitive(ctx, 'Number')
     s2 = y.ToPrimitive(ctx, 'Number')
     if not (isinstance(s1, W_String) and isinstance(s2, W_String)):
-        s4 = s1.ToNumber()
-        s5 = s2.ToNumber()
+        s4 = s1.ToNumber(ctx)
+        s5 = s2.ToNumber(ctx)
         if isnan(s4) or isnan(s5):
             return False
         return s4 > s5
@@ -106,8 +106,8 @@
     s1 = x.ToPrimitive(ctx, 'Number')
     s2 = y.ToPrimitive(ctx, 'Number')
     if not (isinstance(s1, W_String) and isinstance(s2, W_String)):
-        s4 = s1.ToNumber()
-        s5 = s2.ToNumber()
+        s4 = s1.ToNumber(ctx)
+        s5 = s2.ToNumber(ctx)
         if isnan(s4) or isnan(s5):
             return False
         return s4 >= s5
@@ -133,8 +133,8 @@
         if type1 == "undefined" or type1 == "null":
             return True
         if type1 == "number":
-            n1 = x.ToNumber()
-            n2 = y.ToNumber()
+            n1 = x.ToNumber(ctx)
+            n2 = y.ToNumber(ctx)
             if isnan(n1) or isnan(n2):
                 return False
             if n1 == n2:
@@ -151,13 +151,13 @@
            (type1 == "null" and type2 == "undefined"):
             return True
         if type1 == "number" and type2 == "string":
-            return AbstractEC(ctx, x, W_FloatNumber(y.ToNumber()))
+            return AbstractEC(ctx, x, W_FloatNumber(y.ToNumber(ctx)))
         if type1 == "string" and type2 == "number":
-            return AbstractEC(ctx, W_FloatNumber(x.ToNumber()), y)
+            return AbstractEC(ctx, W_FloatNumber(x.ToNumber(ctx)), y)
         if type1 == "boolean":
-            return AbstractEC(ctx, W_FloatNumber(x.ToNumber()), y)
+            return AbstractEC(ctx, W_FloatNumber(x.ToNumber(ctx)), y)
         if type2 == "boolean":
-            return AbstractEC(ctx, x, W_FloatNumber(y.ToNumber()))
+            return AbstractEC(ctx, x, W_FloatNumber(y.ToNumber(ctx)))
         if (type1 == "string" or type1 == "number") and \
             type2 == "object":
             return AbstractEC(ctx, x, y.ToPrimitive(ctx))
@@ -175,7 +175,7 @@
     if isinstance(x, W_String) and isinstance(y, W_String):
         r = x.ToString(ctx) == y.ToString(ctx)
     else:
-        r = x.ToNumber() == y.ToNumber()
+        r = x.ToNumber(ctx) == y.ToNumber(ctx)
     return r
 
 def StrictEC(ctx, x, y):
@@ -190,8 +190,8 @@
     if type1 == "undefined" or type1 == "null":
         return True
     if type1 == "number":
-        n1 = x.ToNumber()
-        n2 = y.ToNumber()
+        n1 = x.ToNumber(ctx)
+        n2 = y.ToNumber(ctx)
         if isnan(n1) or isnan(n2):
             return False
         if n1 == n2:
@@ -216,4 +216,4 @@
 def uminus(obj):
     if isinstance(obj, W_IntNumber):
         return W_IntNumber(-obj.intval)
-    return W_FloatNumber(-obj.ToNumber())
+    return W_FloatNumber(-obj.ToNumber(ctx))

Modified: pypy/branch/js-refactoring/pypy/lang/js/interpreter.py
==============================================================================
--- pypy/branch/js-refactoring/pypy/lang/js/interpreter.py	(original)
+++ pypy/branch/js-refactoring/pypy/lang/js/interpreter.py	Fri Apr  4 07:03:08 2008
@@ -10,7 +10,7 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.streamio import open_file_as_stream
 from pypy.lang.js.jscode import JsCode
-from pypy.rlib.rarithmetic import NAN, INFINITY
+from pypy.rlib.rarithmetic import NAN, INFINITY, isnan
 
 ASTBUILDER = ASTBuilder()
 
@@ -63,18 +63,19 @@
 
 class W_NumberObject(W_NativeObject):
     def Call(self, ctx, args=[], this=None):
-        import pdb
-        pdb.set_trace()
         if len(args) >= 1 and not isnull_or_undefined(args[0]):
-            return W_FloatNumber(args[0].ToNumber())
+            return W_FloatNumber(args[0].ToNumber(ctx))
         elif len(args) >= 1 and args[0] is w_Undefined:
             return W_FloatNumber(NAN)
         else:
             return W_FloatNumber(0.0)
 
+    def ToNumber(self, ctx):
+        return 0.0
+
     def Construct(self, ctx, args=[]):
         if len(args) >= 1 and not isnull_or_undefined(args[0]):
-            Value = W_FloatNumber(args[0].ToNumber())
+            Value = W_FloatNumber(args[0].ToNumber(ctx))
             return create_object(ctx, 'Number', Value = Value)
         return create_object(ctx, 'Number', Value = W_FloatNumber(0.0))
 
@@ -158,12 +159,12 @@
 def isnanjs(ctx, args, this):
     if len(args) < 1:
         return W_Boolean(True)
-    return W_Boolean(args[0].ToNumber() == NaN)
+    return W_Boolean(isnan(args[0].ToNumber(ctx)))
 
 def isfinitejs(ctx, args, this):
     if len(args) < 1:
         return W_Boolean(True)
-    n = args[0].ToNumber()
+    n = args[0].ToNumber(ctx)
     if n == Infinity or n == -Infinity or n == NaN:
         return W_Boolean(False)
     else:
@@ -188,7 +189,7 @@
 
 def numberjs(ctx, args, this):
     if len(args) > 0:
-        return W_FloatNumber(args[0].ToNumber())
+        return W_FloatNumber(args[0].ToNumber(ctx))
     return W_IntNumber(0)
         
 def absjs(ctx, args, this):
@@ -197,16 +198,16 @@
         if val.intval > 0:
             return val # fast path
         return W_IntNumber(-val.intval)
-    return W_FloatNumber(abs(args[0].ToNumber()))
+    return W_FloatNumber(abs(args[0].ToNumber(ctx)))
 
 def floorjs(ctx, args, this):
-    return W_IntNumber(int(math.floor(args[0].ToNumber())))
+    return W_IntNumber(int(math.floor(args[0].ToNumber(ctx))))
 
 def powjs(ctx, args, this):
-    return W_FloatNumber(math.pow(args[0].ToNumber(), args[1].ToNumber()))
+    return W_FloatNumber(math.pow(args[0].ToNumber(ctx), args[1].ToNumber(ctx)))
 
 def sqrtjs(ctx, args, this):
-    return W_FloatNumber(math.sqrt(args[0].ToNumber()))
+    return W_FloatNumber(math.sqrt(args[0].ToNumber(ctx)))
 
 def versionjs(ctx, args, this):
     return w_Undefined

Modified: pypy/branch/js-refactoring/pypy/lang/js/jsobj.py
==============================================================================
--- pypy/branch/js-refactoring/pypy/lang/js/jsobj.py	(original)
+++ pypy/branch/js-refactoring/pypy/lang/js/jsobj.py	Fri Apr  4 07:03:08 2008
@@ -45,17 +45,16 @@
         # XXX should raise not implemented
         return self
 
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         return 0.0
     
     def ToInt32(self):
-        return int(self.ToNumber())
+        return int(self.ToNumber(ctx))
     
     def ToUInt32(self):
         return r_uint(0)
     
     def Get(self, P):
-        print P
         raise NotImplementedError
     
     def Put(self, P, V, dd=False,
@@ -81,7 +80,7 @@
     def __str__(self):
         return "w_undefined"
     
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         return NaN
 
     def ToBoolean(self):
@@ -246,6 +245,9 @@
         W_PrimitiveObject.__init__(self, ctx, Prototype,
                                    Class, Value, callfunc)
 
+    def ToNumber(self, ctx):
+        return self.Get('valueOf').Call(ctx, args=[], this=self).ToNumber(ctx)
+
 class W_NewBuiltin(W_PrimitiveObject):
     def __init__(self, ctx, Prototype=None, Class='function',
                  Value=w_Undefined, callfunc=None):
@@ -320,7 +322,7 @@
             if P == 'length':
                 try:
                     res = V.ToUInt32()
-                    if V.ToNumber() < 0:
+                    if V.ToNumber(ctx) < 0:
                         raise RangeError()
                     self.propdict['length'].value = W_IntNumber(res)
                     self.length = res
@@ -357,7 +359,7 @@
             return "true"
         return "false"
     
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         if self.boolval:
             return 1.0
         return 0.0
@@ -393,7 +395,7 @@
     def GetPropertyName(self):
         return self.ToString()
 
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         if not self.strval:
             return 0.0
         try:
@@ -426,7 +428,7 @@
     def ToBoolean(self):
         return bool(self.intval)
 
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         # XXX
         return float(self.intval)
 
@@ -466,7 +468,7 @@
             return False
         return bool(self.floatval)
 
-    def ToNumber(self):
+    def ToNumber(self, ctx):
         return self.floatval
 
     def ToInt32(self):

Modified: pypy/branch/js-refactoring/pypy/lang/js/test/test_interp.py
==============================================================================
--- pypy/branch/js-refactoring/pypy/lang/js/test/test_interp.py	(original)
+++ pypy/branch/js-refactoring/pypy/lang/js/test/test_interp.py	Fri Apr  4 07:03:08 2008
@@ -13,7 +13,7 @@
     bytecode.emit('LOAD_FLOATCONSTANT', 4)
     bytecode.emit('ADD')
     bytecode.run(ExecutionContext([W_Object()]), check_stack=False)
-    assert bytecode.stack[0].ToNumber() == 6.0
+    assert bytecode.stack[0].ToNumber(None) == 6.0
 
 def assertp(code, prints):
     l = []
@@ -47,7 +47,7 @@
     elif isinstance(value, int):
         assert code_val.ToInt32() == value
     elif isinstance(value, float):
-        assert code_val.ToNumber() == value
+        assert code_val.ToNumber(None) == value
     else:
         assert code_val.ToString(ctx) == value
 
@@ -623,3 +623,10 @@
 
 def test_number():
     assertp("print(Number(void 0))", "NaN")
+    assertp("""
+    function MyObject( value ) {
+      this.value = value;
+      this.valueOf = new Function( "return this.value" );
+    }
+    print (Number(new MyObject(100)));
+    """, "100")



More information about the Pypy-commit mailing list