SmartThings specific support to reduce state space
[jpf-core.git] / src / main / gov / nasa / jpf / vm / serialize / IgnoreConstants.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.vm.serialize;
20
21 import gov.nasa.jpf.vm.FieldInfo;
22 import gov.nasa.jpf.vm.serialize.AmmendableFilterConfiguration.StaticAmmendment;
23
24 import java.util.Arrays;
25 import java.util.HashSet;
26
27 /**
28  * Marks static final field of primitive or known immutable type to be
29  * filtered.  In theory, these could be critical to state, but that would
30  * be highly irregular.
31  * 
32  * NOTE - final does not really mean constant, so we only ignore fields
33  * here that are initialized from lexical constants, i.e. a constpool entry.
34  * Others might involve data choice generators
35  * 
36  * <br><br>
37  * Ignoring constants probably isn't beneficial with the FilteringSerializer
38  * but could be a big win with AbstractingSerializer, which garbage-collects
39  * no-longer-reachable objects--that is, garbage collection in its
40  * representation, not in VM.
41  *
42  * @author peterd
43  */
44 public class IgnoreConstants implements StaticAmmendment {
45   static final HashSet<String> knownImmutables =
46     new HashSet<String>(Arrays.asList(new String[] {
47         "boolean", "byte", "char", "double", "float", "int", "long", "short",
48         "java.lang.String",
49         "java.lang.Boolean",
50         "java.lang.Byte",
51         "java.lang.Character",
52         "java.lang.Double",
53         "java.lang.Float",
54         "java.lang.Integer",
55         "java.lang.Long",
56         "java.lang.Short",
57     }));
58   
59   @Override
60   public boolean ammendFieldInclusion(FieldInfo fi, boolean sofar) {
61     assert fi.isStatic();
62     if (fi.isFinal() && fi.getConstantValue() != null) {
63       if (knownImmutables.contains(fi.getType())) {
64         return POLICY_IGNORE; 
65       }
66     }
67     // otherwise, delegate
68     return sofar; 
69   }
70
71   // must be at bottom
72   public static final IgnoreConstants instance = new IgnoreConstants();
73 }