214 215 @Override 216 protected LiteralNode<?> eval() { 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 } | 214 215 @Override 216 protected LiteralNode<?> eval() { 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 POS: 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 NEG: 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 } |