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