Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1397,9 +1397,9 @@ private boolean isCannotRaise(VariableElement signature) {
return Boolean.parseBoolean(initArgs[0].strip());
}

private boolean isWrapperRootInvoke(InvokeExternalFunctionDesc wrapper) {
TypeMirror wrapperBaseRoot = processingEnv.getElementUtils().getTypeElement(EXFUNC_INVOKER_PACKAGE + ".ExternalFunctionNodes.WrapperBaseRoot").asType();
return processingEnv.getTypeUtils().isSubtype(wrapper.origin.getEnclosingElement().asType(), wrapperBaseRoot);
private boolean isWrapperInvoke(InvokeExternalFunctionDesc wrapper) {
TypeMirror wrapperBase = processingEnv.getElementUtils().getTypeElement(EXFUNC_INVOKER_PACKAGE + ".ExternalFunctionNodes.WrapperBase").asType();
return processingEnv.getTypeUtils().isSubtype(wrapper.origin.getEnclosingElement().asType(), wrapperBase);
}

private static String getGeneratedExternalInvokeHelperClassName(Element clazz) {
Expand Down Expand Up @@ -1874,7 +1874,7 @@ private ExecutableElement findMethod(Element location, TypeMirror enclosingType,
return null;
}

private static final String WRAPPER_DESCRIPTOR_GEN_CLASS_NAME = "WrapperDescriptorRootNodesGen";
private static final String WRAPPER_DESCRIPTOR_GEN_CLASS_NAME = "WrapperDescriptorNodesGen";

private void generateExternalFunctionHelperNodes(List<InvokeExternalFunctionDesc> externalFunctionDescs) throws IOException {
final Types typeUtils = processingEnv.getTypeUtils();
Expand All @@ -1883,7 +1883,7 @@ private void generateExternalFunctionHelperNodes(List<InvokeExternalFunctionDesc
Map<TypeElement, List<InvokeExternalFunctionDesc>> helperInvokeDescsByClass = new LinkedHashMap<>();

for (InvokeExternalFunctionDesc desc : externalFunctionDescs) {
if (!isWrapperRootInvoke(desc)) {
if (!isWrapperInvoke(desc)) {
TypeElement clazz = (TypeElement) desc.origin.getEnclosingElement();
helperInvokeDescsByClass.computeIfAbsent(clazz, k -> new ArrayList<>()).add(desc);
}
Expand Down Expand Up @@ -1992,10 +1992,10 @@ private void generateExternalFunctionHelperNodes(List<InvokeExternalFunctionDesc
}
}

private void generateExternalFunctionRootNodes(List<InvokeExternalFunctionDesc> externalFunctionDescs, List<CApiExternalFunctionWrapperDesc> wrappers,
private void generateExternalFunctionWrapperNodes(List<InvokeExternalFunctionDesc> externalFunctionDescs, List<CApiExternalFunctionWrapperDesc> wrappers,
@SuppressWarnings("unused") Map<String, CApiExternalFunctionSignatureDesc> externalFunctionSignatures) throws IOException {
final Types typeUtils = processingEnv.getTypeUtils();
List<InvokeExternalFunctionDesc> wrapperInvokeDescs = externalFunctionDescs.stream().filter(this::isWrapperRootInvoke).toList();
List<InvokeExternalFunctionDesc> wrapperInvokeDescs = externalFunctionDescs.stream().filter(this::isWrapperInvoke).toList();
ArrayList<String> lines = new ArrayList<>();

lines.add("// @formatter:off");
Expand All @@ -2004,17 +2004,16 @@ private void generateExternalFunctionRootNodes(List<InvokeExternalFunctionDesc>
lines.add("package " + EXFUNC_INVOKER_PACKAGE + ";");
lines.add("");

lines.add("import com.oracle.graal.python.PythonLanguage;");
lines.add("import com.oracle.graal.python.builtins.objects.function.Signature;");
lines.add("import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.EnsurePythonObjectNode;");
for (InvokeExternalFunctionDesc wrapper : wrapperInvokeDescs) {
Element clazz = wrapper.origin.getEnclosingElement();
lines.add("import " + EXFUNC_INVOKER_PACKAGE + "." + clazz.getEnclosingElement().getSimpleName() + "." + clazz.getSimpleName() + ";");
}
lines.add("import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;");
lines.add("import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.WrapperDescriptorRoot;");
lines.add("import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.WrapperDescriptor;");
lines.add("import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;");
lines.add("import " + NATIVE_FUNCTION_POINTER + ";");
lines.add("import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext;");
lines.add("import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;");
lines.add("import com.oracle.graal.python.runtime.PythonContext;");
lines.add("import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;");
Expand Down Expand Up @@ -2097,7 +2096,6 @@ private void generateExternalFunctionRootNodes(List<InvokeExternalFunctionDesc>
lines.add("");
lines.add(" public static final class " + genClassName + " extends " + clazz.getSimpleName() + " {");
lines.add("");
lines.add(" @Child private CalleeContext calleeContext = CalleeContext.create();");
lines.add(" @Child private BoundaryCallData boundaryCallData;");
lines.add(" @Child private GetThreadStateNode getThreadStateNode = GetThreadStateNode.create();");
for (int j = 0; j < wrapper.argumentTypes.size(); j++) {
Expand Down Expand Up @@ -2150,8 +2148,8 @@ private void generateExternalFunctionRootNodes(List<InvokeExternalFunctionDesc>
lines.add("");
lines.add(" private final CApiTiming timing;");
lines.add("");
lines.add(" public " + genClassName + "(PythonLanguage language, TruffleString name, PExternalFunctionWrapper wrapper) {");
lines.add(" super(language, name, wrapper);");
lines.add(" public " + genClassName + "(TruffleString name, PExternalFunctionWrapper wrapper) {");
lines.add(" super(name, wrapper);");
lines.add(" this.timing = CApiTiming.create(true, name);");
lines.add(" this.boundaryCallData = BoundaryCallData.createFor(this);");
lines.add(" }");
Expand Down Expand Up @@ -2184,16 +2182,31 @@ private void generateExternalFunctionRootNodes(List<InvokeExternalFunctionDesc>

// generate factory method
lines.add(" @TruffleBoundary");
lines.add(" public static WrapperDescriptorRoot create(PythonLanguage language, TruffleString name, PExternalFunctionWrapper wrapper) {");
lines.add(" public static WrapperDescriptor create(TruffleString name, PExternalFunctionWrapper wrapper) {");
lines.add(" return switch (wrapper) {");
for (CApiExternalFunctionWrapperDesc wrapper : wrappers) {
String wrapperList = wrapper.wrapperNames.stream().map(CApiBuiltinsProcessor::name).collect(Collectors.joining(", "));
lines.add(" case " + wrapperList + " -> new " + name(wrapper.origin) + "Gen(language, name, wrapper);");
lines.add(" case " + wrapperList + " -> new " + name(wrapper.origin) + "Gen(name, wrapper);");
}
lines.add(" default -> throw CompilerDirectives.shouldNotReachHere(\"no root node for wrapper \" + wrapper);");
lines.add(" default -> throw CompilerDirectives.shouldNotReachHere(\"no node for wrapper \" + wrapper);");
lines.add(" };");
lines.add(" }");

// Use the same annotation mapping for the actual body class and its Python signature.
for (boolean signature : new boolean[]{false, true}) {
lines.add(" @TruffleBoundary");
lines.add(signature ? " public static Signature getSignature(PExternalFunctionWrapper wrapper) {"
: " public static Class<? extends WrapperDescriptor> getNodeClass(PExternalFunctionWrapper wrapper) {");
lines.add(" return switch (wrapper) {");
for (CApiExternalFunctionWrapperDesc wrapper : wrappers) {
String wrapperList = wrapper.wrapperNames.stream().map(CApiBuiltinsProcessor::name).collect(Collectors.joining(", "));
lines.add(" case " + wrapperList + " -> " + name(wrapper.origin) + (signature ? ".SIGNATURE;" : ".class;"));
}
lines.add(" default -> throw CompilerDirectives.shouldNotReachHere(\"no body for wrapper \" + wrapper);");
lines.add(" };");
lines.add(" }");
}

// closing brace for WRAPPER_DESCRIPTOR_GEN_CLASS_NAME
lines.add("}");

Expand Down Expand Up @@ -2327,7 +2340,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
generateCApiHeader(javaBuiltins, javaConstants, capiSymbols);
generateExternalFunctionInvoker(new ArrayList<>(sigs.values()));
generateExternalFunctionHelperNodes(externalFunctionDescs);
generateExternalFunctionRootNodes(externalFunctionDescs, cApiExternalFunctionWrapperDescs, sigs);
generateExternalFunctionWrapperNodes(externalFunctionDescs, cApiExternalFunctionWrapperDescs, sigs);
}
generateBuiltinRegistry(javaBuiltins);
generateUpcallConfig(javaBuiltins, explicitUpcallTargets);
Expand Down
Loading
Loading