This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: FYI: verifier bug fixes
- From: Tom Tromey <tromey at redhat dot com>
- To: GCC libjava patches <java-patches at gcc dot gnu dot org>
- Date: 10 Apr 2003 19:50:16 -0600
- Subject: Patch: FYI: verifier bug fixes
- Reply-to: tromey at redhat dot com
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:
{