package org.graalvm.compiler.nodes.graphbuilderconf;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Method;
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.nodes.Invoke;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.type.StampTool;
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.ResolvedJavaMethod;
public interface InvocationPlugin extends GraphBuilderPlugin {
public interface Receiver {
default ValueNode get() {
return get(true);
}
ValueNode get(boolean performNullCheck);
default boolean isConstant() {
return false;
}
}
default boolean isSignaturePolymorphic() {
return false;
}
default boolean inlineOnly() {
return isSignaturePolymorphic();
}
default boolean isDecorator() {
return false;
}
default boolean applyPolymorphic(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode... argsIncludingReceiver) {
return defaultHandler(b, targetMethod, receiver, argsIncludingReceiver);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver) {
return defaultHandler(b, targetMethod, receiver);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg) {
return defaultHandler(b, targetMethod, receiver, arg);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2, ValueNode arg3) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2, arg3);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2, ValueNode arg3, ValueNode arg4) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2, arg3, arg4);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2, ValueNode arg3, ValueNode arg4, ValueNode arg5) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2, arg3, arg4, arg5);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2, ValueNode arg3, ValueNode arg4, ValueNode arg5,
ValueNode arg6) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2, arg3, arg4, arg5, arg6);
}
default boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode arg1, ValueNode arg2, ValueNode arg3, ValueNode arg4, ValueNode arg5,
ValueNode arg6, ValueNode arg7) {
return defaultHandler(b, targetMethod, receiver, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
default boolean execute(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode[] argsIncludingReceiver) {
if (isSignaturePolymorphic()) {
return applyPolymorphic(b, targetMethod, receiver, argsIncludingReceiver);
} else if (receiver != null) {
assert !targetMethod.isStatic();
assert argsIncludingReceiver.length > 0;
if (argsIncludingReceiver.length == 1) {
return apply(b, targetMethod, receiver);
} else if (argsIncludingReceiver.length == 2) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1]);
} else if (argsIncludingReceiver.length == 3) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1], argsIncludingReceiver[2]);
} else if (argsIncludingReceiver.length == 4) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3]);
} else if (argsIncludingReceiver.length == 5) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4]);
} else if (argsIncludingReceiver.length == 6) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4], argsIncludingReceiver[5]);
} else if (argsIncludingReceiver.length == 7) {
return apply(b, targetMethod, receiver, argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4], argsIncludingReceiver[5],
argsIncludingReceiver[6]);
} else {
return defaultHandler(b, targetMethod, receiver, argsIncludingReceiver);
}
} else {
assert targetMethod.isStatic();
if (argsIncludingReceiver.length == 0) {
return apply(b, targetMethod, null);
} else if (argsIncludingReceiver.length == 1) {
return apply(b, targetMethod, null, argsIncludingReceiver[0]);
} else if (argsIncludingReceiver.length == 2) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1]);
} else if (argsIncludingReceiver.length == 3) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1], argsIncludingReceiver[2]);
} else if (argsIncludingReceiver.length == 4) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3]);
} else if (argsIncludingReceiver.length == 5) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4]);
} else if (argsIncludingReceiver.length == 6) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4],
argsIncludingReceiver[5]);
} else if (argsIncludingReceiver.length == 7) {
return apply(b, targetMethod, null, argsIncludingReceiver[0], argsIncludingReceiver[1], argsIncludingReceiver[2], argsIncludingReceiver[3], argsIncludingReceiver[4],