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 Onorato/**
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This abstract class represents a partially evaluated value.
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic abstract class Value
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int NEVER  = -1;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int MAYBE  = 0;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int ALWAYS = 1;
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_INTEGER            = 1;
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_LONG               = 2;
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_FLOAT              = 3;
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_DOUBLE             = 4;
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_REFERENCE          = 5;
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_INSTRUCTION_OFFSET = 6;
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int TYPE_TOP                = 7;
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a Category1Value.
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Category1Value category1Value()
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a Category 1 value [" + this.getClass().getName() + "]");
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a Category2Value.
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Category2Value category2Value()
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a Category 2 value [" + this.getClass().getName() + "]");
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as an IntegerValue.
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public IntegerValue integerValue()
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not an integer value [" + this.getClass().getName() + "]");
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a LongValue.
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public LongValue longValue()
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a long value [" + this.getClass().getName() + "]");
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a FloatValue.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public FloatValue floatValue()
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a float value [" + this.getClass().getName() + "]");
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a DoubleValue.
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public DoubleValue doubleValue()
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a double value [" + this.getClass().getName() + "]");
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as a ReferenceValue.
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ReferenceValue referenceValue()
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not a reference value [" + this.getClass().getName() + "]");
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns this Value as an InstructionOffsetValue.
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public InstructionOffsetValue instructionOffsetValue()
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        throw new IllegalArgumentException("Value \"" + this.toString() + "\" is not an instruction offset value [" + this.getClass().getName() + "]");
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether this Value represents a single specific (but possibly
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * unknown) value.
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean isSpecific()
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return false;
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether this Value represents a single particular (known)
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * value.
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean isParticular()
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return false;
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the generalization of this Value and the given other Value.
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public abstract Value generalize(Value other);
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the computational type of this Value is a category 2 type.
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * This means that it takes up the space of two category 1 types on the
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * stack, for instance.
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public abstract boolean isCategory2();
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the computational type of this Value.
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>TYPE_INTEGER</code>,
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>TYPE_LONG</code>,
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>TYPE_FLOAT</code>,
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>TYPE_DOUBLE</code>,
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>TYPE_REFERENCE</code>, or
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>TYPE_INSTRUCTION_OFFSET</code>.
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public abstract int computationalType();
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal type of this Value.
1572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @return <code>ClassConstants.TYPE_BOOLEAN</code>,
1582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_BYTE</code>,
1592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_CHAR</code>,
1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_SHORT</code>,
1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_INT</code>,
1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_LONG</code>,
1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_FLOAT</code>,
1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_DOUBLE</code>,
1652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *         <code>ClassConstants.TYPE_CLASS_START ... ClassConstants.TYPE_CLASS_END</code>, or
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         an array type containing any of these types (always as String).
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public abstract String internalType();
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
170