Fixed bugs in comparison with Def. Fixed may tests.n
This commit is contained in:
parent
64e2ef5807
commit
4e454439bb
|
@ -633,7 +633,7 @@ public final class AnalyzerCaster {
|
||||||
case LONG:
|
case LONG:
|
||||||
case FLOAT:
|
case FLOAT:
|
||||||
case DOUBLE:
|
case DOUBLE:
|
||||||
return new Cast(actual, expected, true, true, false, false, false);
|
return new Cast(actual, expected, explicit, true, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -649,8 +649,9 @@ public final class AnalyzerCaster {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expected.clazz.isAssignableFrom(actual.clazz) ||
|
if (actual.sort == Sort.DEF || expected.sort == Sort.DEF ||
|
||||||
((explicit || expected.sort == Sort.DEF) && actual.clazz.isAssignableFrom(expected.clazz))) {
|
expected.clazz.isAssignableFrom(actual.clazz) ||
|
||||||
|
explicit && actual.clazz.isAssignableFrom(expected.clazz)) {
|
||||||
return new Cast(actual, expected, explicit);
|
return new Cast(actual, expected, explicit);
|
||||||
} else {
|
} else {
|
||||||
throw new ClassCastException("Error" + location + ": Cannot cast from [" + actual.name + "] to [" + expected.name + "].");
|
throw new ClassCastException("Error" + location + ": Cannot cast from [" + actual.name + "] to [" + expected.name + "].");
|
||||||
|
|
|
@ -25,442 +25,10 @@ package org.elasticsearch.painless;
|
||||||
*/
|
*/
|
||||||
public class Utility {
|
public class Utility {
|
||||||
|
|
||||||
public static boolean NumberToboolean(final Number value) {
|
|
||||||
return value.longValue() != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char NumberTochar(final Number value) {
|
|
||||||
return (char)value.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean NumberToBoolean(final Number value) {
|
|
||||||
return value.longValue() != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte NumberToByte(final Number value) {
|
|
||||||
return value == null ? null : value.byteValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short NumberToShort(final Number value) {
|
|
||||||
return value == null ? null : value.shortValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character NumberToCharacter(final Number value) {
|
|
||||||
return value == null ? null : (char)value.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer NumberToInteger(final Number value) {
|
|
||||||
return value == null ? null : value.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long NumberToLong(final Number value) {
|
|
||||||
return value == null ? null : value.longValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float NumberToFloat(final Number value) {
|
|
||||||
return value == null ? null : value.floatValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double NumberToDouble(final Number value) {
|
|
||||||
return value == null ? null : value.doubleValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte booleanTobyte(final boolean value) {
|
|
||||||
return (byte)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static short booleanToshort(final boolean value) {
|
|
||||||
return (short)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char booleanTochar(final boolean value) {
|
|
||||||
return (char)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int booleanToint(final boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long booleanTolong(final boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float booleanTofloat(final boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double booleanTodouble(final boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer booleanToInteger(final boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte BooleanTobyte(final Boolean value) {
|
|
||||||
return (byte)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static short BooleanToshort(final Boolean value) {
|
|
||||||
return (short)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char BooleanTochar(final Boolean value) {
|
|
||||||
return (char)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int BooleanToint(final Boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long BooleanTolong(final Boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float BooleanTofloat(final Boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double BooleanTodouble(final Boolean value) {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte BooleanToByte(final Boolean value) {
|
|
||||||
return value == null ? null : (byte)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short BooleanToShort(final Boolean value) {
|
|
||||||
return value == null ? null : (short)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character BooleanToCharacter(final Boolean value) {
|
|
||||||
return value == null ? null : (char)(value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer BooleanToInteger(final Boolean value) {
|
|
||||||
return value == null ? null : value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long BooleanToLong(final Boolean value) {
|
|
||||||
return value == null ? null : value ? 1L : 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float BooleanToFloat(final Boolean value) {
|
|
||||||
return value == null ? null : value ? 1F : 0F;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double BooleanToDouble(final Boolean value) {
|
|
||||||
return value == null ? null : value ? 1D : 0D;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean byteToboolean(final byte value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short byteToShort(final byte value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character byteToCharacter(final byte value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer byteToInteger(final byte value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long byteToLong(final byte value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float byteToFloat(final byte value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double byteToDouble(final byte value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean ByteToboolean(final Byte value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char ByteTochar(final Byte value) {
|
|
||||||
return (char)value.byteValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean shortToboolean(final short value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte shortToByte(final short value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character shortToCharacter(final short value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer shortToInteger(final short value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long shortToLong(final short value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float shortToFloat(final short value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double shortToDouble(final short value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean ShortToboolean(final Short value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char ShortTochar(final Short value) {
|
|
||||||
return (char)value.shortValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean charToboolean(final char value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte charToByte(final char value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short charToShort(final char value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer charToInteger(final char value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long charToLong(final char value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float charToFloat(final char value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double charToDouble(final char value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String charToString(final char value) {
|
public static String charToString(final char value) {
|
||||||
return String.valueOf(value);
|
return String.valueOf(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean CharacterToboolean(final Character value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte CharacterTobyte(final Character value) {
|
|
||||||
return (byte)value.charValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static short CharacterToshort(final Character value) {
|
|
||||||
return (short)value.charValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int CharacterToint(final Character value) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long CharacterTolong(final Character value) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float CharacterTofloat(final Character value) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double CharacterTodouble(final Character value) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean CharacterToBoolean(final Character value) {
|
|
||||||
return value == null ? null : value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte CharacterToByte(final Character value) {
|
|
||||||
return value == null ? null : (byte)value.charValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short CharacterToShort(final Character value) {
|
|
||||||
return value == null ? null : (short)value.charValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer CharacterToInteger(final Character value) {
|
|
||||||
return value == null ? null : (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long CharacterToLong(final Character value) {
|
|
||||||
return value == null ? null : (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float CharacterToFloat(final Character value) {
|
|
||||||
return value == null ? null : (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double CharacterToDouble(final Character value) {
|
|
||||||
return value == null ? null : (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String CharacterToString(final Character value) {
|
|
||||||
return value == null ? null : value.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean intToboolean(final int value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte intToByte(final int value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short intToShort(final int value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character intToCharacter(final int value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long intToLong(final int value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float intToFloat(final int value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double intToDouble(final int value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean IntegerToboolean(final Integer value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char IntegerTochar(final Integer value) {
|
|
||||||
return (char)value.intValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean longToboolean(final long value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte longToByte(final long value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short longToShort(final long value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character longToCharacter(final long value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer longToInteger(final long value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float longToFloat(final long value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double longToDouble(final long value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean LongToboolean(final Long value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char LongTochar(final Long value) {
|
|
||||||
return (char)value.longValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean floatToboolean(final float value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte floatToByte(final float value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short floatToShort(final float value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character floatToCharacter(final float value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer floatToInteger(final float value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long floatToLong(final float value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Double floatToDouble(final float value) {
|
|
||||||
return (double)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean FloatToboolean(final Float value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char FloatTochar(final Float value) {
|
|
||||||
return (char)value.floatValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean doubleToboolean(final double value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Byte doubleToByte(final double value) {
|
|
||||||
return (byte)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Short doubleToShort(final double value) {
|
|
||||||
return (short)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Character doubleToCharacter(final double value) {
|
|
||||||
return (char)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer doubleToInteger(final double value) {
|
|
||||||
return (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Long doubleToLong(final double value) {
|
|
||||||
return (long)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Float doubleToFloat(final double value) {
|
|
||||||
return (float)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean DoubleToboolean(final Double value) {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char DoubleTochar(final Double value) {
|
|
||||||
return (char)value.doubleValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static char StringTochar(final String value) {
|
public static char StringTochar(final String value) {
|
||||||
if (value.length() != 1) {
|
if (value.length() != 1) {
|
||||||
throw new ClassCastException("Cannot cast [String] with length greater than one to [char].");
|
throw new ClassCastException("Cannot cast [String] with length greater than one to [char].");
|
||||||
|
|
|
@ -66,7 +66,6 @@ public final class WriterConstants {
|
||||||
new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(DefBootstrap.class),
|
new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(DefBootstrap.class),
|
||||||
"bootstrap", DEF_BOOTSTRAP_TYPE.toMethodDescriptorString());
|
"bootstrap", DEF_BOOTSTRAP_TYPE.toMethodDescriptorString());
|
||||||
|
|
||||||
|
|
||||||
public final static Type DEF_TYPE = Type.getType(Def.class);
|
public final static Type DEF_TYPE = Type.getType(Def.class);
|
||||||
public final static Method DEF_TO_BOOLEAN = getAsmMethod(boolean.class, "DefToboolean" , Object.class);
|
public final static Method DEF_TO_BOOLEAN = getAsmMethod(boolean.class, "DefToboolean" , Object.class);
|
||||||
public final static Method DEF_TO_BYTE_IMPLICIT = getAsmMethod(byte.class , "DefTobyteImplicit" , Object.class);
|
public final static Method DEF_TO_BYTE_IMPLICIT = getAsmMethod(byte.class , "DefTobyteImplicit" , Object.class);
|
||||||
|
|
|
@ -35,6 +35,8 @@ import static org.elasticsearch.painless.WriterConstants.DEF_GTE_CALL;
|
||||||
import static org.elasticsearch.painless.WriterConstants.DEF_GT_CALL;
|
import static org.elasticsearch.painless.WriterConstants.DEF_GT_CALL;
|
||||||
import static org.elasticsearch.painless.WriterConstants.DEF_LTE_CALL;
|
import static org.elasticsearch.painless.WriterConstants.DEF_LTE_CALL;
|
||||||
import static org.elasticsearch.painless.WriterConstants.DEF_LT_CALL;
|
import static org.elasticsearch.painless.WriterConstants.DEF_LT_CALL;
|
||||||
|
import static org.elasticsearch.painless.WriterConstants.DEF_TYPE;
|
||||||
|
import static org.elasticsearch.painless.WriterConstants.UTILITY_TYPE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a comparison expression.
|
* Represents a comparison expression.
|
||||||
|
@ -455,34 +457,37 @@ public final class EComp extends AExpression {
|
||||||
if (eq) {
|
if (eq) {
|
||||||
if (right.isNull) {
|
if (right.isNull) {
|
||||||
adapter.ifNull(jump);
|
adapter.ifNull(jump);
|
||||||
} else if (!left.isNull && operation == Operation.EQ) {
|
} else if (!left.isNull && (operation == Operation.EQ || operation == Operation.NE)) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_EQ_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_EQ_CALL);
|
||||||
|
writejump = false;
|
||||||
} else {
|
} else {
|
||||||
adapter.ifCmp(rtype, MethodWriter.EQ, jump);
|
adapter.ifCmp(rtype, MethodWriter.EQ, jump);
|
||||||
}
|
}
|
||||||
} else if (ne) {
|
} else if (ne) {
|
||||||
if (right.isNull) {
|
if (right.isNull) {
|
||||||
adapter.ifNonNull(jump);
|
adapter.ifNonNull(jump);
|
||||||
} else if (!left.isNull && operation == Operation.NE) {
|
} else if (!left.isNull && (operation == Operation.EQ || operation == Operation.NE)) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_EQ_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_EQ_CALL);
|
||||||
adapter.ifZCmp(MethodWriter.EQ, jump);
|
adapter.ifZCmp(MethodWriter.EQ, jump);
|
||||||
} else {
|
} else {
|
||||||
adapter.ifCmp(rtype, MethodWriter.NE, jump);
|
adapter.ifCmp(rtype, MethodWriter.NE, jump);
|
||||||
}
|
}
|
||||||
} else if (lt) {
|
} else if (lt) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_LT_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_LT_CALL);
|
||||||
|
writejump = false;
|
||||||
} else if (lte) {
|
} else if (lte) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_LTE_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_LTE_CALL);
|
||||||
|
writejump = false;
|
||||||
} else if (gt) {
|
} else if (gt) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_GT_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_GT_CALL);
|
||||||
|
writejump = false;
|
||||||
} else if (gte) {
|
} else if (gte) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_GTE_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_GTE_CALL);
|
||||||
|
writejump = false;
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException(error("Illegal tree structure."));
|
throw new IllegalStateException(error("Illegal tree structure."));
|
||||||
}
|
}
|
||||||
|
|
||||||
writejump = left.isNull || ne || operation == Operation.EQR;
|
|
||||||
|
|
||||||
if (branch && !writejump) {
|
if (branch && !writejump) {
|
||||||
adapter.ifZCmp(MethodWriter.NE, jump);
|
adapter.ifZCmp(MethodWriter.NE, jump);
|
||||||
}
|
}
|
||||||
|
@ -492,8 +497,8 @@ public final class EComp extends AExpression {
|
||||||
if (eq) {
|
if (eq) {
|
||||||
if (right.isNull) {
|
if (right.isNull) {
|
||||||
adapter.ifNull(jump);
|
adapter.ifNull(jump);
|
||||||
} else if (operation == Operation.EQ) {
|
} else if (operation == Operation.EQ || operation == Operation.NE) {
|
||||||
adapter.invokeStatic(definition.getType("Utility").type, CHECKEQUALS);
|
adapter.invokeStatic(UTILITY_TYPE, CHECKEQUALS);
|
||||||
|
|
||||||
if (branch) {
|
if (branch) {
|
||||||
adapter.ifZCmp(MethodWriter.NE, jump);
|
adapter.ifZCmp(MethodWriter.NE, jump);
|
||||||
|
@ -506,8 +511,8 @@ public final class EComp extends AExpression {
|
||||||
} else if (ne) {
|
} else if (ne) {
|
||||||
if (right.isNull) {
|
if (right.isNull) {
|
||||||
adapter.ifNonNull(jump);
|
adapter.ifNonNull(jump);
|
||||||
} else if (operation == Operation.NE) {
|
} else if (operation == Operation.EQ || operation == Operation.NE) {
|
||||||
adapter.invokeStatic(definition.getType("Utility").type, CHECKEQUALS);
|
adapter.invokeStatic(UTILITY_TYPE, CHECKEQUALS);
|
||||||
adapter.ifZCmp(MethodWriter.EQ, jump);
|
adapter.ifZCmp(MethodWriter.EQ, jump);
|
||||||
} else {
|
} else {
|
||||||
adapter.ifCmp(rtype, MethodWriter.NE, jump);
|
adapter.ifCmp(rtype, MethodWriter.NE, jump);
|
||||||
|
|
|
@ -61,6 +61,7 @@ public final class EExplicit extends AExpression {
|
||||||
AExpression cast(final CompilerSettings settings, final Definition definition, final Variables variables) {
|
AExpression cast(final CompilerSettings settings, final Definition definition, final Variables variables) {
|
||||||
child.expected = expected;
|
child.expected = expected;
|
||||||
child.explicit = explicit;
|
child.explicit = explicit;
|
||||||
|
child.internal = internal;
|
||||||
|
|
||||||
return child.cast(settings, definition, variables);
|
return child.cast(settings, definition, variables);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.elasticsearch.painless.MethodWriter;
|
||||||
|
|
||||||
import static org.elasticsearch.painless.WriterConstants.DEF_NEG_CALL;
|
import static org.elasticsearch.painless.WriterConstants.DEF_NEG_CALL;
|
||||||
import static org.elasticsearch.painless.WriterConstants.DEF_NOT_CALL;
|
import static org.elasticsearch.painless.WriterConstants.DEF_NOT_CALL;
|
||||||
|
import static org.elasticsearch.painless.WriterConstants.DEF_TYPE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a unary math expression.
|
* Represents a unary math expression.
|
||||||
|
@ -191,7 +192,7 @@ public final class EUnary extends AExpression {
|
||||||
|
|
||||||
if (operation == Operation.BWNOT) {
|
if (operation == Operation.BWNOT) {
|
||||||
if (sort == Sort.DEF) {
|
if (sort == Sort.DEF) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_NOT_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_NOT_CALL);
|
||||||
} else {
|
} else {
|
||||||
if (sort == Sort.INT) {
|
if (sort == Sort.INT) {
|
||||||
adapter.push(-1);
|
adapter.push(-1);
|
||||||
|
@ -205,7 +206,7 @@ public final class EUnary extends AExpression {
|
||||||
}
|
}
|
||||||
} else if (operation == Operation.SUB) {
|
} else if (operation == Operation.SUB) {
|
||||||
if (sort == Sort.DEF) {
|
if (sort == Sort.DEF) {
|
||||||
adapter.invokeStatic(definition.getType("Def").type, DEF_NEG_CALL);
|
adapter.invokeStatic(DEF_TYPE, DEF_NEG_CALL);
|
||||||
} else {
|
} else {
|
||||||
adapter.math(MethodWriter.NEG, type);
|
adapter.math(MethodWriter.NEG, type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,8 @@ public class ConditionalTests extends ScriptTestCase {
|
||||||
|
|
||||||
public void testPromotion() {
|
public void testPromotion() {
|
||||||
assertEquals(false, exec("boolean x = false; boolean y = true; return (x ? 2 : 4.0F) == (y ? 2 : 4.0F);"));
|
assertEquals(false, exec("boolean x = false; boolean y = true; return (x ? 2 : 4.0F) == (y ? 2 : 4.0F);"));
|
||||||
assertEquals(false, exec("boolean x = false; boolean y = true; return (x ? 2 : 4.0F) == (y ? new HashMap() : new ArrayList());"));
|
assertEquals(false, exec("boolean x = false; boolean y = true; " +
|
||||||
|
"return (x ? new HashMap() : new ArrayList()) == (y ? new HashMap() : new ArrayList());"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIncompatibleAssignment() {
|
public void testIncompatibleAssignment() {
|
||||||
|
|
|
@ -22,10 +22,10 @@ package org.elasticsearch.painless;
|
||||||
public class DefOperationTests extends ScriptTestCase {
|
public class DefOperationTests extends ScriptTestCase {
|
||||||
public void testIllegalCast() {
|
public void testIllegalCast() {
|
||||||
Exception exception = expectThrows(ClassCastException.class, () -> exec("def x = 1.0; int y = x; return y;"));
|
Exception exception = expectThrows(ClassCastException.class, () -> exec("def x = 1.0; int y = x; return y;"));
|
||||||
assertTrue(exception.getMessage().contains("java.lang.double cannot be cast to java.lang.int"));
|
assertTrue(exception.getMessage().contains("cannot be cast"));
|
||||||
|
|
||||||
exception = expectThrows(ClassCastException.class, () -> exec("def x = (short)1; byte y = x; return y;"));
|
exception = expectThrows(ClassCastException.class, () -> exec("def x = (short)1; byte y = x; return y;"));
|
||||||
assertTrue(exception.getMessage().contains("java.lang.short cannot be cast to java.lang.byte"));
|
assertTrue(exception.getMessage().contains("cannot be cast"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNot() {
|
public void testNot() {
|
||||||
|
@ -799,7 +799,7 @@ public class DefOperationTests extends ScriptTestCase {
|
||||||
assertEquals(false, exec("def x = (byte)7; def y = (int)7; return x === y"));
|
assertEquals(false, exec("def x = (byte)7; def y = (int)7; return x === y"));
|
||||||
assertEquals(false, exec("def x = (short)6; def y = (int)6; return x === y"));
|
assertEquals(false, exec("def x = (short)6; def y = (int)6; return x === y"));
|
||||||
assertEquals(false, exec("def x = (char)5; def y = (int)5; return x === y"));
|
assertEquals(false, exec("def x = (char)5; def y = (int)5; return x === y"));
|
||||||
assertEquals(true, exec("def x = (int)4; def y = (int)4; return x === y"));
|
assertEquals(false, exec("def x = (int)4; def y = (int)4; return x === y"));
|
||||||
assertEquals(false, exec("def x = (long)5; def y = (int)3; return x === y"));
|
assertEquals(false, exec("def x = (long)5; def y = (int)3; return x === y"));
|
||||||
assertEquals(false, exec("def x = (float)6; def y = (int)2; return x === y"));
|
assertEquals(false, exec("def x = (float)6; def y = (int)2; return x === y"));
|
||||||
assertEquals(false, exec("def x = (double)7; def y = (int)1; return x === y"));
|
assertEquals(false, exec("def x = (double)7; def y = (int)1; return x === y"));
|
||||||
|
@ -837,7 +837,7 @@ public class DefOperationTests extends ScriptTestCase {
|
||||||
assertEquals(true, exec("def x = (byte)7; def y = (int)7; return x !== y"));
|
assertEquals(true, exec("def x = (byte)7; def y = (int)7; return x !== y"));
|
||||||
assertEquals(true, exec("def x = (short)6; def y = (int)6; return x !== y"));
|
assertEquals(true, exec("def x = (short)6; def y = (int)6; return x !== y"));
|
||||||
assertEquals(true, exec("def x = (char)5; def y = (int)5; return x !== y"));
|
assertEquals(true, exec("def x = (char)5; def y = (int)5; return x !== y"));
|
||||||
assertEquals(false, exec("def x = (int)4; def y = (int)4; return x !== y"));
|
assertEquals(true, exec("def x = (int)4; def y = (int)4; return x !== y"));
|
||||||
assertEquals(true, exec("def x = (long)5; def y = (int)3; return x !== y"));
|
assertEquals(true, exec("def x = (long)5; def y = (int)3; return x !== y"));
|
||||||
assertEquals(true, exec("def x = (float)6; def y = (int)2; return x !== y"));
|
assertEquals(true, exec("def x = (float)6; def y = (int)2; return x !== y"));
|
||||||
assertEquals(true, exec("def x = (double)7; def y = (int)1; return x !== y"));
|
assertEquals(true, exec("def x = (double)7; def y = (int)1; return x !== y"));
|
||||||
|
|
|
@ -94,17 +94,8 @@ public class EqualsTests extends ScriptTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testEquals() {
|
public void testEquals() {
|
||||||
assertEquals(true, exec("return Long.valueOf(3) == 3L;"));
|
assertEquals(true, exec("return 3 == 3;"));
|
||||||
assertEquals(false, exec("return new Long(3) === new Long(3);"));
|
assertEquals(false, exec("int x = 4; int y = 5; x == y"));
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); Object y = x; return x == y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); Object y = x; return x === y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); Object y = new Integer(3); return x == y;"));
|
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); Object y = new Integer(3); return x === y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); int y = 3; return x == y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); short y = 3; return x == y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); Short y = (short)3; return x == y;"));
|
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); int y = 3; return x === y;"));
|
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); double y = 3; return x === y;"));
|
|
||||||
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x == y;"));
|
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x == y;"));
|
||||||
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x === y;"));
|
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x === y;"));
|
||||||
assertEquals(false, exec("int[] x = new int[1]; Object y = new int[1]; return x == y;"));
|
assertEquals(false, exec("int[] x = new int[1]; Object y = new int[1]; return x == y;"));
|
||||||
|
@ -114,14 +105,8 @@ public class EqualsTests extends ScriptTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNotEquals() {
|
public void testNotEquals() {
|
||||||
assertEquals(false, exec("return new Long(3) != new Long(3);"));
|
assertEquals(false, exec("return 3 != 3;"));
|
||||||
assertEquals(true, exec("return new Long(3) !== new Long(3);"));
|
assertEquals(true, exec("int x = 4; int y = 5; x != y"));
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); Object y = x; return x != y;"));
|
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); Object y = x; return x !== y;"));
|
|
||||||
assertEquals(false, exec("Integer x = new Integer(3); Object y = new Integer(3); return x != y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); Object y = new Integer(3); return x !== y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); int y = 3; return x !== y;"));
|
|
||||||
assertEquals(true, exec("Integer x = new Integer(3); double y = 3; return x !== y;"));
|
|
||||||
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x != y;"));
|
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x != y;"));
|
||||||
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x !== y;"));
|
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x !== y;"));
|
||||||
assertEquals(true, exec("int[] x = new int[1]; Object y = new int[1]; return x != y;"));
|
assertEquals(true, exec("int[] x = new int[1]; Object y = new int[1]; return x != y;"));
|
||||||
|
@ -131,54 +116,36 @@ public class EqualsTests extends ScriptTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBranchEquals() {
|
public void testBranchEquals() {
|
||||||
assertEquals(0, exec("Character a = (char)'a'; Character b = (char)'b'; if (a == b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = (char)'a'; def b = (char)'b'; if (a == b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("Character a = (char)'a'; Character b = (char)'a'; if (a == b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = (char)'a'; def b = (char)'a'; if (a == b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("Integer a = new Integer(1); Integer b = 1; if (a === b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = 1; def b = 1; if (a === b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("Character a = (char)'a'; Character b = new Character((char)'a'); if (a === b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a === b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("Character a = (char)'a'; Object b = a; if (a === b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = (char)'a'; Object b = a; if (a === b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("Integer a = 1; Number b = a; Number c = a; if (c === b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = 1; Number b = a; Number c = a; if (c === b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("Integer a = 1; Character b = (char)'a'; if (a === (Object)b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = 1; Object b = new HashMap(); if (a === (Object)b) return 1; else return 0;"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBranchNotEquals() {
|
public void testBranchNotEquals() {
|
||||||
assertEquals(1, exec("Character a = (char)'a'; Character b = (char)'b'; if (a != b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = (char)'a'; def b = (char)'b'; if (a != b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("Character a = (char)'a'; Character b = (char)'a'; if (a != b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a != b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("def a = 1; def b = 1; if (a !== b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = 1; def b = 1; if (a !== b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("def a = (char)'a'; Character b = new Character((char)'a'); if (a !== b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = (char)'a'; def b = (char)'a'; if (a !== b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("def a = (char)'a'; Object b = a; if (a !== b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = (char)'a'; Object b = a; if (a !== b) return 1; else return 0;"));
|
||||||
assertEquals(0, exec("def a = 1; Number b = a; Number c = a; if (c !== b) return 1; else return 0;"));
|
assertEquals(0, exec("def a = 1; Number b = a; Number c = a; if (c !== b) return 1; else return 0;"));
|
||||||
assertEquals(1, exec("def a = 1; Character b = (char)'a'; if (a !== (Object)b) return 1; else return 0;"));
|
assertEquals(1, exec("def a = 1; Object b = new HashMap(); if (a !== (Object)b) return 1; else return 0;"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRightHandNull() {
|
public void testRightHandNull() {
|
||||||
assertEquals(false, exec("Character a = (char)'a'; return a == null;"));
|
assertEquals(false, exec("HashMap a = new HashMap(); return a == null;"));
|
||||||
assertEquals(false, exec("Character a = (char)'a'; return a === null;"));
|
assertEquals(false, exec("HashMap a = new HashMap(); return a === null;"));
|
||||||
assertEquals(true, exec("Character a = (char)'a'; return a != null;"));
|
assertEquals(true, exec("HashMap a = new HashMap(); return a != null;"));
|
||||||
assertEquals(true, exec("Character a = (char)'a'; return a !== null;"));
|
assertEquals(true, exec("HashMap a = new HashMap(); return a !== null;"));
|
||||||
assertEquals(true, exec("Character a = null; return a == null;"));
|
|
||||||
assertEquals(false, exec("Character a = null; return a != null;"));
|
|
||||||
assertEquals(false, exec("Character a = (char)'a'; Character b = null; return a == b;"));
|
|
||||||
assertEquals(true, exec("Character a = null; Character b = null; return a === b;"));
|
|
||||||
assertEquals(true, exec("Character a = (char)'a'; Character b = null; return a != b;"));
|
|
||||||
assertEquals(false, exec("Character a = null; Character b = null; return a !== b;"));
|
|
||||||
assertEquals(false, exec("Integer x = null; double y = 2.0; return x == y;"));
|
|
||||||
assertEquals(true, exec("Integer x = null; Short y = null; return x == y;"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLeftHandNull() {
|
public void testLeftHandNull() {
|
||||||
assertEquals(false, exec("Character a = (char)'a'; return null == a;"));
|
assertEquals(false, exec("HashMap a = new HashMap(); return null == a;"));
|
||||||
assertEquals(false, exec("Character a = (char)'a'; return null === a;"));
|
assertEquals(false, exec("HashMap a = new HashMap(); return null === a;"));
|
||||||
assertEquals(true, exec("Character a = (char)'a'; return null != a;"));
|
assertEquals(true, exec("HashMap a = new HashMap(); return null != a;"));
|
||||||
assertEquals(true, exec("Character a = (char)'a'; return null !== a;"));
|
assertEquals(true, exec("HashMap a = new HashMap(); return null !== a;"));
|
||||||
assertEquals(true, exec("Character a = null; return null == a;"));
|
|
||||||
assertEquals(false, exec("Character a = null; return null != a;"));
|
|
||||||
assertEquals(false, exec("Character a = null; Character b = (char)'a'; return a == b;"));
|
|
||||||
assertEquals(true, exec("Character a = null; Character b = null; return a == b;"));
|
|
||||||
assertEquals(true, exec("Character a = null; Character b = null; return b === a;"));
|
|
||||||
assertEquals(true, exec("Character a = null; Character b = (char)'a'; return a != b;"));
|
|
||||||
assertEquals(false, exec("Character a = null; Character b = null; return b != a;"));
|
|
||||||
assertEquals(false, exec("Character a = null; Character b = null; return b !== a;"));
|
|
||||||
assertEquals(false, exec("Integer x = null; double y = 2.0; return y == x;"));
|
|
||||||
assertEquals(true, exec("Integer x = null; Short y = null; return y == x;"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,14 +166,14 @@ public class StringTests extends ScriptTestCase {
|
||||||
assertEquals("cc", exec("return (String)(char)\"cc\""));
|
assertEquals("cc", exec("return (String)(char)\"cc\""));
|
||||||
fail();
|
fail();
|
||||||
} catch (final ClassCastException cce) {
|
} catch (final ClassCastException cce) {
|
||||||
assertTrue(cce.getMessage().contains("Cannot cast from [String] to [char]."));
|
assertTrue(cce.getMessage().contains("Cannot cast [String] with length greater than one to [char]."));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
assertEquals("cc", exec("return (String)(char)'cc'"));
|
assertEquals("cc", exec("return (String)(char)'cc'"));
|
||||||
fail();
|
fail();
|
||||||
} catch (final ClassCastException cce) {
|
} catch (final ClassCastException cce) {
|
||||||
assertTrue(cce.getMessage().contains("Cannot cast from [String] to [char]."));
|
assertTrue(cce.getMessage().contains("Cannot cast [String] with length greater than one to [char]."));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue