Skip to content

Commit 1032ab2

Browse files
committed
Use ClinicConverterFactory for built-in conversions
1 parent 6596064 commit 1032ab2

File tree

10 files changed

+100
-44
lines changed

10 files changed

+100
-44
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
103103
return false;
104104
}
105105
try {
106+
ConverterFactory.initBuiltins(processingEnv.getElementUtils());
106107
doProcess(roundEnv);
107108
} catch (IOException ex) {
108109
ex.printStackTrace();

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

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,15 @@
5050
import javax.lang.model.element.Modifier;
5151
import javax.lang.model.element.TypeElement;
5252
import javax.lang.model.element.VariableElement;
53+
import javax.lang.model.util.Elements;
5354
import java.util.HashMap;
5455
import java.util.List;
5556
import java.util.Map;
5657

5758
public class ConverterFactory {
5859
public static final String CLINIC_PACKAGE = "com.oracle.graal.python.nodes.function.builtins.clinic";
5960

60-
enum Param {
61+
public enum Param {
6162
/**
6263
* The default value {@link ArgumentClinic#defaultValue()}.
6364
*/
@@ -86,6 +87,15 @@ enum Param {
8687

8788
private static final Map<TypeElement, ConverterFactory> cache = new HashMap<>();
8889

90+
private static ConverterFactory BuiltinBoolean;
91+
private static ConverterFactory BuiltinString;
92+
private static ConverterFactory BuiltinStringWithDefaultValue;
93+
private static ConverterFactory BuiltinInt;
94+
private static ConverterFactory BuiltinCodePoint;
95+
private static ConverterFactory BuiltinBuffer;
96+
private static ConverterFactory BuiltinIndex;
97+
private static ConverterFactory BuiltinNone;
98+
8999
public final String fullClassName;
90100
public final String className;
91101
public final String methodName;
@@ -102,48 +112,12 @@ private ConverterFactory(String fullClassName, String className, String methodNa
102112
this.acceptedPrimitiveTypes = acceptedPrimitiveTypes;
103113
}
104114

105-
private ConverterFactory(String className, Param[] params, PrimitiveType[] acceptedPrimitiveTypes) {
106-
this(CLINIC_PACKAGE + "." + className, className, "create", 0, params, acceptedPrimitiveTypes);
107-
}
108-
109-
private static final ConverterFactory BuiltinBoolean = new ConverterFactory("JavaBooleanConverterNodeGen",
110-
new Param[]{Param.DefaultValue},
111-
new PrimitiveType[]{PrimitiveType.Boolean});
112-
113-
private static final ConverterFactory BuiltinString = new ConverterFactory("JavaStringConverterNodeGen",
114-
new Param[]{Param.BuiltinName},
115-
new PrimitiveType[]{});
116-
117-
private static final ConverterFactory BuiltinStringWithDefault = new ConverterFactory("JavaStringConverterWithDefaultValueNodeGen",
118-
new Param[]{Param.BuiltinName, Param.DefaultValue, Param.UseDefaultForNone},
119-
new PrimitiveType[]{});
120-
121-
private static final ConverterFactory BuiltinInt = new ConverterFactory("JavaIntConversionNodeGen",
122-
new Param[]{Param.DefaultValue, Param.UseDefaultForNone},
123-
new PrimitiveType[]{PrimitiveType.Int});
124-
125-
private static final ConverterFactory BuiltinCodePoint = new ConverterFactory("CodePointConversionNodeGen",
126-
new Param[]{Param.BuiltinName, Param.DefaultValue, Param.UseDefaultForNone},
127-
new PrimitiveType[]{});
128-
129-
private static final ConverterFactory BuiltinBuffer = new ConverterFactory("BufferConversionNodeGen",
130-
new Param[]{},
131-
new PrimitiveType[]{});
132-
133-
private static final ConverterFactory BuiltinIndex = new ConverterFactory("IndexConversionNodeGen",
134-
new Param[]{Param.DefaultValue, Param.UseDefaultForNone},
135-
new PrimitiveType[]{PrimitiveType.Int});
136-
137-
private static final ConverterFactory BuiltinNone = new ConverterFactory("DefaultValueNode",
138-
new Param[]{Param.DefaultValue, Param.UseDefaultForNone},
139-
new PrimitiveType[]{PrimitiveType.Boolean, PrimitiveType.Int, PrimitiveType.Long, PrimitiveType.Double});
140-
141115
public static ConverterFactory getBuiltin(ArgumentClinic annotation) {
142116
switch (annotation.conversion()) {
143117
case Boolean:
144118
return BuiltinBoolean;
145119
case String:
146-
return annotation.defaultValue().isEmpty() ? BuiltinString : BuiltinStringWithDefault;
120+
return annotation.defaultValue().isEmpty() ? BuiltinString : BuiltinStringWithDefaultValue;
147121
case Int:
148122
return BuiltinInt;
149123
case CodePoint:
@@ -169,10 +143,10 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
169143
ClinicConverterFactory annot = e.getAnnotation(ClinicConverterFactory.class);
170144
if (annot != null) {
171145
if (!e.getModifiers().contains(Modifier.STATIC) || e.getKind() != ElementKind.METHOD) {
172-
throw new ProcessingError(conversionClass, "ConversionFactory annotation is applicable only to static methods.");
146+
throw new ProcessingError(conversionClass, "ClinicConverterFactory annotation is applicable only to static methods.");
173147
}
174148
if (factory != null) {
175-
throw new ProcessingError(conversionClass, "Multiple ConversionFactory annotations in a single class.");
149+
throw new ProcessingError(conversionClass, "Multiple ClinicConverterFactory annotations in a single class.");
176150
}
177151
String fullClassName = conversionClass.toString();
178152
String className = conversionClass.getSimpleName().toString();
@@ -201,7 +175,7 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
201175
}
202176
}
203177
if (factory == null) {
204-
throw new ProcessingError(conversionClass, "No ConversionFactory annotation found.");
178+
throw new ProcessingError(conversionClass, "No ClinicConverterFactory annotation found.");
205179
}
206180
cache.put(conversionClass, factory);
207181
return factory;
@@ -212,4 +186,23 @@ public static ConverterFactory forCustomConversion(TypeElement type, String meth
212186
String className = type.getSimpleName().toString();
213187
return new ConverterFactory(fullClassName, className, methodName, 0, new Param[0], new PrimitiveType[0]);
214188
}
189+
190+
private static ConverterFactory forBuiltin(Elements elementUtils, String className) throws ProcessingError {
191+
TypeElement type = elementUtils.getTypeElement(CLINIC_PACKAGE + "." + className);
192+
if (type == null) {
193+
throw new ProcessingError(null, "Unable to find built-in argument clinic conversion node " + CLINIC_PACKAGE + "." + className);
194+
}
195+
return getForClass(type);
196+
}
197+
198+
public static void initBuiltins(Elements elementUtils) throws ProcessingError {
199+
BuiltinBoolean = forBuiltin(elementUtils, "JavaBooleanConverterNode");
200+
BuiltinString = forBuiltin(elementUtils, "JavaStringConverterNode");
201+
BuiltinStringWithDefaultValue = forBuiltin(elementUtils, "JavaStringConverterWithDefaultValueNode");
202+
BuiltinInt = forBuiltin(elementUtils, "JavaIntConversionNode");
203+
BuiltinCodePoint = forBuiltin(elementUtils, "CodePointConversionNode");
204+
BuiltinBuffer = forBuiltin(elementUtils, "BufferConversionNode");
205+
BuiltinIndex = forBuiltin(elementUtils, "IndexConversionNode");
206+
BuiltinNone = forBuiltin(elementUtils, "DefaultValueNode");
207+
}
215208
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/BufferConversionNode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.nodes.function.builtins.clinic;
4242

43+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
4344
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4445
import com.oracle.graal.python.nodes.ErrorMessages;
4546
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode.ArgumentCastNodeWithRaise;
@@ -63,4 +64,9 @@ byte[] doObject(Object value,
6364
}
6465
throw raise(PythonErrorType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value);
6566
}
67+
68+
@ClinicConverterFactory
69+
public static BufferConversionNode create() {
70+
return BufferConversionNodeGen.create();
71+
}
6672
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/CodePointConversionNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4444

45+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
46+
import com.oracle.graal.python.annotations.ClinicConverterFactory.BuiltinName;
47+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
48+
import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone;
4549
import com.oracle.graal.python.builtins.objects.PNone;
4650
import com.oracle.graal.python.builtins.objects.str.PString;
4751
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -90,4 +94,9 @@ int doOthers(Object value,
9094
throw raise(TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_S_NOT_P, builtinName, "unicode character", value);
9195
}
9296
}
97+
98+
@ClinicConverterFactory
99+
public static CodePointConversionNode create(@BuiltinName String builtinName, @DefaultValue int defaultValue, @UseDefaultForNone boolean useDefaultForNone) {
100+
return CodePointConversionNodeGen.create(builtinName, defaultValue, useDefaultForNone);
101+
}
93102
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/DefaultValueNode.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@
4040
*/
4141
package com.oracle.graal.python.nodes.function.builtins.clinic;
4242

43+
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
44+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
45+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
46+
import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone;
4347
import com.oracle.truffle.api.frame.VirtualFrame;
4448
import com.oracle.truffle.api.profiles.ConditionProfile;
4549

@@ -52,7 +56,8 @@ public final class DefaultValueNode extends ArgumentCastNode {
5256

5357
private final ConditionProfile profileArg = ConditionProfile.createBinaryProfile();
5458

55-
public static DefaultValueNode create(Object defaultValue, boolean useDefaultForNone) {
59+
@ClinicConverterFactory(shortCircuitPrimitive = {PrimitiveType.Boolean, PrimitiveType.Int, PrimitiveType.Long, PrimitiveType.Double})
60+
public static DefaultValueNode create(@DefaultValue Object defaultValue, @UseDefaultForNone boolean useDefaultForNone) {
5661
return new DefaultValueNode(defaultValue, useDefaultForNone);
5762
}
5863

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/IndexConversionNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242

4343
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4444

45+
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
46+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
47+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
48+
import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone;
4549
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4650
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4751
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -70,4 +74,9 @@ int doOthers(VirtualFrame frame, Object value,
7074
Object result = lib.asIndexWithFrame(value, frame);
7175
return indexLib.asSizeWithFrame(result, TypeError, frame);
7276
}
77+
78+
@ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Int)
79+
public static IndexConversionNode create(@DefaultValue int defaultValue, @UseDefaultForNone boolean useDefaultForNone) {
80+
return IndexConversionNodeGen.create(defaultValue, useDefaultForNone);
81+
}
7382
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaBooleanConverterNode.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
*/
4141
package com.oracle.graal.python.nodes.function.builtins.clinic;
4242

43+
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
44+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
45+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
4346
import com.oracle.graal.python.builtins.objects.PNone;
4447
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4548
import com.oracle.truffle.api.dsl.Specialization;
@@ -82,4 +85,9 @@ static Object doOthers(VirtualFrame frame, Object value,
8285
@CachedLibrary("value") PythonObjectLibrary lib) {
8386
return lib.isTrue(value, frame);
8487
}
88+
89+
@ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Boolean)
90+
public static JavaBooleanConverterNode create(@DefaultValue boolean defaultValue) {
91+
return JavaBooleanConverterNodeGen.create(defaultValue);
92+
}
8593
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaIntConversionNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242

4343
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4444

45+
import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType;
46+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
47+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
48+
import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone;
4549
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4650
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4751
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -72,4 +76,9 @@ int doOthers(VirtualFrame frame, Object value,
7276
}
7377
return (int) result;
7478
}
79+
80+
@ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Int)
81+
public static JavaIntConversionNode create(@DefaultValue int defaultValue, @UseDefaultForNone boolean useDefaultForNone) {
82+
return JavaIntConversionNodeGen.create(defaultValue, useDefaultForNone);
83+
}
7584
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaStringConverterNode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.nodes.function.builtins.clinic;
4242

43+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
44+
import com.oracle.graal.python.annotations.ClinicConverterFactory.BuiltinName;
4345
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4446
import com.oracle.graal.python.nodes.ErrorMessages;
4547
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode.ArgumentCastNodeWithRaise;
@@ -74,4 +76,9 @@ Object doOthers(Object value,
7476
protected boolean shouldUseDefaultValue(@SuppressWarnings("unused") Object value) {
7577
return false;
7678
}
79+
80+
@ClinicConverterFactory
81+
public static JavaStringConverterNode create(@BuiltinName String builtinName) {
82+
return JavaStringConverterNodeGen.create(builtinName);
83+
}
7784
}
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,18 @@
4040
*/
4141
package com.oracle.graal.python.nodes.function.builtins.clinic;
4242

43+
import com.oracle.graal.python.annotations.ClinicConverterFactory;
44+
import com.oracle.graal.python.annotations.ClinicConverterFactory.BuiltinName;
45+
import com.oracle.graal.python.annotations.ClinicConverterFactory.DefaultValue;
46+
import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone;
4347
import com.oracle.graal.python.builtins.objects.PNone;
4448
import com.oracle.truffle.api.dsl.Specialization;
4549

46-
public abstract class JavaStringConverterWithDefaultValue extends JavaStringConverterNode {
50+
public abstract class JavaStringConverterWithDefaultValueNode extends JavaStringConverterNode {
4751
private final Object defaultValue;
4852
protected final boolean useDefaultForNone;
4953

50-
public JavaStringConverterWithDefaultValue(String builtinName, Object defaultValue, boolean useDefaultForNone) {
54+
public JavaStringConverterWithDefaultValueNode(String builtinName, Object defaultValue, boolean useDefaultForNone) {
5155
super(builtinName);
5256
this.defaultValue = defaultValue;
5357
this.useDefaultForNone = useDefaultForNone;
@@ -67,4 +71,9 @@ Object doNoValueAndNone(@SuppressWarnings("unused") PNone none) {
6771
protected final boolean shouldUseDefaultValue(Object value) {
6872
return isHandledPNone(useDefaultForNone, value);
6973
}
74+
75+
@ClinicConverterFactory
76+
public static JavaStringConverterWithDefaultValueNode create(@BuiltinName String builtinName, @DefaultValue Object defaultValue, @UseDefaultForNone boolean useDefaultForNone) {
77+
return JavaStringConverterWithDefaultValueNodeGen.create(builtinName, defaultValue, useDefaultForNone);
78+
}
7079
}

0 commit comments

Comments
 (0)