/******************************************************************************
* 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.classLoader.CallSiteReference;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
/**
* This abstract instruction extends the abstract invoke with
* functionality to support invocations with a fixed number of
* arguments---the only case in some languages and a common case even
* in scripting languages.
*
*
* @author Julian Dolby (dolby@us.ibm.com)
*/
public abstract class FixedParametersInvokeInstruction
extends MultiReturnValueInvokeInstruction
{
/**
* The value numbers of the arguments passed to the call. For non-static methods,
* params[0] == this. If params == null, this should be a static method with
* no parameters.
*/
private final int[] params;
public FixedParametersInvokeInstruction(int iindex, int results[], int[] params, int exception, CallSiteReference site) {
super(iindex, results, exception, site);
this.params = params;
}
public FixedParametersInvokeInstruction(int iindex, int result, int[] params, int exception, CallSiteReference site) {
this(iindex, new int[]{result}, params, exception, site);
}
/**
* Constructor InvokeInstruction. This case for void return values
* @param params
* @param exception
* @param site
*/
public FixedParametersInvokeInstruction(int iindex, int[] params, int exception, CallSiteReference site) {
this(iindex, null, params, exception, site);
}
protected abstract SSAInstruction copyInstruction(SSAInstructionFactory insts, int result[], int[] params, int exception);
@Override
public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) {
int newParams[] = params;
if (uses != null) {
int i = 0;
newParams = new int[params.length];
for (int j = 0; j < newParams.length; j++)
newParams[j] = uses[i++];
}
int newLvals[] = null;
if (getNumberOfReturnValues() > 0) {
newLvals = new int[results.length];
System.arraycopy(results, 0, newLvals, 0, results.length);
}
int newExp = exception;
if (defs != null) {
int i = 0;
if (getNumberOfReturnValues() > 0) {
newLvals[0] = defs[i++];
}
newExp = defs[i++];
for (int j = 1; j < getNumberOfReturnValues(); j++) {
newLvals[j] = defs[i++];
}
}
return copyInstruction(insts, newLvals, newParams, newExp);
}
@Override
public int getNumberOfParameters() {
if (params == null) {
return 0;
} else {
return params.length;
}
}
@Override
public void visit(IVisitor v) {
// TODO Auto-generated method stub
assert false;
}
@Override
public int getNumberOfUses() {
return getNumberOfParameters();
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
assert false;
return 0;
}
@Override
public int getUse(int j) {
if (j < getNumberOfParameters())
return params[j];
else {
return super.getUse(j);
}
}
}