1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 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.Clazz; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This TypedReferenceValue represents a reference value that is identified by a 272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * unique ID. 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromclass IdentifiedReferenceValue extends TypedReferenceValue 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final ValueFactory valuefactory; 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final int id; 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Creates a new reference value with the given ID. 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public IdentifiedReferenceValue(String type, 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass, 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean mayBeNull, 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ValueFactory valuefactory, 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int id) 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato super(type, referencedClass, mayBeNull); 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.valuefactory = valuefactory; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.id = id; 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Implementations of binary methods of ReferenceValue. 542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public ReferenceValue generalize(ReferenceValue other) 562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return other.generalize(this); 582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int equal(ReferenceValue other) 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return other.equal(this); 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Implementations of binary ReferenceValue methods with 682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // IdentifiedReferenceValue arguments. 69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public ReferenceValue generalize(IdentifiedReferenceValue other) 712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return generalize((TypedReferenceValue)other); 732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public int equal(IdentifiedReferenceValue other) 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return this.equals(other) ? ALWAYS : 792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom this.equal((TypedReferenceValue)other); 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // Implementations of binary ReferenceValue methods with 842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // ArrayReferenceValue arguments. 852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public ReferenceValue generalize(ArrayReferenceValue other) 872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return generalize((TypedReferenceValue)other); 892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public int equal(ArrayReferenceValue other) 932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return equal((TypedReferenceValue)other); 952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // Implementations of binary ReferenceValue methods with 992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // IdentifiedArrayReferenceValue arguments. 1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) 1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return generalize((ArrayReferenceValue)other); 1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public int equal(IdentifiedArrayReferenceValue other) 1082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 1092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return equal((ArrayReferenceValue)other); 1102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 1112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // Implementations of binary ReferenceValue methods with 1142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// // DetailedArrayReferenceValue arguments. 1152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public ReferenceValue generalize(DetailedArrayReferenceValue other) 1172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 1182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return generalize((IdentifiedArrayReferenceValue)other); 1192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// 1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// public int equal(DetailedArrayReferenceValue other) 1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// { 1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// return equal((IdentifiedArrayReferenceValue)other); 1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// } 1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Value. 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isSpecific() 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Object. 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean equals(Object object) 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return this == object || 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato super.equals(object) && 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.valuefactory.equals(((IdentifiedReferenceValue)object).valuefactory) && 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.id == ((IdentifiedReferenceValue)object).id; 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int hashCode() 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return super.hashCode() ^ 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato valuefactory.hashCode() ^ 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato id; 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString() 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return super.toString()+'#'+id; 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}