/*
* @(#)PHI.java
*/
package org.jf.dexlib.Code.Analysis.ssa;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* This class represents a phi-function.
* @author Patrick Kuhn
*/
public class PHI {
private final int originDestination;
private String destination;
private String[] parameters;
private boolean cleanedUp;
/**
* Create a Phi-instruction.
* a <- Phi(b, c, d, ...)
* @param destination a
* @param parameters b, c, d, ...
*/
public PHI(final int destination, final List<Integer> parameters) {
this.originDestination = destination;
this.destination = Integer.toString(destination);
this.parameters = new String[parameters.size()];
int i = 0;
for (Integer j : parameters) {
this.parameters[i] = Integer.toString(j);
++i;
}
this.cleanedUp = false;
}
public PHI(final int destination, final int numberOfParameters) {
this.originDestination = destination;
this.destination = Integer.toString(destination);
this.parameters = new String[numberOfParameters];
for (int i = 0; i < numberOfParameters; ++i) {
this.parameters[i] = this.destination;
}
}
public void changeVariableName(final int varOriginal, final String varNewName) {
if (cleanedUp) {
throw new IllegalStateException("Already cleaned up, no more change possible!");
}
this.parameters[varOriginal] = varNewName;
}
public void changeDefinitionName(final String newName) {
if (cleanedUp) {
throw new IllegalStateException("Already cleaned up, no more change possible!");
}
this.destination = newName;
}
public String getDestination() {
return destination;
}
/**
* Get destination register name before any renaming.
* @return the origin destination
*/
public int getOriginDestination() {
return originDestination;
}
/**
* Get the current operands.
* @return the operands
*/
public String[] getOperands() {
return Arrays.copyOf(parameters, parameters.length);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("v").append(destination);
sb.append(" = PHI(");
boolean flag = false;
for (String i : parameters) {
sb.append("v").append(i);
sb.append(", ");
flag = true;
}
if (flag) {
sb.delete(sb.length() - 2, sb.length());
}
sb.append(')');
return sb.toString();
}
/**
*
*/
@Deprecated
void cleanup() {
cleanedUp = true;
Set<String> set = new HashSet<String>();
set.addAll(Arrays.asList(parameters));
if (set.size() < parameters.length) {
parameters = set.toArray(new String[0]);
}
}
}