1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59f606f95f03a75961498803e24bee6799a7c0885Ying Wang * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.evaluation.value; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.ClassConstants; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class represents a partially evaluated instruction offset. It can 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * contain 0 or more specific instruction offsets. 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class InstructionOffsetValue extends Category1Value 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static final InstructionOffsetValue EMPTY_VALUE = new InstructionOffsetValue(); 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int[] values; 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private InstructionOffsetValue() 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public InstructionOffsetValue(int value) 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.values = new int[] { value }; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public InstructionOffsetValue(int[] values) 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.values = values; 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int instructionOffsetCount() 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return values == null ? 0 : values.length; 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int instructionOffset(int index) 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return values[index]; 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given value is present in this list of instruction 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * offsets. 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean contains(int value) 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values != null) 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < values.length; index++) 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values[index] == value) 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the minimum value from this list of instruction offsets. 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns <code>Integer.MAX_VALUE</code> if the list is empty. 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int minimumValue() 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int minimumValue = Integer.MAX_VALUE; 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values != null) 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < values.length; index++) 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int value = values[index]; 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (minimumValue > value) 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato minimumValue = value; 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return minimumValue; 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the maximum value from this list of instruction offsets. 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns <code>Integer.MIN_VALUE</code> if the list is empty. 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int maximumValue() 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int maximumValue = Integer.MIN_VALUE; 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values != null) 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < values.length; index++) 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int value = values[index]; 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (maximumValue < value) 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato maximumValue = value; 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return maximumValue; 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the generalization of this InstructionOffsetValue and the given 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * other InstructionOffsetValue. The values of the other InstructionOffsetValue 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * are guaranteed to remain at the end of the list, in the same order. 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final Value generalize(InstructionOffsetValue other) 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // If the values array of either is null, return the other one. 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (this.values == null) 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other; 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (other.values == null) 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return this; 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Compute the length of the union of the arrays. 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int newLength = this.values.length; 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < other.values.length; index++) 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!this.contains(other.values[index])) 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newLength++; 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // If the length of the union array is equal to the length of the values 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // array of either, return it. 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (newLength == other.values.length) 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other; 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The ordering of the this array may not be right, so we can't just 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // use it. 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //if (newLength == this.values.length) 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //{ 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // return this; 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //} 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the union array. 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] newValues = new int[newLength]; 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int newIndex = 0; 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Copy the values that are different from the other array. 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < this.values.length; index++) 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!other.contains(this.values[index])) 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newValues[newIndex++] = this.values[index]; 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Copy the values from the other array. 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < other.values.length; index++) 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newValues[newIndex++] = other.values[index]; 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new InstructionOffsetValue(newValues); 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Value. 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final InstructionOffsetValue instructionOffsetValue() 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return this; 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isSpecific() 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isParticular() 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final Value generalize(Value other) 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return this.generalize(other.instructionOffsetValue()); 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final int computationalType() 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return TYPE_INSTRUCTION_OFFSET; 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final String internalType() 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return String.valueOf(ClassConstants.INTERNAL_TYPE_INT); 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Object. 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean equals(Object object) 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (object == null || 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.getClass() != object.getClass()) 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato InstructionOffsetValue other = (InstructionOffsetValue)object; 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (this.values == other.values) 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (this.values == null || 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato other.values == null || 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.values.length != other.values.length) 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < other.values.length; index++) 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!this.contains(other.values[index])) 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int hashCode() 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int hashCode = this.getClass().hashCode(); 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values != null) 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < values.length; index++) 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato hashCode ^= values[index]; 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return hashCode; 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString() 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer buffer = new StringBuffer(); 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (values != null) 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < values.length; index++) 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (index > 0) 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer.append(','); 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer.append(values[index]); 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return buffer.append(':').toString(); 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 308