1/* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21package proguard.evaluation.value; 22 23import proguard.classfile.Clazz; 24 25/** 26 * This ReferenceValue represents a partially evaluated array. It has an array 27 * length and possibly array values (up to a fixed maximum number). It is not 28 * immutable. 29 * 30 * @author Eric Lafortune 31 */ 32class ArrayReferenceValue extends TypedReferenceValue 33{ 34 protected final IntegerValue arrayLength; 35 36 37 /** 38 * Creates a new ArrayReferenceValue. 39 */ 40 public ArrayReferenceValue(String type, 41 Clazz referencedClass, 42 IntegerValue arrayLength) 43 { 44 super(type, referencedClass, false); 45 46 this.arrayLength = arrayLength; 47 } 48 49 50 // Implementations for ReferenceValue. 51 52 public IntegerValue arrayLength(ValueFactory valueFactory) 53 { 54 return arrayLength; 55 } 56 57 58 // Implementations of binary methods of ReferenceValue. 59 60 public ReferenceValue generalize(ReferenceValue other) 61 { 62 return other.generalize(this); 63 } 64 65 66 public int equal(ReferenceValue other) 67 { 68 return other.equal(this); 69 } 70 71 72// // Implementations of binary ReferenceValue methods with 73// // IdentifiedReferenceValue arguments. 74// 75// public ReferenceValue generalize(IdentifiedReferenceValue other) 76// { 77// return generalize((TypedReferenceValue)other); 78// } 79// 80// 81// public int equal(IdentifiedReferenceValue other) 82// { 83// return equal((TypedReferenceValue)other); 84// } 85 86 87 // Implementations of binary ReferenceValue methods with 88 // ArrayReferenceValue arguments. 89 90 public ReferenceValue generalize(ArrayReferenceValue other) 91 { 92 return 93 this.equals(other) ? this : 94 this.type != null && 95 this.type.equals(other.type) && 96 this.referencedClass == other.referencedClass ? new ArrayReferenceValue(this.type, 97 this.referencedClass, 98 this.arrayLength.generalize(other.arrayLength)) : 99 generalize((TypedReferenceValue)other); 100 } 101 102 103 public int equal(ArrayReferenceValue other) 104 { 105 if (this.arrayLength.equal(other.arrayLength) == NEVER) 106 { 107 return NEVER; 108 } 109 110 return equal((TypedReferenceValue)other); 111 } 112 113 114// // Implementations of binary ReferenceValue methods with 115// // IdentifiedArrayReferenceValue arguments. 116// 117// public ReferenceValue generalize(IdentifiedArrayReferenceValue other) 118// { 119// return generalize((ArrayReferenceValue)other); 120// } 121// 122// 123// public int equal(IdentifiedArrayReferenceValue other) 124// { 125// return equal((ArrayReferenceValue)other); 126// } 127// 128// 129// // Implementations of binary ReferenceValue methods with 130// // DetailedArrayReferenceValue arguments. 131// 132// public ReferenceValue generalize(DetailedArrayReferenceValue other) 133// { 134// return generalize((IdentifiedArrayReferenceValue)other); 135// } 136// 137// 138// public int equal(DetailedArrayReferenceValue other) 139// { 140// return equal((IdentifiedArrayReferenceValue)other); 141// } 142 143 144 // Implementations for Object. 145 146 public boolean equals(Object object) 147 { 148 return this == object || 149 super.equals(object) && 150 this.arrayLength.equals(((ArrayReferenceValue)object).arrayLength); 151 } 152 153 154 public int hashCode() 155 { 156 return super.hashCode() ^ 157 arrayLength.hashCode(); 158 } 159 160 161 public String toString() 162 { 163 return super.toString() + '['+arrayLength+']'; 164 } 165} 166