This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: verifier bug fixes


I'm checking this in on the trunk and the 3.3 branch.

This fixes a couple verifier bugs pointed out by some verifier tests
written by Jeroen Frijters.

First, we implemented pop2 incorrectly.  Second, we weren't correctly
checking whether <init> was nonstatic and whether <clinint> was.

There are still verifier bugs remaining, alas, including a couple not
tested by the test suite.

Tom

Index: libjava/ChangeLog
from  Tom Tromey  <tromey at redhat dot com>

	* verify.cc (pop64): Removed.
	(verify_instructions_0) <op_pop2>: Inline code.  Don't throw
	exception if top-of-stack is narrow.
	(initialize_stack): Check to ensure that <init> is not static and
	<clinit> is.

Index: libjava/verify.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/verify.cc,v
retrieving revision 1.48.2.3
diff -u -r1.48.2.3 verify.cc
--- libjava/verify.cc 3 Mar 2003 23:25:07 -0000 1.48.2.3
+++ libjava/verify.cc 11 Apr 2003 01:53:38 -0000
@@ -1202,14 +1202,6 @@
     return r;
   }
 
-  type pop64 ()
-  {
-    type r = pop_raw ();
-    if (! r.iswide ())
-      verify_fail ("wide pop of narrow type");
-    return r;
-  }
-
   type pop_type (type match)
   {
     match.promote ();
@@ -2160,21 +2152,31 @@
   bool initialize_stack ()
   {
     int var = 0;
-    bool is_init = false;
+    bool is_init = _Jv_equalUtf8Consts (current_method->self->name,
+					gcj::init_name);
+    bool is_clinit = _Jv_equalUtf8Consts (current_method->self->name,
+					  gcj::clinit_name);
 
     using namespace java::lang::reflect;
     if (! Modifier::isStatic (current_method->self->accflags))
       {
 	type kurr (current_class);
-	if (_Jv_equalUtf8Consts (current_method->self->name, gcj::init_name))
+	if (is_init)
 	  {
 	    kurr.set_uninitialized (type::SELF, this);
 	    is_init = true;
 	  }
+	else if (is_clinit)
+	  verify_fail ("<clinit> method must be static");
 	set_variable (0, kurr);
 	current_state->set_this_type (kurr);
 	++var;
       }
+    else
+      {
+	if (is_init)
+	  verify_fail ("<init> method must be non-static");
+      }
 
     // We have to handle wide arguments specially here.
     int arg_count = _Jv_count_arguments (current_method->self->signature);
@@ -2525,7 +2527,11 @@
 	    pop32 ();
 	    break;
 	  case op_pop2:
-	    pop64 ();
+	    {
+	      type t = pop_raw ();
+	      if (! t.iswide ())
+		pop32 ();
+	    }
 	    break;
 	  case op_dup:
 	    {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]