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);
}
}