< prev index next >

src/jdk/nashorn/internal/codegen/FoldConstants.java

Print this page
rev 1641 : 8144131: ArrayData.getInt implementations do not convert to int32


 217             final Node rhsNode = parent.getExpression();
 218 
 219             if (!(rhsNode instanceof LiteralNode)) {
 220                 return null;
 221             }
 222 
 223             if (rhsNode instanceof ArrayLiteralNode) {
 224                 return null;
 225             }
 226 
 227             final LiteralNode<?> rhs = (LiteralNode<?>)rhsNode;
 228             final Type rhsType = rhs.getType();
 229             final boolean rhsInteger = rhsType.isInteger() || rhsType.isBoolean();
 230 
 231             LiteralNode<?> literalNode;
 232 
 233             switch (parent.tokenType()) {
 234             case ADD:
 235                 if (rhsInteger) {
 236                     literalNode = LiteralNode.newInstance(token, finish, rhs.getInt32());


 237                 } else {
 238                     literalNode = LiteralNode.newInstance(token, finish, rhs.getNumber());
 239                 }
 240                 break;
 241             case SUB:
 242                 if (rhsInteger && rhs.getInt32() != 0) { // @see test/script/basic/minuszero.js
 243                     literalNode = LiteralNode.newInstance(token, finish, -rhs.getInt32());


 244                 } else {
 245                     literalNode = LiteralNode.newInstance(token, finish, -rhs.getNumber());
 246                 }
 247                 break;
 248             case NOT:
 249                 literalNode = LiteralNode.newInstance(token, finish, !rhs.getBoolean());
 250                 break;
 251             case BIT_NOT:
 252                 literalNode = LiteralNode.newInstance(token, finish, ~rhs.getInt32());
 253                 break;
 254             default:
 255                 return null;
 256             }
 257 
 258             return literalNode;
 259         }
 260     }
 261 
 262     //TODO add AND and OR with one constant parameter (bitwise)
 263     private static class BinaryNodeConstantEvaluator extends ConstantEvaluator<BinaryNode> {




 217             final Node rhsNode = parent.getExpression();
 218 
 219             if (!(rhsNode instanceof LiteralNode)) {
 220                 return null;
 221             }
 222 
 223             if (rhsNode instanceof ArrayLiteralNode) {
 224                 return null;
 225             }
 226 
 227             final LiteralNode<?> rhs = (LiteralNode<?>)rhsNode;
 228             final Type rhsType = rhs.getType();
 229             final boolean rhsInteger = rhsType.isInteger() || rhsType.isBoolean();
 230 
 231             LiteralNode<?> literalNode;
 232 
 233             switch (parent.tokenType()) {
 234             case ADD:
 235                 if (rhsInteger) {
 236                     literalNode = LiteralNode.newInstance(token, finish, rhs.getInt32());
 237                 } else if (rhsType.isLong()) {
 238                     literalNode = LiteralNode.newInstance(token, finish, rhs.getLong());
 239                 } else {
 240                     literalNode = LiteralNode.newInstance(token, finish, rhs.getNumber());
 241                 }
 242                 break;
 243             case SUB:
 244                 if (rhsInteger && rhs.getInt32() != 0) { // @see test/script/basic/minuszero.js
 245                     literalNode = LiteralNode.newInstance(token, finish, -rhs.getInt32());
 246                 } else if (rhsType.isLong() && rhs.getLong() != 0L) {
 247                     literalNode = LiteralNode.newInstance(token, finish, -rhs.getLong());
 248                 } else {
 249                     literalNode = LiteralNode.newInstance(token, finish, -rhs.getNumber());
 250                 }
 251                 break;
 252             case NOT:
 253                 literalNode = LiteralNode.newInstance(token, finish, !rhs.getBoolean());
 254                 break;
 255             case BIT_NOT:
 256                 literalNode = LiteralNode.newInstance(token, finish, ~rhs.getInt32());
 257                 break;
 258             default:
 259                 return null;
 260             }
 261 
 262             return literalNode;
 263         }
 264     }
 265 
 266     //TODO add AND and OR with one constant parameter (bitwise)
 267     private static class BinaryNodeConstantEvaluator extends ConstantEvaluator<BinaryNode> {


< prev index next >