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 interpretedclasses. 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