blob: d6ba921d4ce70c4af6cd36ec42808ee75ebdd695 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdi.internal;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import org.eclipse.jdi.internal.jdwp.JdwpFieldID;
import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.Field;
import com.sun.jdi.Type;
/**
* this class implements the corresponding interfaces declared by the JDI
* specification. See the com.sun.jdi package for more information.
*
*/
public class FieldImpl extends TypeComponentImpl implements Field {
/** ID that corresponds to this reference. */
private JdwpFieldID fFieldID;
private Type fType;
private String fTypeName;
/**
* Creates new FieldImpl.
*/
public FieldImpl(VirtualMachineImpl vmImpl,
ReferenceTypeImpl declaringType, JdwpFieldID ID, String name,
String signature, String genericSignature, int modifierBits) {
super(
"Field", vmImpl, declaringType, name, signature, genericSignature, modifierBits); //$NON-NLS-1$
fFieldID = ID;
}
/**
* Flushes all stored Jdwp results.
*/
public void flushStoredJdwpResults() {
// Note that no results are cached.
}
/**
* @return Returns fieldID of field.
*/
public JdwpFieldID getFieldID() {
return fFieldID;
}
/**
* @return Returns true if two mirrors refer to the same entity in the
* target VM.
* @see java.lang.Object#equals(Object)
*/
@Override
public boolean equals(Object object) {
return object != null
&& object.getClass().equals(this.getClass())
&& fFieldID.equals(((FieldImpl) object).fFieldID)
&& referenceTypeImpl().equals(
((FieldImpl) object).referenceTypeImpl());
}
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(Field object) {
if (object == null || !object.getClass().equals(this.getClass()))
throw new ClassCastException(JDIMessages.FieldImpl_Can__t_compare_field_to_given_object_1);
// See if declaring types are the same, if not return comparison between
// declaring types.
Field type2 = object;
if (!declaringType().equals(type2.declaringType()))
return declaringType().compareTo(type2.declaringType());
// Return comparison of position within declaring type.
int index1 = declaringType().fields().indexOf(this);
int index2 = type2.declaringType().fields().indexOf(type2);
if (index1 < index2)
return -1;
else if (index1 > index2)
return 1;
else
return 0;
}
/**
* @return Returns the hash code value.
*/
@Override
public int hashCode() {
return fFieldID.hashCode();
}
/**
* @return Returns a text representation of the declared type.
*/
@Override
public String typeName() {
if (fTypeName == null) {
fTypeName = TypeImpl.signatureToName(signature());
}
return fTypeName;
}
/**
* @return Returns the type of the this Field.
*/
@Override
public Type type() throws ClassNotLoadedException {
if (fType == null) {
fType = TypeImpl.create(virtualMachineImpl(), signature(),
declaringType().classLoader());
}
return fType;
}
/**
* @return Returns true if object is transient.
*/
@Override
public boolean isTransient() {
return (fModifierBits & MODIFIER_ACC_TRANSIENT) != 0;
}
/**
* @return Returns true if object is volatile.
*/
@Override
public boolean isVolatile() {
return (fModifierBits & MODIFIER_ACC_VOLITILE) != 0;
}
/**
* Writes JDWP representation.
*/
public void write(MirrorImpl target, DataOutputStream out)
throws IOException {
fFieldID.write(out);
if (target.fVerboseWriter != null)
target.fVerboseWriter.println("field", fFieldID.value()); //$NON-NLS-1$
}
/**
* Writes JDWP representation, including ReferenceType.
*/
public void writeWithReferenceType(MirrorImpl target, DataOutputStream out)
throws IOException {
// See EventRequest case FieldOnly
referenceTypeImpl().write(target, out);
write(target, out);
}
/**
* @return Reads JDWP representation and returns new instance.
*/
public static FieldImpl readWithReferenceTypeWithTag(MirrorImpl target,
DataInputStream in) throws IOException {
VirtualMachineImpl vmImpl = target.virtualMachineImpl();
// See Events FIELD_ACCESS and FIELD_MODIFICATION (refTypeTag + typeID +
// fieldID).
ReferenceTypeImpl referenceType = ReferenceTypeImpl.readWithTypeTag(
target, in);
if (referenceType == null)
return null;
JdwpFieldID ID = new JdwpFieldID(vmImpl);
ID.read(in);
if (target.fVerboseWriter != null)
target.fVerboseWriter.println("field", ID.value()); //$NON-NLS-1$
if (ID.isNull())
return null;
FieldImpl field = referenceType.findField(ID);
if (field == null)
throw new InternalError(
JDIMessages.FieldImpl_Got_FieldID_of_ReferenceType_that_is_not_a_member_of_the_ReferenceType_2);
return field;
}
/**
* @return Reads JDWP representation and returns new instance.
*/
public static FieldImpl readWithNameSignatureModifiers(
ReferenceTypeImpl target, ReferenceTypeImpl referenceType,
boolean withGenericSignature, DataInputStream in)
throws IOException {
VirtualMachineImpl vmImpl = target.virtualMachineImpl();
JdwpFieldID ID = new JdwpFieldID(vmImpl);
ID.read(in);
if (target.fVerboseWriter != null)
target.fVerboseWriter.println("field", ID.value()); //$NON-NLS-1$
if (ID.isNull())
return null;
String name = target.readString("name", in); //$NON-NLS-1$
String signature = target.readString("signature", in); //$NON-NLS-1$
String genericSignature = null;
if (withGenericSignature) {
genericSignature = target.readString("generic signature", in); //$NON-NLS-1$
if ("".equals(genericSignature)) { //$NON-NLS-1$
genericSignature = null;
}
}
int modifierBits = target.readInt(
"modifiers", AccessibleImpl.getModifierStrings(), in); //$NON-NLS-1$
FieldImpl mirror = new FieldImpl(vmImpl, referenceType, ID, name,
signature, genericSignature, modifierBits);
return mirror;
}
@Override
public boolean isEnumConstant() {
return (fModifierBits & MODIFIER_ACC_ENUM) != 0;
}
}