Painless: Special Case def (#32871)
This removes def from the classes map in PainlessLookup and instead always special cases it. This prevents potential calls against the def type that shouldn't be made and forces all cases of def throughout Painless code to be special cased.
This commit is contained in:
parent
eaaf37a1f9
commit
d9fd74bcdc
|
@ -21,6 +21,7 @@ package org.elasticsearch.painless;
|
|||
|
||||
import org.elasticsearch.painless.lookup.PainlessLookup;
|
||||
import org.elasticsearch.painless.lookup.PainlessLookupUtility;
|
||||
import org.elasticsearch.painless.lookup.def;
|
||||
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Field;
|
||||
|
@ -190,7 +191,7 @@ public class ScriptClassInfo {
|
|||
componentType = componentType.getComponentType();
|
||||
}
|
||||
|
||||
if (painlessLookup.lookupPainlessClass(componentType) == null) {
|
||||
if (componentType != def.class && painlessLookup.lookupPainlessClass(componentType) == null) {
|
||||
throw new IllegalArgumentException(unknownErrorMessageSource.apply(componentType));
|
||||
}
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Objects;
|
|||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.DEF_CLASS_NAME;
|
||||
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessConstructorKey;
|
||||
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessFieldKey;
|
||||
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessMethodKey;
|
||||
|
@ -47,7 +48,7 @@ public final class PainlessLookup {
|
|||
public boolean isValidCanonicalClassName(String canonicalClassName) {
|
||||
Objects.requireNonNull(canonicalClassName);
|
||||
|
||||
return canonicalClassNamesToClasses.containsKey(canonicalClassName);
|
||||
return DEF_CLASS_NAME.equals(canonicalClassName) || canonicalClassNamesToClasses.containsKey(canonicalClassName);
|
||||
}
|
||||
|
||||
public Class<?> canonicalTypeNameToType(String canonicalTypeName) {
|
||||
|
|
|
@ -211,9 +211,6 @@ public final class PainlessLookupBuilder {
|
|||
public PainlessLookupBuilder() {
|
||||
canonicalClassNamesToClasses = new HashMap<>();
|
||||
classesToPainlessClassBuilders = new HashMap<>();
|
||||
|
||||
canonicalClassNamesToClasses.put(DEF_CLASS_NAME, def.class);
|
||||
classesToPainlessClassBuilders.put(def.class, new PainlessClassBuilder());
|
||||
}
|
||||
|
||||
private Class<?> canonicalTypeNameToType(String canonicalTypeName) {
|
||||
|
@ -225,7 +222,7 @@ public final class PainlessLookupBuilder {
|
|||
type = type.getComponentType();
|
||||
}
|
||||
|
||||
return classesToPainlessClassBuilders.containsKey(type);
|
||||
return type == def.class || classesToPainlessClassBuilders.containsKey(type);
|
||||
}
|
||||
|
||||
public void addPainlessClass(ClassLoader classLoader, String javaClassName, boolean importClassName) {
|
||||
|
|
|
@ -82,7 +82,7 @@ public final class PainlessLookupUtility {
|
|||
Objects.requireNonNull(canonicalTypeName);
|
||||
Objects.requireNonNull(canonicalClassNamesToClasses);
|
||||
|
||||
Class<?> type = canonicalClassNamesToClasses.get(canonicalTypeName);
|
||||
Class<?> type = DEF_CLASS_NAME.equals(canonicalTypeName) ? def.class : canonicalClassNamesToClasses.get(canonicalTypeName);
|
||||
|
||||
if (type != null) {
|
||||
return type;
|
||||
|
@ -105,7 +105,7 @@ public final class PainlessLookupUtility {
|
|||
}
|
||||
|
||||
canonicalTypeName = canonicalTypeName.substring(0, canonicalTypeName.indexOf('['));
|
||||
type = canonicalClassNamesToClasses.get(canonicalTypeName);
|
||||
type = DEF_CLASS_NAME.equals(canonicalTypeName) ? def.class : canonicalClassNamesToClasses.get(canonicalTypeName);
|
||||
|
||||
if (type != null) {
|
||||
char arrayBraces[] = new char[arrayDimensions];
|
||||
|
|
Loading…
Reference in New Issue