27 import java.util.Arrays;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.Set;
31
32 /**
33 * Class for recording assumptions made during compilation.
34 */
35 public final class Assumptions implements Iterable<Assumptions.Assumption> {
36
37 /**
38 * Abstract base class for assumptions. An assumption assumes a property of the runtime that may
39 * be invalidated by subsequent execution (e.g., that a class has no subclasses implementing
40 * {@link NoFinalizableSubclass Object.finalize()}).
41 */
42 public abstract static class Assumption {
43 }
44
45 /**
46 * A class for providing information that is only valid in association with a set of
47 * {@link Assumption}s.
48 *
49 * @param <T>
50 */
51 public static class AssumptionResult<T> {
52 Assumption[] assumptions;
53 final T result;
54
55 private static final Assumption[] EMPTY = new Assumption[0];
56
57 public AssumptionResult(T result, Assumption... assumptions) {
58 this.result = result;
59 this.assumptions = assumptions;
60 }
61
62 public AssumptionResult(T result) {
63 this(result, EMPTY);
64 }
65
66 public T getResult() {
67 return result;
170 return false;
171 }
172
173 @Override
174 public String toString() {
175 return "ConcreteSubtype[context=" + context.toJavaName() + ", subtype=" + subtype.toJavaName() + "]";
176 }
177 }
178
179 /**
180 * An assumption that a given type has no subtypes.
181 */
182 public static final class LeafType extends Assumption {
183
184 /**
185 * Type the assumption is made about.
186 */
187 public final ResolvedJavaType context;
188
189 public LeafType(ResolvedJavaType context) {
190 this.context = context;
191 }
192
193 @Override
194 public int hashCode() {
195 final int prime = 31;
196 int result = 1;
197 result = prime * result + context.hashCode();
198 return result;
199 }
200
201 @Override
202 public boolean equals(Object obj) {
203 if (obj instanceof LeafType) {
204 LeafType other = (LeafType) obj;
205 return other.context.equals(context);
206 }
207 return false;
208 }
209
|
27 import java.util.Arrays;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.Set;
31
32 /**
33 * Class for recording assumptions made during compilation.
34 */
35 public final class Assumptions implements Iterable<Assumptions.Assumption> {
36
37 /**
38 * Abstract base class for assumptions. An assumption assumes a property of the runtime that may
39 * be invalidated by subsequent execution (e.g., that a class has no subclasses implementing
40 * {@link NoFinalizableSubclass Object.finalize()}).
41 */
42 public abstract static class Assumption {
43 }
44
45 /**
46 * A class for providing information that is only valid in association with a set of
47 * {@link Assumption}s. It is permissible for AssumptionResults to have no assumptions at all.
48 * For instance, if {@link ResolvedJavaType#isLeaf()} returns true for a type
49 * {@link ResolvedJavaType#findLeafConcreteSubtype()} can return an AssumptionResult with no
50 * assumptions since the leaf information is statically true.
51 *
52 * @param <T>
53 */
54 public static class AssumptionResult<T> {
55 Assumption[] assumptions;
56 final T result;
57
58 private static final Assumption[] EMPTY = new Assumption[0];
59
60 public AssumptionResult(T result, Assumption... assumptions) {
61 this.result = result;
62 this.assumptions = assumptions;
63 }
64
65 public AssumptionResult(T result) {
66 this(result, EMPTY);
67 }
68
69 public T getResult() {
70 return result;
173 return false;
174 }
175
176 @Override
177 public String toString() {
178 return "ConcreteSubtype[context=" + context.toJavaName() + ", subtype=" + subtype.toJavaName() + "]";
179 }
180 }
181
182 /**
183 * An assumption that a given type has no subtypes.
184 */
185 public static final class LeafType extends Assumption {
186
187 /**
188 * Type the assumption is made about.
189 */
190 public final ResolvedJavaType context;
191
192 public LeafType(ResolvedJavaType context) {
193 assert !context.isLeaf() : "assumption isn't required for leaf types";
194 this.context = context;
195 }
196
197 @Override
198 public int hashCode() {
199 final int prime = 31;
200 int result = 1;
201 result = prime * result + context.hashCode();
202 return result;
203 }
204
205 @Override
206 public boolean equals(Object obj) {
207 if (obj instanceof LeafType) {
208 LeafType other = (LeafType) obj;
209 return other.context.equals(context);
210 }
211 return false;
212 }
213
|