WALA/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapStatement.java

189 lines
5.5 KiB
Java

/*******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.ipa.slicer;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ssa.SSAAbstractInvokeInstruction;
public abstract class HeapStatement extends Statement {
private final PointerKey loc;
public HeapStatement(CGNode node, PointerKey loc) {
super(node);
if (loc == null) {
throw new IllegalArgumentException("loc is null");
}
this.loc = loc;
}
public final static class HeapParamCaller extends HeapStatement {
// index into the IR instruction array of the call statements
private final int callIndex;
public HeapParamCaller(CGNode node,int callIndex, PointerKey loc) {
super(node, loc);
this.callIndex = callIndex;
}
@Override
public Kind getKind() {
return Kind.HEAP_PARAM_CALLER;
}
public int getCallIndex() {
return callIndex;
}
public SSAAbstractInvokeInstruction getCall() {
return (SSAAbstractInvokeInstruction) getNode().getIR().getInstructions()[callIndex];
}
@Override
public String toString() {
return getKind().toString() + ":" + getNode() + " " + getLocation() + " call:" + getCall();
}
@Override
public int hashCode() {
return getLocation().hashCode() + 4289 * callIndex + 4133 * getNode().hashCode() + 8831;
}
@Override
public boolean equals(Object obj) {
// instanceof is OK because this class is final. instanceof is more efficient than getClass
if (obj instanceof HeapParamCaller) {
HeapParamCaller other = (HeapParamCaller) obj;
return getNode().equals(other.getNode()) && getLocation().equals(other.getLocation()) && callIndex == other.callIndex;
} else {
return false;
}
}
}
public final static class HeapParamCallee extends HeapStatement {
public HeapParamCallee(CGNode node, PointerKey loc) {
super(node, loc);
}
@Override
public Kind getKind() {
return Kind.HEAP_PARAM_CALLEE;
}
@Override
public int hashCode() {
return getLocation().hashCode() + 7727 * getNode().hashCode() + 7841;
}
@Override
public boolean equals(Object obj) {
// instanceof is ok because this class is final. instanceof is more efficient than getClass
if (obj instanceof HeapParamCallee) {
HeapParamCallee other = (HeapParamCallee) obj;
return getNode().equals(other.getNode()) && getLocation().equals(other.getLocation());
} else {
return false;
}
}
@Override
public String toString() {
return getKind().toString() + ":" + getNode() + " " + getLocation();
}
}
public final static class HeapReturnCaller extends HeapStatement {
// index into the instruction array of the relevant call instruction
private final int callIndex;
// private final SSAAbstractInvokeInstruction call;
public HeapReturnCaller(CGNode node, int callIndex, PointerKey loc) {
super(node, loc);
this.callIndex = callIndex;
}
@Override
public Kind getKind() {
return Kind.HEAP_RET_CALLER;
}
public int getCallIndex() {
return callIndex;
}
public SSAAbstractInvokeInstruction getCall() {
return (SSAAbstractInvokeInstruction) getNode().getIR().getInstructions()[callIndex];
}
@Override
public String toString() {
return getKind().toString() + ":" + getNode() + " " + getLocation() + " call:" + getCall();
}
@Override
public int hashCode() {
return getLocation().hashCode() + 8887 * callIndex + 8731 * getNode().hashCode() + 7919;
}
@Override
public boolean equals(Object obj) {
// instanceof is ok because this class is final. instanceof is more efficient than getClass
if (obj instanceof HeapReturnCaller) {
HeapReturnCaller other = (HeapReturnCaller) obj;
return getNode().equals(other.getNode()) && getLocation().equals(other.getLocation()) && callIndex == other.callIndex;
} else {
return false;
}
}
}
public final static class HeapReturnCallee extends HeapStatement {
public HeapReturnCallee(CGNode node, PointerKey loc) {
super(node, loc);
}
@Override
public Kind getKind() {
return Kind.HEAP_RET_CALLEE;
}
@Override
public int hashCode() {
return getLocation().hashCode() + 9533 * getNode().hashCode() + 9631;
}
@Override
public boolean equals(Object obj) {
// instanceof is ok because this class is final. instanceof is more efficient than getClass
if (obj instanceof HeapReturnCallee) {
HeapReturnCallee other = (HeapReturnCallee) obj;
return getNode().equals(other.getNode()) && getLocation().equals(other.getLocation());
} else {
return false;
}
}
@Override
public String toString() {
return getKind().toString() + ":" + getNode() + " " + getLocation();
}
}
public PointerKey getLocation() {
return loc;
}
}