Hi Christian,

On Wed, 2006-03-01 at 11:15 +0100, Christian Thalinger wrote:
> The problem is around ResourceBundle.java:480, or better, at
> Class.java:1136.  As you can see, the class contructor throws a NPE, but
> ResourceBundle.tryBundle does only catch IllegalAccessException,
> InstantiationException and ClassNotFoundException.
> 
> The jikes rvm, which is the only classpath based JVM that can run dacapo
> xalan, has this code for Class.newInstance:
> 
>     // Run the default constructor on the it.
>     try {
>       VM_Reflection.invoke(defaultConstructor, obj, null);
>     } catch (Throwable e) {
>       InstantiationException ex = new InstantiationException();
>       ex.initCause(e);
>       throw ex;
>     }
> 
> So, every exception in the contructor is converted into an
> InstantiationException, which obviously is caught in
> ResourceBundle.tryBundle.

Aha. Now I understand the mauve test that Tom added for
Class.newInstance(). I don't have a working jikesrvm here, but jikesrvm
will fail this new test since it doesn't rethrow the exception from the
constructor invocation. (This might be our poor documentation, we should
clearly mention that we get an InvocationTargetException, then we unwrap
it and rethrow the original exception from the constructor.)

> I think we should handle that properly in GNU Classpath, as all VMs
> would have the same code here.

Looks like we should catch any exception thrown by the class constructor
in tryBundle() and treat it as if the initialization failed for that
ResourceBundle so we try the next one.

Does the dacapo xalan work for you with the following patch?

diff -u -r1.36 ResourceBundle.java
--- java/util/ResourceBundle.java       23 Oct 2005 17:04:46 -0000      1.36
+++ java/util/ResourceBundle.java       1 Mar 2006 10:59:59 -0000
@@ -476,9 +476,7 @@
        if (ResourceBundle.class.isAssignableFrom(rbClass))
          bundle = (ResourceBundle) rbClass.newInstance();
       }
-    catch (IllegalAccessException ex) {}
-    catch (InstantiationException ex) {}
-    catch (ClassNotFoundException ex) {}
+    catch (Throwable t) { /* Class initialization failed, no valid bundle. */ }
     if (bundle == null)
       {

Cheers,

Mark

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to