/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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.osgi.util.NLS; import com.sun.jdi.AbsentInformationException; import com.sun.jdi.Locatable; import com.sun.jdi.Location; import com.sun.jdi.Method; import com.sun.jdi.ReferenceType; /** * this class implements the corresponding interfaces declared by the JDI * specification. See the com.sun.jdi package for more information. * */ public class LocationImpl extends MirrorImpl implements Location { /** Line nr used if line numbers are not available. */ public static final int LINE_NR_NOT_AVAILABLE = -1; /** Method that holds the location. */ MethodImpl fMethod; /** * Index of location within the method, note: this value must be treated as * UNSIGNED! */ long fIndex; /** * Creates new instance. */ public LocationImpl(VirtualMachineImpl vmImpl, MethodImpl method, long index) { super("Location", vmImpl); //$NON-NLS-1$ fMethod = method; fIndex = index; } /** * @return Returns the code position within this location's method. */ @Override public long codeIndex() { return fIndex; } /** * @return Returns the type to which this Location belongs. */ @Override public ReferenceType declaringType() { return fMethod.declaringType(); } /** * @return Returns the hash code value. */ @Override public int hashCode() { return fMethod.hashCode() + (int) fIndex; } /** * @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) { if (object != null && object.getClass().equals(this.getClass())) { LocationImpl loc = (LocationImpl) object; return fMethod.equals(loc.fMethod) && fIndex == loc.fIndex; } return false; } /* (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(Locatable locatable) { if (locatable == null || !locatable.getClass().equals(this.getClass())) throw new ClassCastException( JDIMessages.LocationImpl_Can__t_compare_location_to_given_object_1); // See if methods are the same, if not return comparison between // methods. LocationImpl location2 = (LocationImpl) locatable; if (!method().equals(location2.method())) return method().compareTo(location2.method()); // Return comparison between code-indexes. // Code indexes must be treated as unsigned. This matters if you have to // compare them. if (codeIndex() < 0 || location2.codeIndex() < 0) throw new InternalError( JDIMessages.LocationImpl_Code_indexes_are_assumed_to_be_always_positive_2); if (codeIndex() < location2.codeIndex()) return -1; else if (codeIndex() > location2.codeIndex()) return 1; else return 0; } /** * @return Returns an int specifying the line in the source, return -1 if * the information is not available. */ @Override public int lineNumber() { return lineNumber(virtualMachine().getDefaultStratum()); } /** * @return Returns the Method if this location is in a method. */ @Override public Method method() { return fMethod; } /** * @return a string specifying the source. */ @Override public String sourceName() throws AbsentInformationException { return sourceName(virtualMachine().getDefaultStratum()); } /** * @return Returns description of Mirror object. */ @Override public String toString() { try { return NLS.bind(JDIMessages.LocationImpl_sourcename___0___line___1__3, new String[] { sourceName(), Integer.toString(lineNumber()) }); } catch (Exception e) { return fDescription; } } /** * Writes JDWP representation. */ public void write(MirrorImpl target, DataOutputStream out) throws IOException { fMethod.writeWithReferenceTypeWithTag(target, out); target.writeLong(fIndex, "index", out); //$NON-NLS-1$ } /** * @return Reads JDWP representation and returns new instance. */ public static LocationImpl read(MirrorImpl target, DataInputStream in) throws IOException { VirtualMachineImpl vmImpl = target.virtualMachineImpl(); // Notice that Locations are not stored or cached because they don't // 'remember' any information. MethodImpl method = MethodImpl.readWithReferenceTypeWithTag(target, in); long index = target.readLong("index", in); //$NON-NLS-1$ if (method == null) { return null; } return new LocationImpl(vmImpl, method, index); } /** * @see Location#lineNumber(String) */ @Override public int lineNumber(String stratum) { return fMethod.referenceTypeImpl().lineNumber(fIndex, fMethod, stratum); } /** * @see Location#sourceName(String) */ @Override public String sourceName(String stratum) throws AbsentInformationException { return fMethod.referenceTypeImpl().sourceName(fIndex, fMethod, stratum); } /** * @see Location#sourcePath(String) */ @Override public String sourcePath(String stratum) throws AbsentInformationException { return fMethod.referenceTypeImpl().sourcePath(fIndex, fMethod, stratum); } /** * @see Location#sourcePath() */ @Override public String sourcePath() throws AbsentInformationException { return sourcePath(virtualMachine().getDefaultStratum()); } }