< prev index next >
src/jdk/nashorn/internal/codegen/FoldConstants.java
Print this page
@@ -305,13 +305,11 @@
}
final Type widest = Type.widest(lhs.getType(), rhs.getType());
boolean isInteger = widest.isInteger();
- boolean isLong = widest.isLong();
-
- double value;
+ final double value;
switch (parent.tokenType()) {
case DIV:
value = lhs.getNumber() / rhs.getNumber();
break;
@@ -334,11 +332,12 @@
break;
case SUB:
value = lhs.getNumber() - rhs.getNumber();
break;
case SHR:
- return LiteralNode.newInstance(token, finish, JSType.toUint32(lhs.getInt32() >>> rhs.getInt32()));
+ final long result = JSType.toUint32(lhs.getInt32() >>> rhs.getInt32());
+ return LiteralNode.newInstance(token, finish, JSType.isRepresentableAsInt(result) ? (int) result : (double) result);
case SAR:
return LiteralNode.newInstance(token, finish, lhs.getInt32() >> rhs.getInt32());
case SHL:
return LiteralNode.newInstance(token, finish, lhs.getInt32() << rhs.getInt32());
case BIT_XOR:
@@ -366,16 +365,13 @@
default:
return null;
}
isInteger &= JSType.isStrictlyRepresentableAsInt(value);
- isLong &= JSType.isStrictlyRepresentableAsLong(value);
if (isInteger) {
return LiteralNode.newInstance(token, finish, (int)value);
- } else if (isLong) {
- return LiteralNode.newInstance(token, finish, (long)value);
}
return LiteralNode.newInstance(token, finish, value);
}
}
< prev index next >