Fixes null captured parameters
[jpf-core.git] / src / main / gov / nasa / jpf / vm / LocalVarInfo.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;
20
21 public class LocalVarInfo  extends InfoObject {
22   private final String name;
23   private String type;       // lazy initialized FQN according to JLS 6.7 (e.g. "int", "x.Y[]")
24   private final String signature;  // e.g. "I", "[Lx/Y;"
25   private final String genericSignature;  // non-type erased generic signature(s)
26   private final int    startPC;
27   private final int    endPC;
28   private final int slotIndex;
29     
30   public LocalVarInfo(String name, String signature, String genericSignature, int startPC, int endPC, int slotIndex){
31    
32     this.name             = name;
33     this.signature        = signature;
34     this.genericSignature = genericSignature;
35     this.startPC          = startPC;
36     this.endPC            = endPC;
37     this.slotIndex        = slotIndex;
38   }
39     
40   @Override
41   public String toString(){
42     StringBuilder sb = new StringBuilder();
43     sb.append("LocalVarInfo[");
44     sb.append("name=\"");
45     sb.append(name);
46     sb.append("\",signature=\"");
47     sb.append(signature);
48     sb.append("\",startPC=");
49     sb.append(startPC);
50     sb.append(",endPC=");
51     sb.append(endPC);
52     sb.append(",slotIndex=");
53     sb.append(slotIndex);
54     sb.append("]");
55     
56     return sb.toString();
57   }
58   
59   public String getName() {
60     return name; 
61   }
62
63   public String getType() {
64     if (type == null){
65       type = Types.getTypeName(signature);
66     }
67     return type; 
68   }
69
70   public String getSignature() {
71     return signature;
72   }
73
74   public String getGenericSignature() {
75     return genericSignature;
76   }
77   
78   public int getStartPC() {
79     return startPC; 
80   }
81      
82   public int getLength() {
83     return endPC - startPC +1;
84   }
85
86   public int getSlotIndex() {
87     return slotIndex;
88   }
89
90   public boolean matches (String name, int pc){
91     return (startPC <= pc && endPC >= pc && this.name.equals(name));
92   }
93
94   public boolean matches (int slotIdx, int pc){
95     return (slotIdx == slotIndex) && (pc >= startPC) && (pc <= endPC);
96   }
97
98   public boolean isNumeric(){
99     char c = signature.charAt(0);
100     return (c == 'B' || c == 'S' || c == 'I' || c == 'J' || c == 'F' || c == 'D');
101   }
102
103   public boolean isBoolean(){
104     char c = signature.charAt(0);
105     return (c == 'Z');
106   }  
107
108   public int getSlotSize(){
109     char c = signature.charAt(0);
110     if (c == 'J' || c == 'D'){
111       return 2;
112     } else {
113       return 1;
114     }
115   }
116
117   public boolean isFloatingPoint(){
118     char c = signature.charAt(0);
119     return (c == 'F' || c == 'D');
120   }
121 }
122