diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java index 5b4dcc01bdc..e50addfb479 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/Def.java @@ -36,27 +36,27 @@ import java.util.stream.Stream; /** * Support for dynamic type (def). *

- * Dynamic types can invoke methods, load/store fields, and be passed as parameters to operators without - * compile-time type information. + * Dynamic types can invoke methods, load/store fields, and be passed as parameters to operators without + * compile-time type information. *

* Dynamic methods, loads, stores, and array/list/map load/stores involve locating the appropriate field * or method depending on the receiver's class. For these, we emit an {@code invokedynamic} instruction that, * for each new type encountered will query a corresponding {@code lookupXXX} method to retrieve the appropriate - * method. In most cases, the {@code lookupXXX} methods here will only be called once for a given call site, because - * caching ({@link DynamicCallSite}) generally works: usually all objects at any call site will be consistently - * the same type (or just a few types). In extreme cases, if there is type explosion, they may be called every + * method. In most cases, the {@code lookupXXX} methods here will only be called once for a given call site, because + * caching ({@link DynamicCallSite}) generally works: usually all objects at any call site will be consistently + * the same type (or just a few types). In extreme cases, if there is type explosion, they may be called every * single time, but simplicity is still more valuable than performance in this code. */ public class Def { - /** + /** * Looks up handle for a dynamic method call. *

* A dynamic method call for variable {@code x} of type {@code def} looks like: * {@code x.method(args...)} *

- * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) - * until it finds a matching whitelisted method. If one is not found, it throws an exception. + * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) + * until it finds a matching whitelisted method. If one is not found, it throws an exception. * Otherwise it returns a handle to the matching method. *

* @param receiverClass Class of the object to invoke the method on. @@ -117,7 +117,7 @@ public class Def { throw new AssertionError(e); } } - + // TODO: Once Java has a factory for those in java.lang.invoke.MethodHandles, use it: /** Helper class for isolating MethodHandles and methods to get the length of arrays @@ -126,7 +126,7 @@ public class Def { */ private static final class ArrayLengthHelper { private ArrayLengthHelper() {} - + private static final Lookup PRIV_LOOKUP = MethodHandles.lookup(); private static final Map,MethodHandle> ARRAY_TYPE_MH_MAPPING = Collections.unmodifiableMap( Stream.of(boolean[].class, byte[].class, short[].class, int[].class, long[].class, @@ -140,7 +140,7 @@ public class Def { })) ); private static final MethodHandle OBJECT_ARRAY_MH = ARRAY_TYPE_MH_MAPPING.get(Object[].class); - + static int getArrayLength(boolean[] array) { return array.length; } static int getArrayLength(byte[] array) { return array.length; } static int getArrayLength(short[] array) { return array.length; } @@ -150,7 +150,7 @@ public class Def { static int getArrayLength(float[] array) { return array.length; } static int getArrayLength(double[] array) { return array.length; } static int getArrayLength(Object[] array) { return array.length; } - + public static MethodHandle arrayLengthGetter(Class arrayType) { if (!arrayType.isArray()) { throw new IllegalArgumentException("type must be an array"); @@ -160,13 +160,13 @@ public class Def { OBJECT_ARRAY_MH.asType(OBJECT_ARRAY_MH.type().changeParameterType(0, arrayType)); } } - + /** Returns an array length getter MethodHandle for the given array type */ public static MethodHandle arrayLengthGetter(Class arrayType) { return ArrayLengthHelper.arrayLengthGetter(arrayType); } - - /** + + /** * Looks up handle for a dynamic field getter (field load) *

* A dynamic field load for variable {@code x} of type {@code def} looks like: @@ -182,8 +182,8 @@ public class Def { *

  • The value in a list at element {@code field} (integer) when the receiver is a List. * *

    - * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) - * until it finds a matching whitelisted getter. If one is not found, it throws an exception. + * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) + * until it finds a matching whitelisted getter. If one is not found, it throws an exception. * Otherwise it returns a handle to the matching getter. *

    * @param receiverClass Class of the object to retrieve the field from. @@ -229,17 +229,17 @@ public class Def { // parsing the same integer millions of times! try { int index = Integer.parseInt(name); - return MethodHandles.insertArguments(LIST_GET, 1, index); + return MethodHandles.insertArguments(LIST_GET, 1, index); } catch (NumberFormatException exception) { throw new IllegalArgumentException( "Illegal list shortcut value [" + name + "]."); } } - + throw new IllegalArgumentException("Unable to find dynamic field [" + name + "] " + "for class [" + receiverClass.getCanonicalName() + "]."); } - - /** + + /** * Looks up handle for a dynamic field setter (field store) *

    * A dynamic field store for variable {@code x} of type {@code def} looks like: @@ -253,8 +253,8 @@ public class Def { *

  • The value in a list at element {@code field} (integer) when the receiver is a List. * *

    - * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) - * until it finds a matching whitelisted setter. If one is not found, it throws an exception. + * This method traverses {@code recieverClass}'s class hierarchy (including interfaces) + * until it finds a matching whitelisted setter. If one is not found, it throws an exception. * Otherwise it returns a handle to the matching setter. *

    * @param receiverClass Class of the object to retrieve the field from. @@ -297,12 +297,12 @@ public class Def { // parsing the same integer millions of times! try { int index = Integer.parseInt(name); - return MethodHandles.insertArguments(LIST_SET, 1, index); + return MethodHandles.insertArguments(LIST_SET, 1, index); } catch (NumberFormatException exception) { throw new IllegalArgumentException( "Illegal list shortcut value [" + name + "]."); } } - + throw new IllegalArgumentException("Unable to find dynamic field [" + name + "] " + "for class [" + receiverClass.getCanonicalName() + "]."); } @@ -325,7 +325,7 @@ public class Def { throw new IllegalArgumentException("Attempting to address a non-array type " + "[" + receiverClass.getCanonicalName() + "] as an array."); } - + /** * Returns a method handle to do an array load. * @param receiverClass Class of the array to load the value from @@ -392,10 +392,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() * (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() * (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() * (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() * (char)right; } else { return ((Number)left).intValue() * (char)right; } @@ -404,10 +404,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left * ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left * ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left * ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left * ((Number)right).floatValue(); } else { return (char)left * ((Number)right).intValue(); } @@ -435,10 +435,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() / (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() / (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() / (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() / (char)right; } else { return ((Number)left).intValue() / (char)right; } @@ -447,10 +447,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left / ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left / ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left / ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left / ((Number)right).floatValue(); } else { return (char)left / ((Number)right).intValue(); } @@ -478,10 +478,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() % (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() % (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() % (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() % (char)right; } else { return ((Number)left).intValue() % (char)right; } @@ -490,10 +490,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left % ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left % ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left % ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left % ((Number)right).floatValue(); } else { return (char)left % ((Number)right).intValue(); } @@ -523,10 +523,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() + (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() + (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() + (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() + (char)right; } else { return ((Number)left).intValue() + (char)right; } @@ -535,10 +535,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left + ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left + ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left + ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left + ((Number)right).floatValue(); } else { return (char)left + ((Number)right).intValue(); } @@ -566,10 +566,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() - (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() - (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() - (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() - (char)right; } else { return ((Number)left).intValue() - (char)right; } @@ -578,10 +578,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left - ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left - ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left - ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left - ((Number)right).floatValue(); } else { return (char)left - ((Number)right).intValue(); } @@ -598,14 +598,14 @@ public class Def { if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() << ((Number)right).longValue(); } else { return ((Number)left).intValue() << ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() << (char)right; } else { return ((Number)left).intValue() << (char)right; @@ -613,7 +613,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (long)(char)left << ((Number)right).longValue(); } else { return (char)left << ((Number)right).intValue(); @@ -631,14 +631,14 @@ public class Def { if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() >> ((Number)right).longValue(); } else { return ((Number)left).intValue() >> ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() >> (char)right; } else { return ((Number)left).intValue() >> (char)right; @@ -646,7 +646,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (long)(char)left >> ((Number)right).longValue(); } else { return (char)left >> ((Number)right).intValue(); @@ -664,14 +664,14 @@ public class Def { if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() >>> ((Number)right).longValue(); } else { return ((Number)left).intValue() >>> ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() >>> (char)right; } else { return ((Number)left).intValue() >>> (char)right; @@ -679,7 +679,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (long)(char)left >>> ((Number)right).longValue(); } else { return (char)left >>> ((Number)right).intValue(); @@ -699,14 +699,14 @@ public class Def { } else if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() & ((Number)right).longValue(); } else { return ((Number)left).intValue() & ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() & (char)right; } else { return ((Number)left).intValue() & (char)right; @@ -714,7 +714,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (char)left & ((Number)right).longValue(); } else { return (char)left & ((Number)right).intValue(); @@ -734,14 +734,14 @@ public class Def { } else if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() ^ ((Number)right).longValue(); } else { return ((Number)left).intValue() ^ ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() ^ (char)right; } else { return ((Number)left).intValue() ^ (char)right; @@ -749,7 +749,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (char)left ^ ((Number)right).longValue(); } else { return (char)left ^ ((Number)right).intValue(); @@ -769,14 +769,14 @@ public class Def { } else if (left instanceof Number) { if (right instanceof Number) { if (left instanceof Double || right instanceof Double || - left instanceof Float || right instanceof Float || - left instanceof Long || right instanceof Long) { + left instanceof Long || right instanceof Long || + left instanceof Float || right instanceof Float) { return ((Number)left).longValue() | ((Number)right).longValue(); } else { return ((Number)left).intValue() | ((Number)right).intValue(); } } else if (right instanceof Character) { - if (left instanceof Double || left instanceof Float || left instanceof Long) { + if (left instanceof Double || left instanceof Long || left instanceof Float) { return ((Number)left).longValue() | (char)right; } else { return ((Number)left).intValue() | (char)right; @@ -784,7 +784,7 @@ public class Def { } } else if (left instanceof Character) { if (right instanceof Number) { - if (right instanceof Double || right instanceof Float || right instanceof Long) { + if (right instanceof Double || right instanceof Long || right instanceof Float) { return (char)left | ((Number)right).longValue(); } else { return (char)left | ((Number)right).intValue(); @@ -869,10 +869,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() < (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() < (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() < (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() < (char)right; } else { return ((Number)left).intValue() < (char)right; } @@ -881,10 +881,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left < ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left < ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left < ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left < ((Number)right).floatValue(); } else { return (char)left < ((Number)right).intValue(); } @@ -912,10 +912,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() <= (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() <= (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() <= (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() <= (char)right; } else { return ((Number)left).intValue() <= (char)right; } @@ -924,10 +924,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left <= ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left <= ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left <= ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left <= ((Number)right).floatValue(); } else { return (char)left <= ((Number)right).intValue(); } @@ -955,10 +955,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() > (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() > (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() > (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() > (char)right; } else { return ((Number)left).intValue() > (char)right; } @@ -967,10 +967,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left > ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left > ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left > ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left > ((Number)right).floatValue(); } else { return (char)left > ((Number)right).intValue(); } @@ -998,10 +998,10 @@ public class Def { } else if (right instanceof Character) { if (left instanceof Double) { return ((Number)left).doubleValue() >= (char)right; - } else if (left instanceof Float) { - return ((Number)left).floatValue() >= (char)right; } else if (left instanceof Long) { return ((Number)left).longValue() >= (char)right; + } else if (left instanceof Float) { + return ((Number)left).floatValue() >= (char)right; } else { return ((Number)left).intValue() >= (char)right; } @@ -1010,10 +1010,10 @@ public class Def { if (right instanceof Number) { if (right instanceof Double) { return (char)left >= ((Number)right).doubleValue(); - } else if (right instanceof Float) { - return (char)left >= ((Number)right).floatValue(); } else if (right instanceof Long) { return (char)left >= ((Number)right).longValue(); + } else if (right instanceof Float) { + return (char)left >= ((Number)right).floatValue(); } else { return (char)left >= ((Number)right).intValue(); }