----- Original Message ----- > Hi. > > Attached is a patch that enables GNU Classpath to distinguish between > normal assertions and assertions for system classes (i.e. null > classloader) as discussed on the Classpath mailing list [1]. > > Note that the new method > 'java/lang/VMClassLoader.getSystemAssertionStatus()' must be > implemented > otherwise an exception will occur. >
I'm confused about something in this patch which perhaps you can explain. I was under the impression that all system classes had assertions enabled and disabled as 'system assertions' (-esa/-dsa). So I was expecting the patch to just return this value if the classloader was null. Why does it instead retrieve a system classloader and probe that on a per-package/class basis? How would these values be set? As quoted before, the Oracle documentation explicitly states that -ea does not turn on system assertions. This patch would imply that e.g. assertions for java.lang could be turned on by -ea:java.lang. Is this intentional? On the administrative side, AFAICS you haven't contributed before. Do you have a copyright assignment with the FSF? > josef > > [1]: > http://developer.classpath.org/pipermail/classpath/2012-April/003195.html > > On 04/24/2012 02:29 AM, Andrew Hughes wrote: > > ----- Original Message ----- > >> Hi there. > >> > >> I want to reanimate a discussion from 2007 [1,2] about the > >> Assertion/System Assertion handling. As far as I know GNU > >> Classpath > >> can't distinguish between normal assertions > >> (-ea/-eanableassertions) > >> and > >> assertions for system classes (-esa/-enablesystemassertions, i.e. > >> classes with no classloader [3]). > >> The only interface for the VM is the method > >> VMClassLoader.defaultAssertionStatus(). It is not clear if this is > >> supposed to return the system assertion status or the normal > >> assertion > >> status (vm integration doc [4] vs. javadoc [5]). On the one hand, > >> it > >> is > >> used to set the defaultAssertionStatus for java.lang.ClassLoader > >> [6] > >> which would imply that it is the normal assertion status. On the > >> other > >> hand, the very same flag is used for setting the assertion status > >> for > >> system class in java.lang.Class (desiredAssertionStatus)[7]. > >> > >> I think we need two dedicated methods in VMClassLoader. > >> getDefaultAssertionStatus() for normal assertions (i.e. -ea) and > >> getDefaultSystemAssertionStatus() for system assertions (i.e. > >> -esa). > >> ClassLoader should use VMClassLoader.getDefaultAssertionStatus() > >> as > >> its > >> default value and Class.getDesiredAssertionStatus() should use > >> VMClassLoader.defaultSystemAssertionStatus() for system classes. > >> > >> I understand that this would be a rather big change because all > >> VMs > >> using GNU Classpath will fail if they do not adopt their > >> VMClassLoader > >> accordingly. > >> > >> I want to revitalize the discussion on this topic and I'm ready to > >> prepare a patch for this issue but things should be discussed > >> first > >> ;). > >> > >> I hope my explanations are somehow understandable ;). > >> > >> - josef > >> > >> PS: I think the patch from 2007 is does not fix this issue as it > >> does > >> not modify java.lang.Class and java.lang.Classloader receptively. > >> > >> > >> [1]: > >> http://developer.classpath.org/pipermail/classpath-patches/2007-August/005601.html > >> [2]: > >> http://developer.classpath.org/pipermail/classpath-patches/2007-September/005605.html > >> [3]: > >> http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#enable-disable > >> [4]: > >> http://www.gnu.org/software/classpath/docs/cp-vmintegration.html#SEC7 > >> [5]: > >> http://git.savannah.gnu.org/cgit/classpath.git/tree/vm/reference/java/lang/VMClassLoader.java?id=18f4bdd925d1a78d11598fb23dcaf1110772dcae#n334 > >> [6]: > >> http://git.savannah.gnu.org/cgit/classpath.git/tree/java/lang/ClassLoader.java?id=18f4bdd925d1a78d11598fb23dcaf1110772dcae#n220 > >> [7]: > >> http://git.savannah.gnu.org/cgit/classpath.git/tree/java/lang/Class.java?id=18f4bdd925d1a78d11598fb23dcaf1110772dcae#n1233 > >> > >> > > > > You're right. The issue is here: > > > > "But if you use them with no arguments (-ea or -da), they do not > > apply to system classes." > > > > (from > > http://java.sun.com/developer/technicalArticles/JavaLP/assertions/) > > > > Both when the classloader is null (a system class) and when there > > is no class or package-specific setting, the same default setting > > from VMClassLoader.defaultAssertionStatus() is used. > > > > There should instead a separate method for system classes as you > > mention: VMClassLoader.getSystemAssertionStatus() > > (I don't think it needs to be called default because it can't be > > overridden by the class/package settings). > > > > As we're just after a release (0.99), this would be an ideal time > > to add that method. > > Thanks, -- Andrew :) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) PGP Key: 248BDC07 (https://keys.indymedia.org/) Fingerprint = EC5A 1F5E C0AD 1D15 8F1F 8F91 3B96 A578 248B DC07