Hi, I committed the attached patch.
Regards, Jeroen 2007-02-04 Jeroen Frijters <[EMAIL PROTECTED]> * java/lang/Class.java (newInstance): Moved setAccessible call to helper method. (getEnumConstants): Call new helper method to allow values method to be called on non-public enum classes. (setAccessible): New helper method. * java/lang/Enum.java (valueOf): Call new helper method in class to allow field value to be read on non-public enum classes.
Index: java/lang/Class.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/lang/Class.java,v retrieving revision 1.51 diff -u -r1.51 Class.java --- java/lang/Class.java 11 Dec 2006 00:50:58 -0000 1.51 +++ java/lang/Class.java 3 Feb 2007 13:40:37 -0000 @@ -45,6 +45,7 @@ import java.io.Serializable; import java.lang.annotation.Annotation; import java.lang.annotation.Inherited; +import java.lang.reflect.AccessibleObject; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -1126,15 +1127,7 @@ if (!Modifier.isPublic(constructor.getModifiers()) || !Modifier.isPublic(VMClass.getModifiers(this, true))) { - final Constructor finalConstructor = constructor; - AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - finalConstructor.setAccessible(true); - return null; - } - }); + setAccessible(constructor); } synchronized(this) { @@ -1397,7 +1390,9 @@ { try { - return (T[]) getMethod("values").invoke(null); + Method m = getMethod("values"); + setAccessible(m); + return (T[]) m.invoke(null); } catch (NoSuchMethodException exception) { @@ -1787,5 +1782,18 @@ return VMClass.isMemberClass(this); } - + /** + * Utility method for use by classes in this package. + */ + static void setAccessible(final AccessibleObject obj) + { + AccessController.doPrivileged(new PrivilegedAction() + { + public Object run() + { + obj.setAccessible(true); + return null; + } + }); + } } Index: java/lang/Enum.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/lang/Enum.java,v retrieving revision 1.6 diff -u -r1.6 Enum.java --- java/lang/Enum.java 19 Dec 2006 00:37:50 -0000 1.6 +++ java/lang/Enum.java 3 Feb 2007 13:35:58 -0000 @@ -97,9 +97,12 @@ try { + // XXX We should not use getDeclaredField, because it does + // an unnecessary security check. Field f = etype.getDeclaredField(s); if (! f.isEnumConstant()) throw new IllegalArgumentException(s); + Class.setAccessible(f); return (S) f.get(null); } catch (NoSuchFieldException exception)