• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */
18 
19 /**
20  * @author Alexei S. Vaskin
21  */
22 
23 /**
24  * Created on 22.04.2005
25  */
26 
27 package org.apache.harmony.jpda.tests.framework.jdwp;
28 
29 import java.util.ArrayList;
30 
31 /**
32  * This class provides description of frame.
33  *
34  */
35 public class Frame {
36 
37     protected long threadID;
38 
39     protected Location loc;
40 
41     protected long id;
42 
43     protected ArrayList<Variable> vars;
44 
45     /**
46      * Default constructor.
47      */
Frame()48     public Frame() {
49         threadID = -1;
50         id = -1L;
51         loc = new Location();
52         vars = null;
53     }
54 
55     /**
56      * Constructor initializing all members of the Frame instance.
57      *
58      * @param threadID
59      *            thread id
60      * @param id
61      *            frame id
62      * @param location
63      *            frame location
64      * @param vars
65      *            list of variables
66      */
Frame(long threadID, long id, Location location, ArrayList<Variable> vars)67     Frame(long threadID, long id, Location location, ArrayList<Variable> vars) {
68         this.threadID = threadID;
69         this.id = id;
70         this.loc = location;
71         this.vars = vars;
72     }
73 
74     /**
75      * Gets thread id.
76      *
77      * @return long
78      */
getThreadID()79     public long getThreadID() {
80         return threadID;
81     }
82 
83     /**
84      * Sets new thread id.
85      *
86      * @param threadID
87      *            new thread id
88      */
setThreadID(long threadID)89     public void setThreadID(long threadID) {
90         this.threadID = threadID;
91     }
92 
93     /**
94      * Gets frame id.
95      *
96      * @return long
97      */
getID()98     public long getID() {
99         return id;
100     }
101 
102     /**
103      * Sets new frame id.
104      *
105      * @param id
106      *            new frame id
107      */
setID(long id)108     public void setID(long id) {
109         this.id = id;
110     }
111 
112     /**
113      * Gets frame location.
114      *
115      * @return Location
116      */
getLocation()117     public Location getLocation() {
118         return loc;
119     }
120 
121     /**
122      * Sets new frame location.
123      *
124      * @param location
125      *            new frame location
126      */
setLocation(Location location)127     public void setLocation(Location location) {
128         this.loc = location;
129     }
130 
131     /**
132      * Gets frame variables.
133      *
134      * @return list of frame variables
135      */
getVars()136     public ArrayList<Variable> getVars() {
137         return vars;
138     }
139 
140     /**
141      * Sets new frame variables.
142      *
143      * @param vars
144      *            list of new frame variables
145      */
setVars(ArrayList<Variable> vars)146     public void setVars(ArrayList<Variable> vars) {
147         this.vars = vars;
148     }
149 
150     /**
151      * Converts Frame object to String.
152      *
153      * @see java.lang.Object#toString()
154      * @return String
155      */
156     @Override
toString()157     public String toString() {
158         String string = "Frame: id=" + id + ", threadID=" + threadID
159                 + ", location=" + loc.toString() + "\n";
160         string += "--- Variables ---";
161         for (Variable var : vars) {
162             string += var.toString();
163         }
164         return string;
165     }
166 
167     /**
168      * Compares two Frame objects.
169      *
170      * @see java.lang.Object#equals(java.lang.Object)
171      * @return boolean
172      */
173     @Override
equals(Object obj)174     public boolean equals(Object obj) {
175         if (!(obj instanceof Frame)) {
176             return false;
177         }
178 
179         if (this.getClass() != obj.getClass()) {
180             return false;
181         }
182 
183         Frame frame = (Frame) obj;
184         if (this.threadID != frame.threadID || this.id != frame.id
185                 || !(this.loc.equals(frame.loc))) {
186             return false;
187         }
188 
189         if (vars.size() != frame.vars.size()) {
190             return false;
191         }
192 
193         if (!vars.equals(frame.vars)) {
194             return false;
195         }
196 
197         return true;
198     }
199 
200     /**
201      * This describing frame variable.
202      *
203      */
204     public static final class Variable {
205         private long codeIndex;
206 
207         private String name;
208 
209         private String signature;
210 
211         private String genericSignature;
212 
213         private int length;
214 
215         private int slot;
216 
217         private byte tag;
218 
219         private String type;
220 
221         /**
222          * Constructor.
223          *
224          */
Variable()225         public Variable() {
226             codeIndex = -1;
227             name = "unknown";
228             signature = "unknown";
229             genericSignature = "unknown";
230             length = -1;
231             slot = -1;
232             tag = JDWPConstants.Tag.NO_TAG;
233             type = "unknown type";
234         }
235 
236         /**
237          * Gets code index of variable.
238          *
239          * @return long
240          */
getCodeIndex()241         public long getCodeIndex() {
242             return codeIndex;
243         }
244 
245         /**
246          * Sets new code index for variable.
247          *
248          * @param codeIndex
249          */
setCodeIndex(long codeIndex)250         public void setCodeIndex(long codeIndex) {
251             this.codeIndex = codeIndex;
252         }
253 
254         /**
255          * Gets variable name.
256          *
257          * @return String
258          */
getName()259         public String getName() {
260             return name;
261         }
262 
263         /**
264          * Sets new variable name.
265          *
266          * @param name
267          *            new variable name
268          */
setName(String name)269         public void setName(String name) {
270             this.name = name;
271         }
272 
273         /**
274          * Gets signature of the variable reference type.
275          *
276          * @return String
277          */
getSignature()278         public String getSignature() {
279             return signature;
280         }
281 
282         /**
283          * Sets new signature and detects value of a type tag.
284          *
285          * @param signature
286          */
setSignature(String signature)287         public void setSignature(String signature) {
288             switch (signature.charAt(0)) {
289             case '[':
290                 tag = JDWPConstants.Tag.ARRAY_TAG;
291                 break;
292             case 'B':
293                 tag = JDWPConstants.Tag.BYTE_TAG;
294                 break;
295             case 'C':
296                 tag = JDWPConstants.Tag.CHAR_TAG;
297                 break;
298             case 'L':
299                 tag = JDWPConstants.Tag.OBJECT_TAG;
300                 break;
301             case 'F':
302                 tag = JDWPConstants.Tag.FLOAT_TAG;
303                 break;
304             case 'D':
305                 tag = JDWPConstants.Tag.DOUBLE_TAG;
306                 break;
307             case 'I':
308                 tag = JDWPConstants.Tag.INT_TAG;
309                 break;
310             case 'J':
311                 tag = JDWPConstants.Tag.LONG_TAG;
312                 break;
313             case 'S':
314                 tag = JDWPConstants.Tag.SHORT_TAG;
315                 break;
316             case 'V':
317                 tag = JDWPConstants.Tag.VOID_TAG;
318                 break;
319             case 'Z':
320                 tag = JDWPConstants.Tag.BOOLEAN_TAG;
321                 break;
322             case 's':
323                 tag = JDWPConstants.Tag.STRING_TAG;
324                 break;
325             case 't':
326                 tag = JDWPConstants.Tag.THREAD_TAG;
327                 break;
328             case 'g':
329                 tag = JDWPConstants.Tag.THREAD_GROUP_TAG;
330                 break;
331             case 'l':
332                 tag = JDWPConstants.Tag.CLASS_LOADER_TAG;
333                 break;
334             case 'c':
335                 tag = JDWPConstants.Tag.CLASS_OBJECT_TAG;
336                 break;
337             }
338 
339             this.signature = signature;
340         }
341 
342         /**
343          * Gets variable generic signature.
344          *
345          * @return the generic signature
346          */
getGenericSignature()347         public String getGenericSignature() {
348             return genericSignature;
349         }
350 
351         /**
352          * Sets new variable generic signature.
353          *
354          * @param genericSignature the generic signature to set
355          */
setGenericSignature(String genericSignature)356         public void setGenericSignature(String genericSignature) {
357             this.genericSignature = genericSignature;
358         }
359 
360         /**
361          * Gets variable length.
362          *
363          * @return int
364          */
getLength()365         public int getLength() {
366             return length;
367         }
368 
369         /**
370          * Sets new variable length.
371          *
372          * @param length
373          *            new variable length
374          */
setLength(int length)375         public void setLength(int length) {
376             this.length = length;
377         }
378 
379         /**
380          * Returns variable slot value.
381          *
382          * @return int
383          */
getSlot()384         public int getSlot() {
385             return slot;
386         }
387 
388         /**
389          * Assigns new slot value.
390          *
391          * @param slot
392          *            new slot value
393          */
setSlot(int slot)394         public void setSlot(int slot) {
395             this.slot = slot;
396         }
397 
398         /**
399          * Gets variable type tag value.
400          *
401          * @return byte
402          */
getTag()403         public byte getTag() {
404             return tag;
405         }
406 
407         /**
408          * Gets variable java type.
409          *
410          * @return String
411          */
getType()412         public String getType() {
413             switch (tag) {
414             case JDWPConstants.Tag.ARRAY_TAG:
415                 switch (signature.charAt(1)) {
416                 case 'B':
417                     type = "byte[]";
418                     break;
419                 case 'C':
420                     type = "char[]";
421                     break;
422                 case 'J':
423                     type = "long[]";
424                     break;
425                 case 'F':
426                     type = "float[]";
427                     break;
428                 case 'D':
429                     type = "double[]";
430                     break;
431                 case 'I':
432                     type = "int[]";
433                     break;
434                 case 'S':
435                     type = "short[]";
436                     break;
437                 case 'V':
438                     type = "void[]";
439                     break;
440                 case 'Z':
441                     type = "boolean[]";
442                     break;
443                 case 's':
444                     type = "java.Lang.String[]";
445                     break;
446                 case 'L':
447                     type = signature
448                             .substring(2, signature.length() - 1 /*
449                                                                      * skip
450                                                                      * ending
451                                                                      * ';'
452                                                                      */)
453                             .replaceAll("/", ".")
454                             + "[]"; // skip ending ';'
455                     break;
456                 }
457                 break;
458             case JDWPConstants.Tag.OBJECT_TAG:
459                 type = signature
460                         .substring(1, signature.length() - 1 /*
461                                                                  * skip ending
462                                                                  * ';'
463                                                                  */)
464                         .replaceAll("/", "."); // skip ending ';'
465                 break;
466             case JDWPConstants.Tag.BOOLEAN_TAG:
467                 type = "boolean";
468                 break;
469             case JDWPConstants.Tag.BYTE_TAG:
470                 type = "byte";
471                 break;
472             case JDWPConstants.Tag.CHAR_TAG:
473                 type = "char";
474                 break;
475             case JDWPConstants.Tag.DOUBLE_TAG:
476                 type = "double";
477                 break;
478             case JDWPConstants.Tag.FLOAT_TAG:
479                 type = "float";
480                 break;
481             case JDWPConstants.Tag.INT_TAG:
482                 type = "int";
483                 break;
484             case JDWPConstants.Tag.LONG_TAG:
485                 type = "long";
486                 break;
487             case JDWPConstants.Tag.SHORT_TAG:
488                 type = "short";
489                 break;
490             case JDWPConstants.Tag.STRING_TAG:
491                 type = "string";
492                 break;
493             default:
494                 break;
495             }
496 
497             return type;
498         }
499 
500         /**
501          * Converts Variable object to String.
502          *
503          * @see java.lang.Object#toString()
504          * @return String
505          */
506         @Override
toString()507         public String toString() {
508             return "Variable: codeIndex=" + codeIndex + ", name=" + name
509                     + ", signature=" + signature + ", length=" + length
510                     + ", slot=" + slot + ", tag="
511                     + JDWPConstants.Tag.getName(tag) + ", type=" + type;
512         }
513 
514         /**
515          * Compares two Variable objects.
516          *
517          * @see java.lang.Object#equals(java.lang.Object)
518          * @return boolean
519          */
520         @Override
equals(Object obj)521         public boolean equals(Object obj) {
522             if (!(obj instanceof Variable)) {
523                 return false;
524             }
525 
526             if (this.getClass() != obj.getClass()) {
527                 return false;
528             }
529 
530             Variable var = (Variable) obj;
531             return this.codeIndex == var.codeIndex
532                     && this.name.equals(var.name)
533                     && this.signature.equals(var.signature)
534                     && this.length == var.length && this.slot == var.slot
535                     && this.tag == var.tag && this.type.equals(var.type);
536 
537         }
538     }
539 }
540