[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