package org.graalvm.compiler.nodes;
import java.util.Map;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.NodeInputList;
import org.graalvm.compiler.nodeinfo.NodeCycles;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodeinfo.NodeSize;
import org.graalvm.compiler.nodeinfo.Verbosity;
import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedPluginInjectionProvider;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
@NodeInfo(nameTemplate = "PluginReplacement/{p#pluginName}", cycles = NodeCycles.CYCLES_IGNORED, size = NodeSize.SIZE_IGNORED)
public final class PluginReplacementNode extends FixedWithNextNode {
public static final NodeClass<PluginReplacementNode> TYPE = NodeClass.create(PluginReplacementNode.class);
@Input protected NodeInputList<ValueNode> args;
private final ReplacementFunction function;
private final String pluginName;
public PluginReplacementNode(Stamp stamp, ValueNode[] args, ReplacementFunction function, String pluginName) {
super(TYPE, stamp);
this.args = new NodeInputList<>(this, args);
this.function = function;
this.pluginName = pluginName;
}
public boolean replace(GraphBuilderContext b, GeneratedPluginInjectionProvider injection) {
return function.replace(b, injection, stamp, args);
}
public interface ReplacementFunction {
boolean replace(GraphBuilderContext b, GeneratedPluginInjectionProvider injection, Stamp stamp, NodeInputList<ValueNode> args);
}
@Override
public String toString(Verbosity verbosity) {
if (verbosity == Verbosity.Short) {
return super.toString(verbosity) + "/" + pluginName;
}
return super.toString(verbosity);
}
@Override
public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
map.put("name", pluginName);
return super.getDebugProperties(map);
}
}