org.checkerframework.dataflow.livevariable.LiveVarTransfer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dataflow-shaded Show documentation
Show all versions of dataflow-shaded Show documentation
dataflow-shaded is a dataflow framework based on the javac compiler.
It differs from the org.checkerframework:dataflow artifact in two ways.
First, the packages in this artifact have been renamed to org.checkerframework.shaded.*.
Second, unlike the dataflow artifact, this artifact contains the dependencies it requires.
package org.checkerframework.dataflow.livevariable;
import java.util.List;
import org.checkerframework.dataflow.analysis.BackwardTransferFunction;
import org.checkerframework.dataflow.analysis.RegularTransferResult;
import org.checkerframework.dataflow.analysis.TransferInput;
import org.checkerframework.dataflow.analysis.TransferResult;
import org.checkerframework.dataflow.analysis.UnusedAbstractValue;
import org.checkerframework.dataflow.cfg.UnderlyingAST;
import org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor;
import org.checkerframework.dataflow.cfg.node.AssignmentNode;
import org.checkerframework.dataflow.cfg.node.MethodInvocationNode;
import org.checkerframework.dataflow.cfg.node.Node;
import org.checkerframework.dataflow.cfg.node.ObjectCreationNode;
import org.checkerframework.dataflow.cfg.node.ReturnNode;
import org.checkerframework.dataflow.qual.SideEffectFree;
/** A live variable transfer function. */
public class LiveVarTransfer
extends AbstractNodeVisitor<
TransferResult,
TransferInput>
implements BackwardTransferFunction {
/** Creates a new LiveVarTransfer. */
public LiveVarTransfer() {}
@Override
@SideEffectFree
public LiveVarStore initialNormalExitStore(
UnderlyingAST underlyingAST, List returnNodes) {
return new LiveVarStore();
}
@Override
public LiveVarStore initialExceptionalExitStore(UnderlyingAST underlyingAST) {
return new LiveVarStore();
}
@Override
public RegularTransferResult visitNode(
Node n, TransferInput p) {
return new RegularTransferResult<>(null, p.getRegularStore());
}
@Override
public RegularTransferResult visitAssignment(
AssignmentNode n, TransferInput p) {
RegularTransferResult transferResult =
(RegularTransferResult) super.visitAssignment(n, p);
processLiveVarInAssignment(n.getTarget(), n.getExpression(), transferResult.getRegularStore());
return transferResult;
}
@Override
public RegularTransferResult visitMethodInvocation(
MethodInvocationNode n, TransferInput p) {
RegularTransferResult transferResult =
(RegularTransferResult)
super.visitMethodInvocation(n, p);
LiveVarStore store = transferResult.getRegularStore();
for (Node arg : n.getArguments()) {
store.addUseInExpression(arg);
}
return transferResult;
}
@Override
public RegularTransferResult visitObjectCreation(
ObjectCreationNode n, TransferInput p) {
RegularTransferResult transferResult =
(RegularTransferResult) super.visitObjectCreation(n, p);
LiveVarStore store = transferResult.getRegularStore();
for (Node arg : n.getArguments()) {
store.addUseInExpression(arg);
}
return transferResult;
}
@Override
public RegularTransferResult visitReturn(
ReturnNode n, TransferInput p) {
RegularTransferResult transferResult =
(RegularTransferResult) super.visitReturn(n, p);
Node result = n.getResult();
if (result != null) {
LiveVarStore store = transferResult.getRegularStore();
store.addUseInExpression(result);
}
return transferResult;
}
/**
* Update the information of live variables from an assignment statement.
*
* @param variable the variable that should be killed
* @param expression the expression in which the variables should be added
* @param store the live variable store
*/
private void processLiveVarInAssignment(Node variable, Node expression, LiveVarStore store) {
store.killLiveVar(new LiveVarNode(variable));
store.addUseInExpression(expression);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy