src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/BasicVerifier.java

Print this page

        

*** 74,94 **** * @author Bing Ran */ public class BasicVerifier extends BasicInterpreter { public BasicVerifier() { ! super(ASM4); } protected BasicVerifier(final int api) { super(api); } @Override ! public BasicValue copyOperation(final AbstractInsnNode insn, final BasicValue value) ! throws AnalyzerException ! { Value expected; switch (insn.getOpcode()) { case ILOAD: case ISTORE: expected = BasicValue.INT_VALUE; --- 74,93 ---- * @author Bing Ran */ public class BasicVerifier extends BasicInterpreter { public BasicVerifier() { ! super(ASM5); } protected BasicVerifier(final int api) { super(api); } @Override ! public BasicValue copyOperation(final AbstractInsnNode insn, ! final BasicValue value) throws AnalyzerException { Value expected; switch (insn.getOpcode()) { case ILOAD: case ISTORE: expected = BasicValue.INT_VALUE;
*** 105,128 **** case DSTORE: expected = BasicValue.DOUBLE_VALUE; break; case ALOAD: if (!value.isReference()) { ! throw new AnalyzerException(insn, ! null, ! "an object reference", value); } return value; case ASTORE: if (!value.isReference() ! && !BasicValue.RETURNADDRESS_VALUE.equals(value)) ! { ! throw new AnalyzerException(insn, ! null, ! "an object reference or a return address", ! value); } return value; default: return value; } --- 104,122 ---- case DSTORE: expected = BasicValue.DOUBLE_VALUE; break; case ALOAD: if (!value.isReference()) { ! throw new AnalyzerException(insn, null, "an object reference", value); } return value; case ASTORE: if (!value.isReference() ! && !BasicValue.RETURNADDRESS_VALUE.equals(value)) { ! throw new AnalyzerException(insn, null, ! "an object reference or a return address", value); } return value; default: return value; }
*** 131,143 **** } return value; } @Override ! public BasicValue unaryOperation(final AbstractInsnNode insn, final BasicValue value) ! throws AnalyzerException ! { BasicValue expected; switch (insn.getOpcode()) { case INEG: case IINC: case I2F: --- 125,136 ---- } return value; } @Override ! public BasicValue unaryOperation(final AbstractInsnNode insn, ! final BasicValue value) throws AnalyzerException { BasicValue expected; switch (insn.getOpcode()) { case INEG: case IINC: case I2F:
*** 179,203 **** case D2L: case DRETURN: expected = BasicValue.DOUBLE_VALUE; break; case GETFIELD: ! expected = newValue(Type.getObjectType(((FieldInsnNode) insn).owner)); break; case CHECKCAST: if (!value.isReference()) { ! throw new AnalyzerException(insn, ! null, ! "an object reference", value); } return super.unaryOperation(insn, value); case ARRAYLENGTH: if (!isArrayValue(value)) { ! throw new AnalyzerException(insn, ! null, ! "an array reference", value); } return super.unaryOperation(insn, value); case ARETURN: case ATHROW: --- 172,193 ---- case D2L: case DRETURN: expected = BasicValue.DOUBLE_VALUE; break; case GETFIELD: ! expected = newValue(Type ! .getObjectType(((FieldInsnNode) insn).owner)); break; case CHECKCAST: if (!value.isReference()) { ! throw new AnalyzerException(insn, null, "an object reference", value); } return super.unaryOperation(insn, value); case ARRAYLENGTH: if (!isArrayValue(value)) { ! throw new AnalyzerException(insn, null, "an array reference", value); } return super.unaryOperation(insn, value); case ARETURN: case ATHROW:
*** 205,217 **** case MONITORENTER: case MONITOREXIT: case IFNULL: case IFNONNULL: if (!value.isReference()) { ! throw new AnalyzerException(insn, ! null, ! "an object reference", value); } return super.unaryOperation(insn, value); case PUTSTATIC: expected = newValue(Type.getType(((FieldInsnNode) insn).desc)); --- 195,205 ---- case MONITORENTER: case MONITOREXIT: case IFNULL: case IFNONNULL: if (!value.isReference()) { ! throw new AnalyzerException(insn, null, "an object reference", value); } return super.unaryOperation(insn, value); case PUTSTATIC: expected = newValue(Type.getType(((FieldInsnNode) insn).desc));
*** 224,238 **** } return super.unaryOperation(insn, value); } @Override ! public BasicValue binaryOperation( ! final AbstractInsnNode insn, ! final BasicValue value1, ! final BasicValue value2) throws AnalyzerException ! { BasicValue expected1; BasicValue expected2; switch (insn.getOpcode()) { case IALOAD: expected1 = newValue(Type.getType("[I")); --- 212,224 ---- } return super.unaryOperation(insn, value); } @Override ! public BasicValue binaryOperation(final AbstractInsnNode insn, ! final BasicValue value1, final BasicValue value2) ! throws AnalyzerException { BasicValue expected1; BasicValue expected2; switch (insn.getOpcode()) { case IALOAD: expected1 = newValue(Type.getType("[I"));
*** 340,367 **** break; default: throw new Error("Internal error."); } if (!isSubTypeOf(value1, expected1)) { ! throw new AnalyzerException(insn, "First argument", expected1, value1); } else if (!isSubTypeOf(value2, expected2)) { ! throw new AnalyzerException(insn, "Second argument", expected2, value2); } if (insn.getOpcode() == AALOAD) { return getElementValue(value1); } else { return super.binaryOperation(insn, value1, value2); } } @Override ! public BasicValue ternaryOperation( ! final AbstractInsnNode insn, ! final BasicValue value1, ! final BasicValue value2, ! final BasicValue value3) throws AnalyzerException ! { BasicValue expected1; BasicValue expected3; switch (insn.getOpcode()) { case IASTORE: expected1 = newValue(Type.getType("[I")); --- 326,352 ---- break; default: throw new Error("Internal error."); } if (!isSubTypeOf(value1, expected1)) { ! throw new AnalyzerException(insn, "First argument", expected1, ! value1); } else if (!isSubTypeOf(value2, expected2)) { ! throw new AnalyzerException(insn, "Second argument", expected2, ! value2); } if (insn.getOpcode() == AALOAD) { return getElementValue(value1); } else { return super.binaryOperation(insn, value1, value2); } } @Override ! public BasicValue ternaryOperation(final AbstractInsnNode insn, ! final BasicValue value1, final BasicValue value2, ! final BasicValue value3) throws AnalyzerException { BasicValue expected1; BasicValue expected3; switch (insn.getOpcode()) { case IASTORE: expected1 = newValue(Type.getType("[I"));
*** 401,488 **** break; default: throw new Error("Internal error."); } if (!isSubTypeOf(value1, expected1)) { ! throw new AnalyzerException(insn, "First argument", "a " + expected1 ! + " array reference", value1); } else if (!BasicValue.INT_VALUE.equals(value2)) { throw new AnalyzerException(insn, "Second argument", ! BasicValue.INT_VALUE, ! value2); } else if (!isSubTypeOf(value3, expected3)) { ! throw new AnalyzerException(insn, "Third argument", expected3, value3); } return null; } @Override ! public BasicValue naryOperation(final AbstractInsnNode insn, final List<? extends BasicValue> values) ! throws AnalyzerException ! { int opcode = insn.getOpcode(); if (opcode == MULTIANEWARRAY) { for (int i = 0; i < values.size(); ++i) { if (!BasicValue.INT_VALUE.equals(values.get(i))) { ! throw new AnalyzerException(insn, ! null, ! BasicValue.INT_VALUE, ! values.get(i)); } } } else { int i = 0; int j = 0; if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) { Type owner = Type.getObjectType(((MethodInsnNode) insn).owner); if (!isSubTypeOf(values.get(i++), newValue(owner))) { throw new AnalyzerException(insn, "Method owner", ! newValue(owner), ! values.get(0)); } } ! String desc = (opcode == INVOKEDYNAMIC)? ! ((InvokeDynamicInsnNode) insn).desc: ! ((MethodInsnNode) insn).desc; Type[] args = Type.getArgumentTypes(desc); while (i < values.size()) { BasicValue expected = newValue(args[j++]); BasicValue encountered = values.get(i++); if (!isSubTypeOf(encountered, expected)) { ! throw new AnalyzerException(insn, ! "Argument " + j, ! expected, ! encountered); } } } return super.naryOperation(insn, values); } @Override ! public void returnOperation( ! final AbstractInsnNode insn, ! final BasicValue value, ! final BasicValue expected) throws AnalyzerException ! { if (!isSubTypeOf(value, expected)) { ! throw new AnalyzerException(insn, ! "Incompatible return type", ! expected, ! value); } } protected boolean isArrayValue(final BasicValue value) { return value.isReference(); } protected BasicValue getElementValue(final BasicValue objectArrayValue) ! throws AnalyzerException ! { return BasicValue.REFERENCE_VALUE; } ! protected boolean isSubTypeOf(final BasicValue value, final BasicValue expected) { return value.equals(expected); } } --- 386,462 ---- break; default: throw new Error("Internal error."); } if (!isSubTypeOf(value1, expected1)) { ! throw new AnalyzerException(insn, "First argument", "a " ! + expected1 + " array reference", value1); } else if (!BasicValue.INT_VALUE.equals(value2)) { throw new AnalyzerException(insn, "Second argument", ! BasicValue.INT_VALUE, value2); } else if (!isSubTypeOf(value3, expected3)) { ! throw new AnalyzerException(insn, "Third argument", expected3, ! value3); } return null; } @Override ! public BasicValue naryOperation(final AbstractInsnNode insn, ! final List<? extends BasicValue> values) throws AnalyzerException { int opcode = insn.getOpcode(); if (opcode == MULTIANEWARRAY) { for (int i = 0; i < values.size(); ++i) { if (!BasicValue.INT_VALUE.equals(values.get(i))) { ! throw new AnalyzerException(insn, null, ! BasicValue.INT_VALUE, values.get(i)); } } } else { int i = 0; int j = 0; if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) { Type owner = Type.getObjectType(((MethodInsnNode) insn).owner); if (!isSubTypeOf(values.get(i++), newValue(owner))) { throw new AnalyzerException(insn, "Method owner", ! newValue(owner), values.get(0)); } } ! String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc ! : ((MethodInsnNode) insn).desc; Type[] args = Type.getArgumentTypes(desc); while (i < values.size()) { BasicValue expected = newValue(args[j++]); BasicValue encountered = values.get(i++); if (!isSubTypeOf(encountered, expected)) { ! throw new AnalyzerException(insn, "Argument " + j, ! expected, encountered); } } } return super.naryOperation(insn, values); } @Override ! public void returnOperation(final AbstractInsnNode insn, ! final BasicValue value, final BasicValue expected) ! throws AnalyzerException { if (!isSubTypeOf(value, expected)) { ! throw new AnalyzerException(insn, "Incompatible return type", ! expected, value); } } protected boolean isArrayValue(final BasicValue value) { return value.isReference(); } protected BasicValue getElementValue(final BasicValue objectArrayValue) ! throws AnalyzerException { return BasicValue.REFERENCE_VALUE; } ! protected boolean isSubTypeOf(final BasicValue value, ! final BasicValue expected) { return value.equals(expected); } }