summaryrefslogtreecommitdiff
path: root/src/proguard/evaluation/Variables.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/proguard/evaluation/Variables.java')
-rw-r--r--src/proguard/evaluation/Variables.java347
1 files changed, 0 insertions, 347 deletions
diff --git a/src/proguard/evaluation/Variables.java b/src/proguard/evaluation/Variables.java
deleted file mode 100644
index 4b3a2a4..0000000
--- a/src/proguard/evaluation/Variables.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * ProGuard -- shrinking, optimization, obfuscation, and preverification
- * of Java bytecode.
- *
- * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-package proguard.evaluation;
-
-import proguard.evaluation.value.*;
-
-import java.util.Arrays;
-
-/**
- * This class represents a local variable frame that contains <code>Value</code>
- * objects. Values are generalizations of all values that have been stored in
- * the respective variables.
- *
- * @author Eric Lafortune
- */
-public class Variables
-{
- private static final TopValue TOP_VALUE = new TopValue();
-
-
- protected Value[] values;
- protected int size;
-
-
- /**
- * Creates a new Variables object with a given maximum number of variables.
- */
- public Variables(int size)
- {
- this.values = new Value[size];
- this.size = size;
- }
-
-
- /**
- * Creates a Variables object that is a copy of the given Variables object.
- */
- public Variables(Variables variables)
- {
- // Create the values array.
- this(variables.size);
-
- // Copy the values.
- initialize(variables);
- }
-
-
- /**
- * Resets this Variables object, so that it can be reused.
- */
- public void reset(int size)
- {
- // Is the values array large enough?
- if (size > values.length)
- {
- // Create a new one.
- values = new Value[size];
- }
- else
- {
- // Clear the variables.
- Arrays.fill(values, null);
- }
-
- this.size = size;
- }
-
-
- /**
- * Initializes the values of this Variables object with the values of the
- * given Variables object. The other object may have fewer values, in which
- * case the remaining values are left unchanged.
- */
- public void initialize(Variables other)
- {
- if (this.size < other.size)
- {
- throw new IllegalArgumentException("Variable frame is too small ["+this.size+"] compared to other frame ["+other.size+"]");
- }
-
- // Copy the values.
- System.arraycopy(other.values, 0, this.values, 0, other.size);
- }
-
-
- /**
- * Generalizes the values of this Variables object with the values of the
- * given Variables object.
- * @param clearConflictingOtherVariables specifies whether the other
- * variables should be cleared too,
- * in case of conflicts.
- * @return whether the generalization has made any difference.
- */
- public boolean generalize(Variables other,
- boolean clearConflictingOtherVariables)
- {
- if (this.size != other.size)
- {
- throw new IllegalArgumentException("Variable frames have different sizes ["+this.size+"] and ["+other.size+"]");
- }
-
- boolean changed = false;
-
- for (int index = 0; index < size; index++)
- {
- Value thisValue = this.values[index];
- Value otherValue = other.values[index];
-
- // Occasionally, two values of different types might be present
- // in the same variable in a variable frame (corresponding to
- // two local variables that share the same index), at some point
- // outside of their scopes. Don't generalize the variable then,
- // but let it clear instead.
- if (thisValue != null &&
- otherValue != null &&
- thisValue.computationalType() == otherValue.computationalType())
- {
- Value newValue = thisValue.generalize(otherValue);
-
- changed = changed || !thisValue.equals(newValue);
-
- this.values[index] = newValue;
- }
- else
- {
- changed = changed || thisValue != null;
-
- this.values[index] = null;
-
- if (clearConflictingOtherVariables)
- {
- other.values[index] = null;
- }
- }
- }
-
- return changed;
- }
-
-
- /**
- * Returns the number of variables.
- */
- public int size()
- {
- return size;
- }
-
-
- /**
- * Gets the Value of the variable with the given index, without disturbing it.
- */
- public Value getValue(int index)
- {
- if (index < 0 ||
- index >= size)
- {
- throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]");
- }
-
- return values[index];
- }
-
-
- /**
- * Stores the given Value at the given variable index.
- */
- public void store(int index, Value value)
- {
- if (index < 0 ||
- index >= size)
- {
- throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]");
- }
-
- // Store the value.
- values[index] = value;
-
- // Account for the extra space required by Category 2 values.
- if (value.isCategory2())
- {
- values[index + 1] = TOP_VALUE;
- }
- }
-
-
- /**
- * Loads the Value from the variable with the given index.
- */
- public Value load(int index)
- {
- if (index < 0 ||
- index >= size)
- {
- throw new IndexOutOfBoundsException("Variable index ["+index+"] out of bounds ["+size+"]");
- }
-
- return values[index];
- }
-
-
- // Load methods that provide convenient casts to the expected value types.
-
- /**
- * Loads the IntegerValue from the variable with the given index.
- */
- public IntegerValue iload(int index)
- {
- return load(index).integerValue();
- }
-
-
- /**
- * Loads the LongValue from the variable with the given index.
- */
- public LongValue lload(int index)
- {
- return load(index).longValue();
- }
-
-
- /**
- * Loads the FloatValue from the variable with the given index.
- */
- public FloatValue fload(int index)
- {
- return load(index).floatValue();
- }
-
-
- /**
- * Loads the DoubleValue from the variable with the given index.
- */
- public DoubleValue dload(int index)
- {
- return load(index).doubleValue();
- }
-
-
- /**
- * Loads the ReferenceValue from the variable with the given index.
- */
- public ReferenceValue aload(int index)
- {
- return load(index).referenceValue();
- }
-
-
- /**
- * Loads the InstructionOffsetValue from the variable with the given index.
- */
- public InstructionOffsetValue oload(int index)
- {
- return load(index).instructionOffsetValue();
- }
-
-
- // Implementations for Object.
-
- public boolean equals(Object object)
- {
- if (object == null ||
- this.getClass() != object.getClass())
- {
- return false;
- }
-
- Variables other = (Variables)object;
-
- if (this.size != other.size)
- {
- return false;
- }
-
- for (int index = 0; index < size; index++)
- {
- Value thisValue = this.values[index];
- Value otherValue = other.values[index];
-
- // Occasionally, two values of different types might be
- // present in the same variable in a variable frame
- // (corresponding to two local variables that share the
- // same index), at some point outside of their scopes.
- // We'll ignore these.
- if (thisValue != null &&
- otherValue != null &&
- thisValue.computationalType() == otherValue.computationalType() &&
- !thisValue.equals(otherValue))
- {
- return false;
- }
- }
-
- return true;
- }
-
-
- public int hashCode()
- {
- int hashCode = size;
-
- for (int index = 0; index < size; index++)
- {
- Value value = values[index];
- if (value != null)
- {
- hashCode ^= value.hashCode();
- }
- }
-
- return hashCode;
- }
-
-
- public String toString()
- {
- StringBuffer buffer = new StringBuffer();
-
- for (int index = 0; index < size; index++)
- {
- Value value = values[index];
- buffer = buffer.append('[')
- .append(value == null ? "empty" : value.toString())
- .append(']');
- }
-
- return buffer.toString();
- }
-}