Mercurial > hg > graal-jvmci-8
diff jvmci/jdk.vm.ci.code/src/jdk/vm/ci/code/BytecodeFrame.java @ 23700:9e1235406b59
[Findbugs] various warnings reported for JVMCI sources (JDK-8159613)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Sat, 18 Jun 2016 13:19:01 +0200 |
parents | 1d4ce2d19e52 |
children | 9ac04c6047c8 |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.code/src/jdk/vm/ci/code/BytecodeFrame.java Fri Jun 17 19:13:02 2016 +0200 +++ b/jvmci/jdk.vm.ci.code/src/jdk/vm/ci/code/BytecodeFrame.java Sat Jun 18 13:19:01 2016 +0200 @@ -34,7 +34,7 @@ * where to find the local variables, operand stack values and locked objects of the bytecode * frame(s). */ -public class BytecodeFrame extends BytecodePosition { +public final class BytecodeFrame extends BytecodePosition { /** * An array of values representing how to reconstruct the state of the Java frame. This is array @@ -65,14 +65,18 @@ * <p> * Note that the number of locals and the number of stack slots may be smaller than the maximum * number of locals and stack slots as specified in the compiled method. + * + * This field is intentional exposed as a mutable array that a compiler may modify (e.g. during + * register allocation). */ + @SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "field is intentional mutable")// public final JavaValue[] values; /** - * An array describing the Java kind of the {@link #values}. It records a kind for the locals - * and the operand stack. + * An array describing the Java kinds in {@link #values}. It records a kind for the locals and + * the operand stack. */ - public final JavaKind[] slotKinds; + private final JavaKind[] slotKinds; /** * The number of locals in the values array. @@ -178,11 +182,14 @@ * @param bci a BCI within the method * @param rethrowException specifies if the VM should re-throw the pending exception when * deopt'ing using this frame - * @param values the frame state {@link #values} + * @param values the frame state {@link #values}. + * @param slotKinds the kinds in {@code values}. This array is now owned by this object and must + * not be mutated by the caller. * @param numLocals the number of local variables * @param numStack the depth of the stack * @param numLocks the number of locked objects */ + @SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "caller transfers ownership of `slotKinds`") public BytecodeFrame(BytecodeFrame caller, ResolvedJavaMethod method, int bci, boolean rethrowException, boolean duringCall, JavaValue[] values, JavaKind[] slotKinds, int numLocals, int numStack, int numLocks) { super(caller, method, bci); @@ -219,12 +226,44 @@ } /** + * Gets the kind of a local variable. + * + * @param i the local variable to query + * @return the kind of local variable {@code i} + * @throw {@link IndexOutOfBoundsException} if {@code i < 0 || i >= this.numLocals} + */ + public JavaKind getLocalValueKind(int i) { + if (i < 0 || i >= numLocals) { + throw new IndexOutOfBoundsException(); + } + return slotKinds[i]; + } + + /** + * Gets the kind of a stack slot. + * + * @param i the local variable to query + * @return the kind of stack slot {@code i} + * @throw {@link IndexOutOfBoundsException} if {@code i < 0 || i >= this.numStack} + */ + public JavaKind getStackValueKind(int i) { + if (i < 0 || i >= numStack) { + throw new IndexOutOfBoundsException(); + } + return slotKinds[i + numLocals]; + } + + /** * Gets the value representing the specified local variable. * * @param i the local variable index * @return the value that can be used to reconstruct the local's current value + * @throw {@link IndexOutOfBoundsException} if {@code i < 0 || i >= this.numLocals} */ public JavaValue getLocalValue(int i) { + if (i < 0 || i >= numLocals) { + throw new IndexOutOfBoundsException(); + } return values[i]; } @@ -233,8 +272,12 @@ * * @param i the stack index * @return the value that can be used to reconstruct the stack slot's current value + * @throw {@link IndexOutOfBoundsException} if {@code i < 0 || i >= this.numStack} */ public JavaValue getStackValue(int i) { + if (i < 0 || i >= numStack) { + throw new IndexOutOfBoundsException(); + } return values[i + numLocals]; } @@ -243,8 +286,12 @@ * * @param i the lock index * @return the value that can be used to reconstruct the lock's current value + * @throw {@link IndexOutOfBoundsException} if {@code i < 0 || i >= this.numLocks} */ public JavaValue getLockValue(int i) { + if (i < 0 || i >= numLocks) { + throw new IndexOutOfBoundsException(); + } return values[i + numLocals + numStack]; } @@ -258,6 +305,11 @@ } @Override + public int hashCode() { + return (numLocals + 1) ^ (numStack + 11) ^ (numLocks + 7); + } + + @Override public boolean equals(Object obj) { if (this == obj) { return true;