in src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java [327:402]
public VerificationResult do_verify() {
if (!myOwner.doPass3a(methodNo).equals(VerificationResult.VR_OK)) {
return VerificationResult.VR_NOTYET;
}
// Pass 3a ran before, so it's safe to assume the JavaClass object is
// in the BCEL repository.
JavaClass jc;
try {
jc = Repository.lookupClass(myOwner.getClassName());
} catch (final ClassNotFoundException e) {
// FIXME: maybe not the best way to handle this
throw new AssertionViolatedException("Missing class: " + e, e);
}
final ConstantPoolGen constantPoolGen = new ConstantPoolGen(jc.getConstantPool());
// Init Visitors
final InstConstraintVisitor icv = new InstConstraintVisitor();
icv.setConstantPoolGen(constantPoolGen);
final ExecutionVisitor ev = new ExecutionVisitor();
ev.setConstantPoolGen(constantPoolGen);
final Method[] methods = jc.getMethods(); // Method no "methodNo" exists, we ran Pass3a before on it!
try {
final MethodGen mg = new MethodGen(methods[methodNo], myOwner.getClassName(), constantPoolGen);
icv.setMethodGen(mg);
////////////// DFA BEGINS HERE ////////////////
if (!(mg.isAbstract() || mg.isNative())) { // IF mg HAS CODE (See pass 2)
final ControlFlowGraph cfg = new ControlFlowGraph(mg);
// Build the initial frame situation for this method.
final Frame f = new Frame(mg.getMaxLocals(), mg.getMaxStack());
if (!mg.isStatic()) {
if (mg.getName().equals(Const.CONSTRUCTOR_NAME)) {
Frame.setThis(new UninitializedObjectType(ObjectType.getInstance(jc.getClassName())));
f.getLocals().set(0, Frame.getThis());
} else {
Frame.setThis(null);
f.getLocals().set(0, ObjectType.getInstance(jc.getClassName()));
}
}
final Type[] argtypes = mg.getArgumentTypes();
int twoslotoffset = 0;
for (int j = 0; j < argtypes.length; j++) {
if (argtypes[j] == Type.SHORT || argtypes[j] == Type.BYTE || argtypes[j] == Type.CHAR || argtypes[j] == Type.BOOLEAN) {
argtypes[j] = Type.INT;
}
f.getLocals().set(twoslotoffset + j + (mg.isStatic() ? 0 : 1), argtypes[j]);
if (argtypes[j].getSize() == 2) {
twoslotoffset++;
f.getLocals().set(twoslotoffset + j + (mg.isStatic() ? 0 : 1), Type.UNKNOWN);
}
}
circulationPump(mg, cfg, cfg.contextOf(mg.getInstructionList().getStart()), f, icv, ev);
}
} catch (final VerifierConstraintViolatedException ce) {
ce.extendMessage("Constraint violated in method '" + methods[methodNo] + "':\n", "");
return new VerificationResult(VerificationResult.VERIFIED_REJECTED, ce.getMessage());
} catch (final RuntimeException re) {
// These are internal errors
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
re.printStackTrace(pw);
throw new AssertionViolatedException("Some RuntimeException occurred while verify()ing class '" + jc.getClassName() + "', method '"
+ methods[methodNo] + "'. Original RuntimeException's stack trace:\n---\n" + sw + "---\n", re);
}
return VerificationResult.VR_OK;
}