--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Feb 13 17:00:45 2015 -0500
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Mon Feb 16 12:24:25 2015 +0000
@@ -82,6 +82,7 @@
final Log log;
final Symtab syms;
final Resolve rs;
+ final Operators operators;
final Infer infer;
final Analyzer analyzer;
final DeferredAttr deferredAttr;
@@ -115,6 +116,7 @@
log = Log.instance(context);
syms = Symtab.instance(context);
rs = Resolve.instance(context);
+ operators = Operators.instance(context);
chk = Check.instance(context);
flow = Flow.instance(context);
memberEnter = MemberEnter.instance(context);
@@ -1467,7 +1469,7 @@
* @param thentype The type of the expression's then-part.
* @param elsetype The type of the expression's else-part.
*/
- private Type condType(DiagnosticPosition pos,
+ Type condType(DiagnosticPosition pos,
Type thentype, Type elsetype) {
// If same type, that is the result
if (types.isSameType(thentype, elsetype))
@@ -2142,7 +2144,7 @@
JCTree.Tag optag = NULLCHK;
JCUnary tree = make.at(arg.pos).Unary(optag, arg);
- tree.operator = syms.nullcheck;
+ tree.operator = operators.resolveUnary(arg, optag, arg.type);
tree.type = arg.type;
return tree;
}
@@ -2903,18 +2905,10 @@
Type owntype = attribTree(tree.lhs, env, varAssignmentInfo);
Type operand = attribExpr(tree.rhs, env);
// Find operator.
- Symbol operator = tree.operator = rs.resolveBinaryOperator(
- tree.pos(), tree.getTag().noAssignOp(), env,
- owntype, operand);
-
+ Symbol operator = tree.operator = operators.resolveBinary(tree, tree.getTag().noAssignOp(), owntype, operand);
if (operator.kind == MTH &&
!owntype.isErroneous() &&
!operand.isErroneous()) {
- chk.checkOperator(tree.pos(),
- (OperatorSymbol)operator,
- tree.getTag().noAssignOp(),
- owntype,
- operand);
chk.checkDivZero(tree.rhs.pos(), operator, operand);
chk.checkCastable(tree.rhs.pos(),
operator.type.getReturnType(),
@@ -2930,9 +2924,7 @@
: chk.checkNonVoid(tree.arg.pos(), attribExpr(tree.arg, env));
// Find operator.
- Symbol operator = tree.operator =
- rs.resolveUnaryOperator(tree.pos(), tree.getTag(), env, argtype);
-
+ Symbol operator = tree.operator = operators.resolveUnary(tree, tree.getTag(), argtype);
Type owntype = types.createErrorType(tree.type);
if (operator.kind == MTH &&
!argtype.isErroneous()) {
@@ -2957,22 +2949,13 @@
Type left = chk.checkNonVoid(tree.lhs.pos(), attribExpr(tree.lhs, env));
Type right = chk.checkNonVoid(tree.lhs.pos(), attribExpr(tree.rhs, env));
// Find operator.
- Symbol operator = tree.operator =
- rs.resolveBinaryOperator(tree.pos(), tree.getTag(), env, left, right);
-
+ Symbol operator = tree.operator = operators.resolveBinary(tree, tree.getTag(), left, right);
Type owntype = types.createErrorType(tree.type);
if (operator.kind == MTH &&
!left.isErroneous() &&
!right.isErroneous()) {
owntype = operator.type.getReturnType();
- // This will figure out when unboxing can happen and
- // choose the right comparison operator.
- int opc = chk.checkOperator(tree.lhs.pos(),
- (OperatorSymbol)operator,
- tree.getTag(),
- left,
- right);
-
+ int opc = ((OperatorSymbol)operator).opcode;
// If both arguments are constants, fold them.
if (left.constValue() != null && right.constValue() != null) {
Type ctype = cfolder.fold2(opc, left, right);
@@ -2985,8 +2968,7 @@
// castable to each other, (JLS 15.21). Note: unboxing
// comparisons will not have an acmp* opc at this point.
if ((opc == ByteCodes.if_acmpeq || opc == ByteCodes.if_acmpne)) {
- if (!types.isEqualityComparable(left, right,
- new Warner(tree.pos()))) {
+ if (!types.isCastable(left, right, new Warner(tree.pos()))) {
log.error(tree.pos(), "incomparable.types", left, right);
}
}