--- old/src/jdk/nashorn/internal/ir/BinaryNode.java 2016-01-20 14:14:41.663064468 +0100 +++ new/src/jdk/nashorn/internal/ir/BinaryNode.java 2016-01-20 14:14:41.583064470 +0100 @@ -70,7 +70,9 @@ TokenType.ASSIGN_DIV, TokenType.ASSIGN_MOD, TokenType.ASSIGN_MUL, - TokenType.ASSIGN_SUB + TokenType.ASSIGN_SUB, + TokenType.SHR, + TokenType.ASSIGN_SHR }))); /** @@ -196,9 +198,7 @@ return Type.CHARSEQUENCE; } final Type widestOperandType = Type.widest(undefinedToNumber(booleanToInt(lhsType)), undefinedToNumber(booleanToInt(rhsType))); - if(widestOperandType == Type.INT) { - return Type.LONG; - } else if (widestOperandType.isNumeric()) { + if (widestOperandType.isNumeric()) { return Type.NUMBER; } // We pretty much can't know what it will be statically. Must presume OBJECT conservatively, as we can end @@ -210,7 +210,7 @@ } case SHR: case ASSIGN_SHR: - return Type.LONG; + return Type.NUMBER; case ASSIGN_SAR: case ASSIGN_SHL: case BIT_AND: @@ -239,10 +239,6 @@ if(lhsType == Type.BOOLEAN && rhsType == Type.BOOLEAN) { return Type.INT; } - final Type widestOperandType = Type.widest(booleanToInt(lhsType), booleanToInt(rhsType)); - if(widestOperandType == Type.INT) { - return Type.LONG; - } return Type.NUMBER; } case VOID: { @@ -565,6 +561,9 @@ if(type == null) { return widest; } + if (tokenType() == TokenType.ASSIGN_SHR || tokenType() == TokenType.SHR) { + return type; + } return Type.narrowest(widest, Type.widest(type, Type.widest(lhs.getType(), rhs.getType()))); }