Patch: FYI: verifier bug fix

Tom Tromey tromey@redhat.com
Sun Jan 27 16:46:00 GMT 2002


I'm checking this in.

I think this fixes the verifier bug that Per reported on the main
list.  It also removes some old comments, fixes a class loader
problem, and finally adds a bit more debugging output.

I think the approach of attaching the subroutine to each instruction
is still ok.  In this situation the problem was that we were looking
at an "unmerged ret".  In this situation the returned-to instruction
will not have a subroutine marked (since it hasn't been processed via
normal flow yet).  If we see we're doing this sort of merge, we can
simply ignore the subroutine info in the unmerged ret state.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* verify.cc (class _Jv_BytecodeVerifier): Removed `FIXME' comment
	and to-do list.
	(state::merge): Use current class' class loader.
	(state::print): Print subroutine.
	(state::merge): Don't look at subroutine of unmerged `ret'.

Index: verify.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/verify.cc,v
retrieving revision 1.28
diff -u -r1.28 verify.cc
--- verify.cc 2002/01/26 06:32:55 1.28
+++ verify.cc 2002/01/28 00:38:38
@@ -31,14 +31,7 @@
 #include <stdio.h>
 #endif /* VERIFY_DEBUG */
 
-// TO DO
-// * read more about when classes must be loaded
-// * class loader madness
-// * Lots and lots of debugging and testing
-// * type representation is still ugly.  look for the big switches
-// * at least one GC problem :-(
 
-
 static void debug_print (const char *fmt, ...)
   __attribute__ ((format (printf, 1, 2)));
 
@@ -608,7 +601,8 @@
     }
 
     // Merge OLD_TYPE into this.  On error throw exception.
-    bool merge (type& old_type, bool local_semantics, _Jv_BytecodeVerifier *verifier)
+    bool merge (type& old_type, bool local_semantics,
+		_Jv_BytecodeVerifier *verifier)
     {
       bool changed = false;
       bool refo = old_type.isreference ();
@@ -671,8 +665,9 @@
 		    {
 		      while (arraycount > 0)
 			{
-			  // FIXME: Class loader.
-			  k = _Jv_GetArrayClass (k, NULL);
+			  java::lang::ClassLoader *loader
+			    = verifier->current_class->getClassLoader();
+			  k = _Jv_GetArrayClass (k, loader);
 			  --arraycount;
 			}
 		      data.klass = k;
@@ -903,7 +898,10 @@
 	  subroutine = state_old->subroutine;
 	  changed = true;
 	}
-      else
+      // If we're handling the result of an unmerged `ret', then we
+      // can't trust that it has the correct PC setting.  So in this
+      // case we ignore what might otherwise look like a merge error.
+      else if (! state_old->is_unmerged_ret_state (max_locals))
 	verifier->verify_fail ("subroutines merged");
 
       // Merge stacks.
@@ -1013,7 +1011,11 @@
       debug_print ("    [local] ");
       for (i = 0; i < max_locals; ++i)
 	locals[i].print ();
-      debug_print ("   | %p\n", this);
+      if (subroutine == 0)
+	debug_print ("   | None");
+      else
+	debug_print ("   | %4d", subroutine);
+      debug_print (" | %p\n", this);
     }
 #else
     inline void print (const char *, int, int, int) const
@@ -2335,7 +2337,6 @@
 	    break;
 	  case op_dup2_x2:
 	    {
-	      // FIXME
 	      type t1 = pop_raw ();
 	      if (t1.iswide ())
 		{



More information about the Java-patches mailing list