143 lines
4.0 KiB
Java
143 lines
4.0 KiB
Java
/******************************************************************************
|
|
* Copyright (c) 2002 - 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.cast.ir.ssa;
|
|
|
|
|
|
import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access;
|
|
import com.ibm.wala.classLoader.CallSiteReference;
|
|
import com.ibm.wala.ssa.*;
|
|
import com.ibm.wala.util.debug.Assertions;
|
|
|
|
public abstract class AbstractLexicalInvoke
|
|
extends SSAAbstractInvokeInstruction
|
|
{
|
|
|
|
protected Access[] lexicalReads = null;
|
|
|
|
protected Access[] lexicalWrites = null;
|
|
|
|
protected AbstractLexicalInvoke(int result,
|
|
int exception,
|
|
CallSiteReference site)
|
|
{
|
|
super(result, exception, site);
|
|
}
|
|
|
|
protected AbstractLexicalInvoke(int result,
|
|
int exception,
|
|
CallSiteReference site,
|
|
Access[] lexicalReads,
|
|
Access[] lexicalWrites)
|
|
{
|
|
this(result, exception, site);
|
|
this.lexicalReads = lexicalReads;
|
|
this.lexicalWrites = lexicalWrites;
|
|
}
|
|
|
|
public int getNumberOfUses() {
|
|
if (lexicalReads == null)
|
|
return getNumberOfParameters();
|
|
else
|
|
return getNumberOfParameters() + lexicalReads.length;
|
|
}
|
|
|
|
public int getUse(int j) {
|
|
Assertions._assert(j >= getNumberOfParameters());
|
|
Assertions._assert(lexicalReads != null);
|
|
Assertions._assert(lexicalReads[j - getNumberOfParameters()] != null);
|
|
return lexicalReads[j - getNumberOfParameters()].valueNumber;
|
|
}
|
|
|
|
public int getNumberOfDefs() {
|
|
if (lexicalWrites == null)
|
|
return super.getNumberOfDefs();
|
|
else
|
|
return super.getNumberOfDefs() + lexicalWrites.length;
|
|
}
|
|
|
|
public int getDef(int j) {
|
|
if (j < super.getNumberOfDefs())
|
|
return super.getDef(j);
|
|
else
|
|
return lexicalWrites[j-super.getNumberOfDefs()].valueNumber;
|
|
}
|
|
|
|
private Access[] addAccess(Access[] array, Access access) {
|
|
if (array == null)
|
|
return new Access[]{ access };
|
|
else {
|
|
Access[] result = new Access[ array.length + 1 ];
|
|
System.arraycopy(array, 0, result, 0, array.length);
|
|
result[ array.length ] = access;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public boolean isLexicalUse(int use) {
|
|
return use >= super.getNumberOfUses();
|
|
}
|
|
|
|
public void addLexicalUse(Access use) {
|
|
lexicalReads = addAccess(lexicalReads, use);
|
|
}
|
|
|
|
public Access getLexicalUse(int i) {
|
|
return lexicalReads[i-getNumberOfParameters()];
|
|
}
|
|
|
|
public boolean isLexicalDef(int def) {
|
|
return def >= super.getNumberOfDefs();
|
|
}
|
|
|
|
public void addLexicalDef(Access def) {
|
|
lexicalWrites = addAccess(lexicalWrites, def);
|
|
}
|
|
|
|
public Access getLexicalDef(int i) {
|
|
return lexicalWrites[i-super.getNumberOfDefs()];
|
|
}
|
|
|
|
public int hashCode() {
|
|
return site.hashCode() * 7529;
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
if (obj != null && getClass().equals(obj.getClass())) {
|
|
SSAAbstractInvokeInstruction other = (SSAAbstractInvokeInstruction)obj;
|
|
return site.equals(other.getCallSite());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public String toString(SymbolTable symbolTable, ValueDecorator d) {
|
|
StringBuffer s = new StringBuffer(super.toString(symbolTable, d));
|
|
|
|
if (lexicalReads != null) {
|
|
s.append(" (reads:");
|
|
for(int i = 0; i < lexicalReads.length; i++) {
|
|
s.append(" ").append(lexicalReads[i].variableName).append(":").append( getValueString(symbolTable, d, lexicalReads[i].valueNumber) );
|
|
}
|
|
s.append(")");
|
|
}
|
|
|
|
if (lexicalWrites != null) {
|
|
s.append(" (writes:");
|
|
for(int i = 0; i < lexicalWrites.length; i++) {
|
|
s.append(" ").append(lexicalWrites[i].variableName).append(":").append( getValueString(symbolTable, d, lexicalWrites[i].valueNumber) );
|
|
}
|
|
s.append(")");
|
|
}
|
|
|
|
return s.toString();
|
|
}
|
|
}
|