Author: tcurdt Date: Fri Apr 6 10:41:12 2007 New Revision: 526235 URL: http://svn.apache.org/viewvc?view=rev&rev=526235 Log: http://issues.apache.org/bugzilla/show_bug.cgi?id=40577
Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java?view=diff&rev=526235&r1=526234&r2=526235 ============================================================================== --- jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java (original) +++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java Fri Apr 6 10:41:12 2007 @@ -23,13 +23,17 @@ import java.util.List; import java.util.Random; import java.util.Vector; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETFIELD; import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InvokeInstruction; import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LoadInstruction; import org.apache.bcel.generic.MethodGen; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.RET; @@ -40,6 +44,7 @@ import org.apache.bcel.verifier.VerificationResult; import org.apache.bcel.verifier.Verifier; import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; /** @@ -126,7 +131,7 @@ * The proof of termination is about the existence of a * fix point of frame merging. */ - private void circulationPump(ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ + private void circulationPump(MethodGen m,ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ final Random random = new Random(); InstructionContextQueue icq = new InstructionContextQueue(); @@ -246,6 +251,44 @@ this.addMessage("Warning: ReturnInstruction '"+ic+"' may leave method with an uninitialized object on the operand stack '"+os+"'."); } } + //see JVM $4.8.2 + //TODO implement all based on stack + Type returnedType = null; + if( ih.getPrev().getInstruction() instanceof InvokeInstruction ) + { + returnedType = ((InvokeInstruction)ih.getPrev().getInstruction()).getType(m.getConstantPool()); + } + if( ih.getPrev().getInstruction() instanceof LoadInstruction ) + { + int index = ((LoadInstruction)ih.getPrev().getInstruction()).getIndex(); + returnedType = lvs.get(index); + } + if( ih.getPrev().getInstruction() instanceof GETFIELD ) + { + returnedType = ((GETFIELD)ih.getPrev().getInstruction()).getType(m.getConstantPool()); + } + if( returnedType != null ) + { + if( returnedType instanceof ObjectType ) + { + try + { + if( !((ObjectType)returnedType).isAssignmentCompatibleWith(m.getReturnType()) ) + { + throw new StructuralCodeConstraintException("Returned type "+returnedType+" does not match Method's return type "+m.getReturnType()); + } + } + catch (ClassNotFoundException e) + { + //dont know what do do now, so raise RuntimeException + throw new RuntimeException(e); + } + } + else if( !returnedType.equals(m.getReturnType()) ) + { + throw new StructuralCodeConstraintException("Returned type "+returnedType+" does not match Method's return type "+m.getReturnType()); + } + } } }while ((ih = ih.getNext()) != null); @@ -321,7 +364,7 @@ f.getLocals().set(twoslotoffset + j + (mg.isStatic()?0:1), Type.UNKNOWN); } } - circulationPump(cfg, cfg.contextOf(mg.getInstructionList().getStart()), f, icv, ev); + circulationPump(mg,cfg, cfg.contextOf(mg.getInstructionList().getStart()), f, icv, ev); } } catch (VerifierConstraintViolatedException ce){ Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java?view=diff&rev=526235&r1=526234&r2=526235 ============================================================================== --- jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java (original) +++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java Fri Apr 6 10:41:12 2007 @@ -565,7 +565,7 @@ return s; } } -System.err.println("DEBUG: Please verify '"+any+"' lies in dead code."); +System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead code."); return null; //throw new AssertionViolatedException("No subroutine for InstructionHandle found (DEAD CODE?)."); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]