Author: Stephan <[email protected]>
Branch: 
Changeset: r365:f6a6c15c2f42
Date: 2013-03-20 16:19 +0100
http://bitbucket.org/pypy/lang-js/changeset/f6a6c15c2f42/

Log:    fixed integer to float contamination

diff --git a/js/baseop.py b/js/baseop.py
--- a/js/baseop.py
+++ b/js/baseop.py
@@ -3,7 +3,7 @@
 """
 
 from js.jsobj import W_String, W_IntNumber, W_FloatNumber
-from js.object_space import _w
+from js.object_space import _w, isint
 
 from rpython.rlib.rarithmetic import ovfcheck
 from rpython.rlib.rfloat import isnan, isinf
@@ -13,7 +13,7 @@
 
 
 # 11.6.1, 11.6.3
-def plus(ctx, lval, rval):
+def plus(lval, rval):
     lprim = lval.ToPrimitive()
     rprim = rval.ToPrimitive()
 
@@ -22,7 +22,7 @@
         sright = rprim.to_string()
         return W_String(sleft + sright)
     # hot path
-    if isinstance(lprim, W_IntNumber) and isinstance(rprim, W_IntNumber):
+    if isint(lprim) and isint(rprim):
         ileft = lprim.ToInteger()
         iright = rprim.ToInteger()
         try:
@@ -35,11 +35,11 @@
         return W_FloatNumber(fleft + fright)
 
 
-def increment(ctx, nleft, constval=1):
-    if isinstance(nleft, W_IntNumber):
+def increment(nleft, constval=1):
+    if isint(nleft):
         return W_IntNumber(nleft.ToInteger() + constval)
     else:
-        return plus(ctx, nleft, W_IntNumber(constval))
+        return plus(nleft, W_IntNumber(constval))
 
 
 def decrement(ctx, nleft, constval=1):
@@ -50,7 +50,7 @@
 
 
 def sub(ctx, nleft, nright):
-    if isinstance(nleft, W_IntNumber) and isinstance(nright, W_IntNumber):
+    if isint(nleft) and isint(nright):
         # XXX fff
         ileft = nleft.ToInt32()
         iright = nright.ToInt32()
@@ -64,7 +64,7 @@
 
 
 def mult(ctx, nleft, nright):
-    if isinstance(nleft, W_IntNumber) and isinstance(nright, W_IntNumber):
+    if isint(nleft) and isint(nright):
         # XXXX test & stuff
         ileft = nleft.ToInteger()
         iright = nright.ToInteger()
@@ -115,7 +115,6 @@
 
 # 11.5.2
 def division(ctx, nleft, nright):
-
     fleft = nleft.ToNumber()
     fright = nright.ToNumber()
     if isnan(fleft) or isnan(fright):
@@ -143,7 +142,7 @@
 
 
 def compare(ctx, x, y):
-    if isinstance(x, W_IntNumber) and isinstance(y, W_IntNumber):
+    if isint(x) and isint(y):
         return x.ToInteger() > y.ToInteger()
     if isinstance(x, W_FloatNumber) and isinstance(y, W_FloatNumber):
         if isnan(x.ToNumber()) or isnan(y.ToNumber()):
@@ -164,7 +163,7 @@
 
 
 def compare_e(ctx, x, y):
-    if isinstance(x, W_IntNumber) and isinstance(y, W_IntNumber):
+    if isint(x) and isint(y):
         return x.ToInteger() >= y.ToInteger()
     if isinstance(x, W_FloatNumber) and isinstance(y, W_FloatNumber):
         if isnan(x.ToNumber()) or isnan(y.ToNumber()):
@@ -190,7 +189,7 @@
     Implements the Abstract Equality Comparison x == y
     trying to be fully to the spec
     """
-    if isinstance(x, W_IntNumber) and isinstance(y, W_IntNumber):
+    if isint(x) and isint(y):
         return x.ToInteger() == y.ToInteger()
     if isinstance(x, W_FloatNumber) and isinstance(y, W_FloatNumber):
         if isnan(x.ToNumber()) or isnan(y.ToNumber()):
@@ -275,7 +274,7 @@
 
 
 def uminus(obj, ctx):
-    if isinstance(obj, W_IntNumber):
+    if isint(obj):
         intval = obj.ToInteger()
         if intval == 0:
             return W_FloatNumber(-float(intval))
diff --git a/js/object_space.py b/js/object_space.py
--- a/js/object_space.py
+++ b/js/object_space.py
@@ -2,6 +2,11 @@
 from rpython.rlib import jit
 
 
+def isint(w):
+    from js.jsobj import W_IntNumber
+    return isinstance(w, W_IntNumber)
+
+
 @enforceargs(int)
 def newint(i):
     from js.jsobj import W_IntNumber
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -1,7 +1,7 @@
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib import jit
 
-from js.object_space import _w
+from js.object_space import _w, isint
 from js.exception import JsTypeError
 from js.baseop import plus, sub, compare, AbstractEC, StrictEC,\
     compare_e, increment, decrement, mult, division, uminus, mod
@@ -328,7 +328,7 @@
 
 class ADD(BaseBinaryOperation):
     def operation(self, ctx, left, right):
-        return plus(ctx, left, right)
+        return plus(left, right)
 
 
 class BITAND(BaseBinaryBitwiseOp):
@@ -424,8 +424,14 @@
 class UPLUS(BaseUnaryOperation):
     def eval(self, ctx):
         expr = ctx.stack_pop()
-        num = expr.ToNumber()
-        res = _w(num)
+        res = None
+
+        if isint(expr):
+            res = expr
+        else:
+            num = expr.ToNumber()
+            res = _w(num)
+
         ctx.stack_append(res)
 
 
@@ -445,15 +451,21 @@
 class INCR(BaseUnaryOperation):
     def eval(self, ctx):
         value = ctx.stack_pop()
-        num = _w(value.ToNumber())
-        newvalue = increment(ctx, num)
+        if isint(value):
+            num = value
+        else:
+            num = _w(value.ToNumber())
+        newvalue = increment(num)
         ctx.stack_append(newvalue)
 
 
 class DECR(BaseUnaryOperation):
     def eval(self, ctx):
         value = ctx.stack_pop()
-        num = _w(value.ToNumber())
+        if isint(value):
+            num = value
+        else:
+            num = _w(value.ToNumber())
         newvalue = decrement(ctx, num)
         ctx.stack_append(newvalue)
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to