Skip to content

Commit c375e3a

Browse files
committed
Cache conversion factories
1 parent 25d15d4 commit c375e3a

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,12 @@
6363
import javax.lang.model.element.Element;
6464
import javax.lang.model.element.ElementKind;
6565
import javax.lang.model.element.ExecutableElement;
66-
import javax.lang.model.element.Modifier;
6766
import javax.lang.model.element.TypeElement;
6867
import javax.lang.model.type.TypeMirror;
6968
import javax.tools.Diagnostic.Kind;
7069
import javax.tools.JavaFileObject;
7170

7271
import com.oracle.graal.python.annotations.ArgumentClinic;
73-
import com.oracle.graal.python.annotations.ArgumentClinic.ConversionFactory;
7472
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
7573
import com.oracle.graal.python.annotations.ArgumentsClinic;
7674
import com.oracle.graal.python.processor.ArgumentClinicModel.ArgumentClinicData;
@@ -285,32 +283,12 @@ private Map<String, ConverterFactory> getConverterFactories(TypeElement type) th
285283
AnnotationValue v = findAnnotationValue(m, "conversionClass");
286284
if (v != null) {
287285
TypeElement conversionClass = (TypeElement) processingEnv.getTypeUtils().asElement((TypeMirror) v.getValue());
288-
converterFactories.put(name, createConverterFactory(conversionClass));
286+
converterFactories.put(name, ConverterFactory.getForClass(conversionClass));
289287
}
290288
}
291289
return converterFactories;
292290
}
293291

294-
private ConverterFactory createConverterFactory(TypeElement conversionClass) throws ProcessingError {
295-
ConverterFactory factory = null;
296-
for (Element e : conversionClass.getEnclosedElements()) {
297-
ConversionFactory annot = e.getAnnotation(ConversionFactory.class);
298-
if (annot != null) {
299-
if (!e.getModifiers().contains(Modifier.STATIC) || e.getKind() != ElementKind.METHOD) {
300-
throw error(conversionClass, "ConversionFactory annotation is applicable only to static methods.");
301-
}
302-
if (factory != null) {
303-
throw error(conversionClass, "Multiple ConversionFactory annotations in a single class.");
304-
}
305-
factory = new ConverterFactory((ExecutableElement) e, annot.clinicArgs());
306-
}
307-
}
308-
if (factory == null) {
309-
throw error(conversionClass, "No ConversionFactory annotation found.");
310-
}
311-
return factory;
312-
}
313-
314292
private static AnnotationMirror findAnnotationMirror(TypeElement type, String annotationQualifiedName) {
315293
for (AnnotationMirror annot : type.getAnnotationMirrors()) {
316294
String name = ((TypeElement) annot.getAnnotationType().asElement()).getQualifiedName().toString();

graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ConverterFactory.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,27 @@
4444
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
4545
import com.oracle.graal.python.annotations.ArgumentClinic.ConversionFactory.ClinicArgument;
4646

47+
import javax.lang.model.element.Element;
48+
import javax.lang.model.element.ElementKind;
4749
import javax.lang.model.element.ExecutableElement;
50+
import javax.lang.model.element.Modifier;
51+
import javax.lang.model.element.TypeElement;
52+
import java.util.HashMap;
53+
import java.util.Map;
4854

4955
public class ConverterFactory {
5056
public static final String CLINIC_PACKAGE = "com.oracle.graal.python.nodes.function.builtins.clinic";
5157

58+
private static final Map<TypeElement, ConverterFactory> cache = new HashMap<>();
59+
5260
public final String fullClassName;
5361
public final String className;
5462
public final String methodName;
5563
public final int paramCount;
5664
public final ClinicArgument[] clinicArgs;
5765
public final PrimitiveType[] acceptedPrimitiveTypes;
5866

59-
public ConverterFactory(ExecutableElement method, ClinicArgument[] clinicArgs) {
67+
private ConverterFactory(ExecutableElement method, ClinicArgument[] clinicArgs) {
6068
fullClassName = method.getEnclosingElement().toString();
6169
className = fullClassName.substring(fullClassName.lastIndexOf('.') + 1);
6270
methodName = method.getSimpleName().toString();
@@ -127,4 +135,29 @@ public static ConverterFactory getBuiltin(ArgumentClinic annotation) {
127135
throw new IllegalArgumentException(annotation.conversion().toString());
128136
}
129137
}
138+
139+
public static ConverterFactory getForClass(TypeElement conversionClass) throws ProcessingError {
140+
ConverterFactory factory = cache.get(conversionClass);
141+
if (factory != null) {
142+
return factory;
143+
}
144+
for (Element e : conversionClass.getEnclosedElements()) {
145+
ArgumentClinic.ConversionFactory annot = e.getAnnotation(ArgumentClinic.ConversionFactory.class);
146+
if (annot != null) {
147+
if (!e.getModifiers().contains(Modifier.STATIC) || e.getKind() != ElementKind.METHOD) {
148+
throw new ProcessingError(conversionClass, "ConversionFactory annotation is applicable only to static methods.");
149+
}
150+
if (factory != null) {
151+
throw new ProcessingError(conversionClass, "Multiple ConversionFactory annotations in a single class.");
152+
}
153+
factory = new ConverterFactory((ExecutableElement) e, annot.clinicArgs());
154+
}
155+
}
156+
if (factory == null) {
157+
throw new ProcessingError(conversionClass, "No ConversionFactory annotation found.");
158+
}
159+
cache.put(conversionClass, factory);
160+
return factory;
161+
}
162+
130163
}

0 commit comments

Comments
 (0)