package annotations.el; import annotations.util.Hasher; /*>>> import org.checkerframework.checker.nullness.qual.*; */ /** * A {@link LocalLocation} holds location information for a local * variable: slot index, scope start, and scope length. */ public final class LocalLocation { /** * The slot index of the local variable. */ public final int index; /** * The start of the local variable's scope (or live range), as an offset * from the beginning of the method code in bytes. */ public final int scopeStart; /** * The length of the local variable's scope (or live range), in bytes. */ public final int scopeLength; /** * Constructs a new {@link LocalLocation}; the arguments are assigned to * the fields of the same names. */ public LocalLocation(int index, int scopeStart, int scopeLength) { this.index = index; this.scopeStart = scopeStart; this.scopeLength = scopeLength; this.varName = null; this.varIndex = -1; } public final String varName; public final int varIndex; public LocalLocation(String varName, int varIndex) { this.index = -1; this.scopeStart = -1; this.scopeLength = -1; this.varName = varName; this.varIndex = varIndex; } /** * Returns whether this {@link LocalLocation} equals <code>o</code>; a * slightly faster variant of {@link #equals(Object)} for when the argument * is statically known to be another nonnull {@link LocalLocation}. */ public boolean equals(LocalLocation l) { return index == l.index && scopeStart == l.scopeStart && scopeLength == l.scopeLength && (varName==null || varName.equals(l.varName)) && varIndex==l.varIndex; } /** * This {@link LocalLocation} equals <code>o</code> if and only if * <code>o</code> is another nonnull {@link LocalLocation} and * <code>this</code> and <code>o</code> have equal {@link #index}, * {@link #scopeStart}, and {@link #scopeLength}. */ @Override public boolean equals(Object o) { return o instanceof LocalLocation && equals((LocalLocation) o); } /** * {@inheritDoc} */ @Override public int hashCode() { Hasher h = new Hasher(); if (varName==null) { h.mash(index); h.mash(scopeStart); h.mash(scopeLength); } else { h.mash(varName.hashCode()); h.mash(varIndex); } return h.hash; } @Override public String toString() { if (varName==null) { return "LocalLocation(" + index + ", " + scopeStart + ", " + scopeLength + ")"; } else { return "LocalLocation(\"" + varName + "\" #" + varIndex + ")"; } } }