package com.oracle.svm.hosted.substitute;
import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
import org.graalvm.compiler.nodes.ConstantNode;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
import org.graalvm.compiler.nodes.graphbuilderconf.NodePlugin;
import com.oracle.svm.core.annotate.Delete;
import com.oracle.svm.core.meta.SubstrateObjectConstant;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.ResolvedJavaField;
import jdk.vm.ci.meta.ResolvedJavaMethod;
public final class DeletedFieldsPlugin implements NodePlugin {
@Override
public boolean handleLoadField(GraphBuilderContext b, ValueNode object, ResolvedJavaField field) {
return handleField(b, field, true);
}
@Override
public boolean handleLoadStaticField(GraphBuilderContext b, ResolvedJavaField field) {
return handleField(b, field, true);
}
@Override
public boolean handleStoreField(GraphBuilderContext b, ValueNode object, ResolvedJavaField field, ValueNode value) {
return handleField(b, field, false);
}
@Override
public boolean handleStoreStaticField(GraphBuilderContext b, ResolvedJavaField field, ValueNode value) {
return handleField(b, field, false);
}
private static boolean handleField(GraphBuilderContext b, ResolvedJavaField field, boolean isLoad) {
Delete deleteAnnotation = field.getAnnotation(Delete.class);
if (deleteAnnotation == null) {
return false;
}
String msg = AnnotationSubstitutionProcessor.deleteErrorMessage(field, deleteAnnotation, false);
ValueNode msgNode = ConstantNode.forConstant(SubstrateObjectConstant.forObject(msg), b.getMetaAccess(), b.getGraph());
ResolvedJavaMethod reportErrorMethod = b.getMetaAccess().lookupJavaMethod(DeletedMethod.reportErrorMethod);
b.handleReplacedInvoke(InvokeKind.Static, reportErrorMethod, new ValueNode[]{msgNode}, false);
JavaKind returnKind = reportErrorMethod.getSignature().getReturnKind();
if (returnKind != JavaKind.Void) {
b.pop(returnKind);
}
if (isLoad) {
b.addPush(field.getJavaKind(), ConstantNode.defaultForKind(field.getJavaKind()));
}
return true;
}
}