All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.checkerframework.dataflow.livevariable.LiveVarTransfer Maven / Gradle / Ivy

package org.checkerframework.dataflow.livevariable;

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;

import java.util.List;

/** 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