Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / util / VarSpec.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.util;
20
21 import gov.nasa.jpf.JPF;
22 import gov.nasa.jpf.vm.LocalVarInfo;
23 import gov.nasa.jpf.vm.MethodInfo;
24
25 /**
26  * utility class to specify local variables in JPF options
27  * example:
28  *
29  *  x.y.MyClass.foo(int,double):x
30  * 
31  * Note: this is not derived from FeatureSpec, it only used a MethodSpec for delegation
32  *
33  * <2do> we don't deal with scopes or types yet
34  */
35 public class VarSpec  {
36
37   static JPFLogger logger = JPF.getLogger("gov.nasa.jpf.util");
38
39   String varName;
40   MethodSpec mthSpec;
41
42   public static VarSpec createVarSpec(String spec) {
43     int idx = spec.indexOf(':');
44
45     if (idx > 0) {
46       String ms = spec.substring(0, idx).trim();
47       String vs = spec.substring(idx+1).trim();
48
49       MethodSpec mspec = MethodSpec.createMethodSpec(ms);
50       if (mspec != null){
51         return new VarSpec(vs, mspec);
52       }
53     }
54
55     logger.warning("illegal variable spec ", spec);
56     return null;
57   }
58
59   public VarSpec (String varName, MethodSpec mthSpec){
60     this.varName = varName;
61     this.mthSpec = mthSpec;
62   }
63
64   public LocalVarInfo getMatchingLocalVarInfo (MethodInfo mi, int pc, int slotIdx){
65
66     if (mthSpec.matches(mi)){
67       LocalVarInfo lvar = mi.getLocalVar(slotIdx, pc);
68       if (lvar != null && lvar.getName().equals(varName)){
69         return lvar;
70       }
71     }
72
73     return null;
74   }
75
76
77 }