blob: 3018ae6ef428e4ae3868453fd0470e61a9fdd908 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexei S. Vaskin
*/
/**
* Created on 22.04.2005
*/
package org.apache.harmony.jpda.tests.framework.jdwp;
import java.util.ArrayList;
import java.util.Iterator;
/**
* This class provides description of frame.
*
*/
public class Frame {
protected long threadID;
protected Location loc;
protected long id;
protected ArrayList vars;
/**
* Default constructor.
*/
public Frame() {
threadID = -1;
id = -1L;
loc = new Location();
vars = null;
}
/**
* Constructor initializing all members of the Frame instance.
*
* @param threadID
* thread id
* @param id
* frame id
* @param location
* frame location
* @param vars
* list of variables
*/
Frame(long threadID, long id, Location location, ArrayList vars) {
this.threadID = threadID;
this.id = id;
this.loc = location;
this.vars = vars;
}
/**
* Gets thread id.
*
* @return long
*/
public long getThreadID() {
return threadID;
}
/**
* Sets new thread id.
*
* @param threadID
* new thread id
*/
public void setThreadID(long threadID) {
this.threadID = threadID;
}
/**
* Gets frame id.
*
* @return long
*/
public long getID() {
return id;
}
/**
* Sets new frame id.
*
* @param id
* new frame id
*/
public void setID(long id) {
this.id = id;
}
/**
* Gets frame location.
*
* @return Location
*/
public Location getLocation() {
return loc;
}
/**
* Sets new frame location.
*
* @param location
* new frame location
*/
public void setLocation(Location location) {
this.loc = location;
}
/**
* Gets frame variables.
*
* @return list of frame variables
*/
public ArrayList getVars() {
return vars;
}
/**
* Sets new frame variables.
*
* @param vars
* list of new frame variables
*/
public void setVars(ArrayList vars) {
this.vars = vars;
}
/**
* Converts Frame object to String.
*
* @see java.lang.Object#toString()
* @return String
*/
public String toString() {
String string = "Frame: id=" + id + ", threadID=" + threadID
+ ", location=" + loc.toString() + "\n";
string += "--- Variables ---";
Iterator it = vars.iterator();
while (it.hasNext()) {
string += ((Variable) it.next()).toString();
}
return string;
}
/**
* Compares two Frame objects.
*
* @see java.lang.Object#equals(java.lang.Object)
* @return boolean
*/
public boolean equals(Object obj) {
if (!(obj instanceof Frame)) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
Frame frame = (Frame) obj;
if (this.threadID != frame.threadID || this.id != frame.id
|| !(this.loc.equals(frame.loc))) {
return false;
}
if (vars.size() != frame.vars.size()) {
return false;
}
if (!vars.equals(frame.vars)) {
return false;
}
return true;
}
/**
* This describing frame variable.
*
*/
public final class Variable {
private long codeIndex;
private String name;
private String signature;
private int length;
private int slot;
private byte tag;
private String type;
/**
* Constructor.
*
*/
public Variable() {
codeIndex = -1;
name = "unknown";
signature = "unknown";
length = -1;
slot = -1;
tag = JDWPConstants.Tag.NO_TAG;
type = "unknown type";
}
/**
* Gets code index of variable.
*
* @return long
*/
public long getCodeIndex() {
return codeIndex;
}
/**
* Sets new code index for variable.
*
* @param codeIndex
*/
public void setCodeIndex(long codeIndex) {
this.codeIndex = codeIndex;
}
/**
* Gets variable name.
*
* @return String
*/
public String getName() {
return name;
}
/**
* Sets new variable name.
*
* @param name
* new variable name
*/
public void setName(String name) {
this.name = name;
}
/**
* Gets signature of the variable reference type.
*
* @return String
*/
public String getSignature() {
return signature;
}
/**
* Sets new signature and detects value of a type tag.
*
* @param signature
*/
public void setSignature(String signature) {
switch (signature.charAt(0)) {
case '[':
tag = JDWPConstants.Tag.ARRAY_TAG;
break;
case 'B':
tag = JDWPConstants.Tag.BYTE_TAG;
break;
case 'C':
tag = JDWPConstants.Tag.CHAR_TAG;
break;
case 'L':
tag = JDWPConstants.Tag.OBJECT_TAG;
break;
case 'F':
tag = JDWPConstants.Tag.FLOAT_TAG;
break;
case 'D':
tag = JDWPConstants.Tag.DOUBLE_TAG;
break;
case 'I':
tag = JDWPConstants.Tag.INT_TAG;
break;
case 'J':
tag = JDWPConstants.Tag.LONG_TAG;
break;
case 'S':
tag = JDWPConstants.Tag.SHORT_TAG;
break;
case 'V':
tag = JDWPConstants.Tag.VOID_TAG;
break;
case 'Z':
tag = JDWPConstants.Tag.BOOLEAN_TAG;
break;
case 's':
tag = JDWPConstants.Tag.STRING_TAG;
break;
case 't':
tag = JDWPConstants.Tag.THREAD_TAG;
break;
case 'g':
tag = JDWPConstants.Tag.THREAD_GROUP_TAG;
break;
case 'l':
tag = JDWPConstants.Tag.CLASS_LOADER_TAG;
break;
case 'c':
tag = JDWPConstants.Tag.CLASS_OBJECT_TAG;
break;
}
this.signature = signature;
}
/**
* Gets variable length.
*
* @return int
*/
public int getLength() {
return length;
}
/**
* Sets new variable length.
*
* @param length
* new variable length
*/
public void setLength(int length) {
this.length = length;
}
/**
* Returns variable slot value.
*
* @return int
*/
public int getSlot() {
return slot;
}
/**
* Assigns new slot value.
*
* @param slot
* new slot value
*/
public void setSlot(int slot) {
this.slot = slot;
}
/**
* Gets variable type tag value.
*
* @return byte
*/
public byte getTag() {
return tag;
}
/**
* Gets variable java type.
*
* @return String
*/
public String getType() {
switch (tag) {
case JDWPConstants.Tag.ARRAY_TAG:
switch (signature.charAt(1)) {
case 'B':
type = "byte[]";
break;
case 'C':
type = "char[]";
break;
case 'J':
type = "long[]";
break;
case 'F':
type = "float[]";
break;
case 'D':
type = "double[]";
break;
case 'I':
type = "int[]";
break;
case 'S':
type = "short[]";
break;
case 'V':
type = "void[]";
break;
case 'Z':
type = "boolean[]";
break;
case 's':
type = "java.Lang.String[]";
break;
case 'L':
type = signature
.substring(2, signature.length() - 1 /*
* skip
* ending
* ';'
*/)
.replaceAll("/", ".")
+ "[]"; // skip ending ';'
break;
}
break;
case JDWPConstants.Tag.OBJECT_TAG:
type = signature
.substring(1, signature.length() - 1 /*
* skip ending
* ';'
*/)
.replaceAll("/", "."); // skip ending ';'
break;
case JDWPConstants.Tag.BOOLEAN_TAG:
type = "boolean";
break;
case JDWPConstants.Tag.BYTE_TAG:
type = "byte";
break;
case JDWPConstants.Tag.CHAR_TAG:
type = "char";
break;
case JDWPConstants.Tag.DOUBLE_TAG:
type = "double";
break;
case JDWPConstants.Tag.FLOAT_TAG:
type = "float";
break;
case JDWPConstants.Tag.INT_TAG:
type = "int";
break;
case JDWPConstants.Tag.LONG_TAG:
type = "long";
break;
case JDWPConstants.Tag.SHORT_TAG:
type = "short";
break;
case JDWPConstants.Tag.STRING_TAG:
type = "string";
break;
default:
break;
}
return type;
}
/**
* Converts Variable object to String.
*
* @see java.lang.Object#toString()
* @return String
*/
public String toString() {
return "Variable: codeIndex=" + codeIndex + ", name=" + name
+ ", signature=" + signature + ", length=" + length
+ ", slot=" + slot + ", tag="
+ JDWPConstants.Tag.getName(tag) + ", type=" + type;
}
/**
* Compares two Variable objects.
*
* @see java.lang.Object#equals(java.lang.Object)
* @return boolean
*/
public boolean equals(Object obj) {
if (!(obj instanceof Variable)) {
return false;
}
if (this.getClass() != obj.getClass()) {
return false;
}
Variable var = (Variable) obj;
return this.codeIndex == var.codeIndex
&& this.name.equals(var.name)
&& this.signature.equals(var.signature)
&& this.length == var.length && this.slot == var.slot
&& this.tag == var.tag && this.type.equals(var.type);
}
}
}