Skip to content

Commit d9fd74b

Browse files
authored
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.
1 parent eaaf37a commit d9fd74b

File tree

4 files changed

+7
-8
lines changed

4 files changed

+7
-8
lines changed

modules/lang-painless/src/main/java/org/elasticsearch/painless/ScriptClassInfo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.elasticsearch.painless.lookup.PainlessLookup;
2323
import org.elasticsearch.painless.lookup.PainlessLookupUtility;
24+
import org.elasticsearch.painless.lookup.def;
2425

2526
import java.lang.invoke.MethodType;
2627
import java.lang.reflect.Field;
@@ -190,7 +191,7 @@ private static Class<?> definitionTypeForClass(PainlessLookup painlessLookup, Cl
190191
componentType = componentType.getComponentType();
191192
}
192193

193-
if (painlessLookup.lookupPainlessClass(componentType) == null) {
194+
if (componentType != def.class && painlessLookup.lookupPainlessClass(componentType) == null) {
194195
throw new IllegalArgumentException(unknownErrorMessageSource.apply(componentType));
195196
}
196197

modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookup.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Set;
2727
import java.util.function.Function;
2828

29+
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.DEF_CLASS_NAME;
2930
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessConstructorKey;
3031
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessFieldKey;
3132
import static org.elasticsearch.painless.lookup.PainlessLookupUtility.buildPainlessMethodKey;
@@ -47,7 +48,7 @@ public final class PainlessLookup {
4748
public boolean isValidCanonicalClassName(String canonicalClassName) {
4849
Objects.requireNonNull(canonicalClassName);
4950

50-
return canonicalClassNamesToClasses.containsKey(canonicalClassName);
51+
return DEF_CLASS_NAME.equals(canonicalClassName) || canonicalClassNamesToClasses.containsKey(canonicalClassName);
5152
}
5253

5354
public Class<?> canonicalTypeNameToType(String canonicalTypeName) {

modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupBuilder.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,6 @@ public static PainlessLookup buildFromWhitelists(List<Whitelist> whitelists) {
211211
public PainlessLookupBuilder() {
212212
canonicalClassNamesToClasses = new HashMap<>();
213213
classesToPainlessClassBuilders = new HashMap<>();
214-
215-
canonicalClassNamesToClasses.put(DEF_CLASS_NAME, def.class);
216-
classesToPainlessClassBuilders.put(def.class, new PainlessClassBuilder());
217214
}
218215

219216
private Class<?> canonicalTypeNameToType(String canonicalTypeName) {
@@ -225,7 +222,7 @@ private boolean isValidType(Class<?> type) {
225222
type = type.getComponentType();
226223
}
227224

228-
return classesToPainlessClassBuilders.containsKey(type);
225+
return type == def.class || classesToPainlessClassBuilders.containsKey(type);
229226
}
230227

231228
public void addPainlessClass(ClassLoader classLoader, String javaClassName, boolean importClassName) {

modules/lang-painless/src/main/java/org/elasticsearch/painless/lookup/PainlessLookupUtility.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public static Class<?> canonicalTypeNameToType(String canonicalTypeName, Map<Str
8282
Objects.requireNonNull(canonicalTypeName);
8383
Objects.requireNonNull(canonicalClassNamesToClasses);
8484

85-
Class<?> type = canonicalClassNamesToClasses.get(canonicalTypeName);
85+
Class<?> type = DEF_CLASS_NAME.equals(canonicalTypeName) ? def.class : canonicalClassNamesToClasses.get(canonicalTypeName);
8686

8787
if (type != null) {
8888
return type;
@@ -105,7 +105,7 @@ public static Class<?> canonicalTypeNameToType(String canonicalTypeName, Map<Str
105105
}
106106

107107
canonicalTypeName = canonicalTypeName.substring(0, canonicalTypeName.indexOf('['));
108-
type = canonicalClassNamesToClasses.get(canonicalTypeName);
108+
type = DEF_CLASS_NAME.equals(canonicalTypeName) ? def.class : canonicalClassNamesToClasses.get(canonicalTypeName);
109109

110110
if (type != null) {
111111
char arrayBraces[] = new char[arrayDimensions];

0 commit comments

Comments
 (0)