189 lines
5.5 KiB
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;
|
|
}
|
|
}
|