8415 – reflection bug: exception info for Method (original) (raw)

Description Anthony Green 2002-10-31 09:26:01 UTC

libgcj doesn't build proper reflection data for interpreted

classes. The problem is that the format of the names of the exception classes differs between native and interpreted code. For native code we get "LMyException;", and for interpreted code we get "MyException". libgcj is written to expect "LMyException;". What you end up with in Method is a Class[] filled with null instead of a proper array of exception classes.

Release: 3.3 20021031 (experimental)

Environment: System: Linux build.tokyo.redhat.com 2.4.18-14smp #1 SMP Wed Sep 4 12:34:47 EDT 2002 i686 i686 i386 GNU/Linux Architecture: i686

host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: ../../FSF/GCC/HEAD/gcc/configure --prefix=/home/green/latest/i --enable-threads --enable-languages=c,c++,java : (reconfigured)

How-To-Repeat: I don't have a simple test case prepared. However, all you need to do to trigger this is call Method.toString() on a Method of an interpreted class which throws an exception.

Comment 1 Anthony Green 2002-10-31 09:26:01 UTC

Fix: This work-around seems useful for now. Another fix would be to change the format of the meta-data emitted by the compiler.

Index: java/lang/reflect/natMethod.cc

RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/natMethod.cc,v retrieving revision 1.29 diff -2 -c -p -r1.29 natMethod.cc *** java/lang/reflect/natMethod.cc 27 Aug 2002 23:57:17 -0000 1.29 --- java/lang/reflect/natMethod.cc 31 Oct 2002 17:16:00 -0000 *************** java::lang::reflect::Method::getType () *** 208,213 **** jclass *elts = elements (exception_types); for (int i = 0; i < count; ++i) ! elts[i] = _Jv_FindClassFromSignature (method->throws[i]->data, ! declaringClass->getClassLoader ()); }

--- 208,228 ---- jclass *elts = elements (exception_types); for (int i = 0; i < count; ++i) ! { ! char *c = (char *) method->throws[i]->data; ! int len = strlen (c); ! if (c[0] != 'L' && c[len-1] != ';') ! { ! char name[len+3]; ! name[0] = 'L'; ! strcpy (&name[1], c); ! name[len+1] = ';'; ! name[len+2] = 0; ! elts[i] = _Jv_FindClassFromSignature (name, ! declaringClass->getClassLoader ()); ! } ! else ! elts[i] = _Jv_FindClassFromSignature (method->throws[i]->data, ! declaringClass->getClassLoader ()); ! } }

Comment 2 Tom Tromey 2002-11-01 14:42:16 UTC

From: Tom Tromey <tromey@redhat.com> To: Anthony Green <green@build.tokyo.redhat.com> Cc: gcc-gnats@gcc.gnu.org Subject: Re: java/8415: reflection bug: exception info for Method Date: 01 Nov 2002 14:42:16 -0700

Anthony> I don't have a simple test case prepared.

I wrote one. I'll check it in.

Anthony> This work-around seems useful for now. Another fix would be Anthony> to change the format of the meta-data emitted by the Anthony> compiler.

I prefer the latter. I have a patch that I'm testing.

Tom

Comment 4 Tom Tromey 2002-11-02 13:34:27 UTC

Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-Why: I'm handling this

Comment 5 Tom Tromey 2002-11-02 13:34:27 UTC

State-Changed-From-To: open->closed State-Changed-Why: I've checked in the fix