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 */ 21 package proguard.evaluation.value; 22 23 /** 24 * This IntegerValue represents a specific integer value. 25 * 26 * @author Eric Lafortune 27 */ 28 abstract class SpecificIntegerValue extends IntegerValue 29 { 30 // Implementations of unary methods of IntegerValue. 31 negate()32 public IntegerValue negate() 33 { 34 return new NegatedIntegerValue(this); 35 } 36 convertToByte()37 public IntegerValue convertToByte() 38 { 39 return new ConvertedByteValue(this); 40 } 41 convertToCharacter()42 public IntegerValue convertToCharacter() 43 { 44 return new ConvertedCharacterValue(this); 45 } 46 convertToShort()47 public IntegerValue convertToShort() 48 { 49 return new ConvertedShortValue(this); 50 } 51 convertToLong()52 public LongValue convertToLong() 53 { 54 return new ConvertedLongValue(this); 55 } 56 convertToFloat()57 public FloatValue convertToFloat() 58 { 59 return new ConvertedFloatValue(this); 60 } 61 convertToDouble()62 public DoubleValue convertToDouble() 63 { 64 return new ConvertedDoubleValue(this); 65 } 66 67 68 // Implementations of binary methods of IntegerValue. 69 generalize(IntegerValue other)70 public IntegerValue generalize(IntegerValue other) 71 { 72 return other.generalize(this); 73 } 74 add(IntegerValue other)75 public IntegerValue add(IntegerValue other) 76 { 77 return other.add(this); 78 } 79 subtract(IntegerValue other)80 public IntegerValue subtract(IntegerValue other) 81 { 82 return other.subtractFrom(this); 83 } 84 subtractFrom(IntegerValue other)85 public IntegerValue subtractFrom(IntegerValue other) 86 { 87 return other.subtract(this); 88 } 89 multiply(IntegerValue other)90 public IntegerValue multiply(IntegerValue other) 91 { 92 return other.multiply(this); 93 } 94 divide(IntegerValue other)95 public IntegerValue divide(IntegerValue other) 96 throws ArithmeticException 97 { 98 return other.divideOf(this); 99 } 100 divideOf(IntegerValue other)101 public IntegerValue divideOf(IntegerValue other) 102 throws ArithmeticException 103 { 104 return other.divide(this); 105 } 106 remainder(IntegerValue other)107 public IntegerValue remainder(IntegerValue other) 108 throws ArithmeticException 109 { 110 return other.remainderOf(this); 111 } 112 remainderOf(IntegerValue other)113 public IntegerValue remainderOf(IntegerValue other) 114 throws ArithmeticException 115 { 116 return other.remainder(this); 117 } 118 shiftLeft(IntegerValue other)119 public IntegerValue shiftLeft(IntegerValue other) 120 { 121 return other.shiftLeftOf(this); 122 } 123 shiftLeftOf(IntegerValue other)124 public IntegerValue shiftLeftOf(IntegerValue other) 125 { 126 return other.shiftLeft(this); 127 } 128 shiftRight(IntegerValue other)129 public IntegerValue shiftRight(IntegerValue other) 130 { 131 return other.shiftRightOf(this); 132 } 133 shiftRightOf(IntegerValue other)134 public IntegerValue shiftRightOf(IntegerValue other) 135 { 136 return other.shiftRight(this); 137 } 138 unsignedShiftRight(IntegerValue other)139 public IntegerValue unsignedShiftRight(IntegerValue other) 140 { 141 return other.unsignedShiftRightOf(this); 142 } 143 unsignedShiftRightOf(IntegerValue other)144 public IntegerValue unsignedShiftRightOf(IntegerValue other) 145 { 146 return other.unsignedShiftRight(this); 147 } 148 shiftLeftOf(LongValue other)149 public LongValue shiftLeftOf(LongValue other) 150 { 151 return other.shiftLeft(this); 152 } 153 shiftRightOf(LongValue other)154 public LongValue shiftRightOf(LongValue other) 155 { 156 return other.shiftRight(this); 157 } 158 unsignedShiftRightOf(LongValue other)159 public LongValue unsignedShiftRightOf(LongValue other) 160 { 161 return other.unsignedShiftRight(this); 162 } 163 and(IntegerValue other)164 public IntegerValue and(IntegerValue other) 165 { 166 return other.and(this); 167 } 168 or(IntegerValue other)169 public IntegerValue or(IntegerValue other) 170 { 171 return other.or(this); 172 } 173 xor(IntegerValue other)174 public IntegerValue xor(IntegerValue other) 175 { 176 return other.xor(this); 177 } 178 equal(IntegerValue other)179 public int equal(IntegerValue other) 180 { 181 return other.equal(this); 182 } 183 lessThan(IntegerValue other)184 public int lessThan(IntegerValue other) 185 { 186 return other.greaterThan(this); 187 } 188 lessThanOrEqual(IntegerValue other)189 public int lessThanOrEqual(IntegerValue other) 190 { 191 return other.greaterThanOrEqual(this); 192 } 193 194 195 // Implementations of binary IntegerValue methods with SpecificIntegerValue 196 // arguments. 197 generalize(SpecificIntegerValue other)198 public IntegerValue generalize(SpecificIntegerValue other) 199 { 200 return this.equals(other) ? this : ValueFactory.INTEGER_VALUE; 201 } 202 add(SpecificIntegerValue other)203 public IntegerValue add(SpecificIntegerValue other) 204 { 205 return new CompositeIntegerValue(this, CompositeIntegerValue.ADD, other); 206 } 207 subtract(SpecificIntegerValue other)208 public IntegerValue subtract(SpecificIntegerValue other) 209 { 210 return this.equals(other) ? 211 ParticularValueFactory.INTEGER_VALUE_0 : 212 new CompositeIntegerValue(this, CompositeIntegerValue.SUBTRACT, other); 213 } 214 subtractFrom(SpecificIntegerValue other)215 public IntegerValue subtractFrom(SpecificIntegerValue other) 216 { 217 return this.equals(other) ? 218 ParticularValueFactory.INTEGER_VALUE_0 : 219 new CompositeIntegerValue(other, CompositeIntegerValue.SUBTRACT, this); 220 } 221 multiply(SpecificIntegerValue other)222 public IntegerValue multiply(SpecificIntegerValue other) 223 { 224 return new CompositeIntegerValue(this, CompositeIntegerValue.MULTIPLY, other); 225 } 226 divide(SpecificIntegerValue other)227 public IntegerValue divide(SpecificIntegerValue other) 228 throws ArithmeticException 229 { 230 return new CompositeIntegerValue(this, CompositeIntegerValue.DIVIDE, other); 231 } 232 divideOf(SpecificIntegerValue other)233 public IntegerValue divideOf(SpecificIntegerValue other) 234 throws ArithmeticException 235 { 236 return new CompositeIntegerValue(other, CompositeIntegerValue.DIVIDE, this); 237 } 238 remainder(SpecificIntegerValue other)239 public IntegerValue remainder(SpecificIntegerValue other) 240 throws ArithmeticException 241 { 242 return new CompositeIntegerValue(this, CompositeIntegerValue.REMAINDER, other); 243 } 244 remainderOf(SpecificIntegerValue other)245 public IntegerValue remainderOf(SpecificIntegerValue other) 246 throws ArithmeticException 247 { 248 return new CompositeIntegerValue(other, CompositeIntegerValue.REMAINDER, this); 249 } 250 shiftLeft(SpecificIntegerValue other)251 public IntegerValue shiftLeft(SpecificIntegerValue other) 252 { 253 return new CompositeIntegerValue(this, CompositeIntegerValue.SHIFT_LEFT, other); 254 } 255 shiftRight(SpecificIntegerValue other)256 public IntegerValue shiftRight(SpecificIntegerValue other) 257 { 258 return new CompositeIntegerValue(this, CompositeIntegerValue.SHIFT_RIGHT, other); 259 } 260 unsignedShiftRight(SpecificIntegerValue other)261 public IntegerValue unsignedShiftRight(SpecificIntegerValue other) 262 { 263 return new CompositeIntegerValue(this, CompositeIntegerValue.UNSIGNED_SHIFT_RIGHT, other); 264 } 265 shiftLeftOf(SpecificIntegerValue other)266 public IntegerValue shiftLeftOf(SpecificIntegerValue other) 267 { 268 return new CompositeIntegerValue(other, CompositeIntegerValue.SHIFT_LEFT, this); 269 } 270 shiftRightOf(SpecificIntegerValue other)271 public IntegerValue shiftRightOf(SpecificIntegerValue other) 272 { 273 return new CompositeIntegerValue(other, CompositeIntegerValue.SHIFT_RIGHT, this); 274 } 275 unsignedShiftRightOf(SpecificIntegerValue other)276 public IntegerValue unsignedShiftRightOf(SpecificIntegerValue other) 277 { 278 return new CompositeIntegerValue(other, CompositeIntegerValue.UNSIGNED_SHIFT_RIGHT, this); 279 } 280 shiftLeftOf(SpecificLongValue other)281 public LongValue shiftLeftOf(SpecificLongValue other) 282 { 283 return new CompositeLongValue(other, CompositeLongValue.SHIFT_LEFT, this); 284 } 285 shiftRightOf(SpecificLongValue other)286 public LongValue shiftRightOf(SpecificLongValue other) 287 { 288 return new CompositeLongValue(other, CompositeLongValue.SHIFT_RIGHT, this); 289 } 290 unsignedShiftRightOf(SpecificLongValue other)291 public LongValue unsignedShiftRightOf(SpecificLongValue other) 292 { 293 return new CompositeLongValue(other, CompositeLongValue.UNSIGNED_SHIFT_RIGHT, this); 294 } 295 and(SpecificIntegerValue other)296 public IntegerValue and(SpecificIntegerValue other) 297 { 298 return this.equals(other) ? 299 this : 300 new CompositeIntegerValue(other, CompositeIntegerValue.AND, this); 301 } 302 or(SpecificIntegerValue other)303 public IntegerValue or(SpecificIntegerValue other) 304 { 305 return this.equals(other) ? 306 this : 307 new CompositeIntegerValue(other, CompositeIntegerValue.OR, this); 308 } 309 xor(SpecificIntegerValue other)310 public IntegerValue xor(SpecificIntegerValue other) 311 { 312 return this.equals(other) ? 313 ParticularValueFactory.INTEGER_VALUE_0 : 314 new CompositeIntegerValue(other, CompositeIntegerValue.XOR, this); 315 } 316 equal(SpecificIntegerValue other)317 public int equal(SpecificIntegerValue other) 318 { 319 return this.equals(other) ? ALWAYS : MAYBE; 320 } 321 lessThan(SpecificIntegerValue other)322 public int lessThan(SpecificIntegerValue other) 323 { 324 return this.equals(other) ? NEVER : MAYBE; 325 } 326 lessThanOrEqual(SpecificIntegerValue other)327 public int lessThanOrEqual(SpecificIntegerValue other) 328 { 329 return this.equals(other) ? ALWAYS : MAYBE; 330 } 331 332 333 // Implementations for Value. 334 isSpecific()335 public boolean isSpecific() 336 { 337 return true; 338 } 339 340 341 // Implementations for Object. 342 equals(Object object)343 public boolean equals(Object object) 344 { 345 return object != null && 346 this.getClass() == object.getClass(); 347 } 348 349 hashCode()350 public int hashCode() 351 { 352 return this.getClass().hashCode(); 353 } 354 } 355