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.

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.

>From b3beaa47685cd75e25d5d35a483618708c7dc132 Mon Sep 17 00:00:00 2001
From: Josef Eisl <zaps...@zapster.cc>
Date: Tue, 24 Apr 2012 17:21:51 +0200
Subject: [PATCH] Added java/lang/VMClassLoader.getSystemAssertionStatus().

This patch adds the possibility to distinguish between
assertions for normal classes and assertion for system
classes (i.e. classes with null ClassLoader).
---
 ChangeLog                                 |    6 ++++++
 doc/cp-vmintegration.texinfo              |    3 +++
 java/lang/Class.java                      |   14 +++++++++++---
 vm/reference/java/lang/VMClassLoader.java |   16 ++++++++++++++--
 4 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 062298b..d733367 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-24  Josef Eisl  <zaps...@zapster.cc>
+
+	* vm/reference/java/lang/VMClassLoader.java: Added getSystemAssertionStatus().
+	* java/lang/Class.java: Using getSystemAssertionStatus().
+	* doc/cp-vmintegration.texinfo: Updated documentation.
+
 2012-04-03  Andrew John Hughes  <ahug...@redhat.com>
 
 	* .gitignore: Renamed from .cvsignore.
diff --git a/doc/cp-vmintegration.texinfo b/doc/cp-vmintegration.texinfo
index 0b2d78c..672a262 100644
--- a/doc/cp-vmintegration.texinfo
+++ b/doc/cp-vmintegration.texinfo
@@ -414,6 +414,9 @@ exists (returning an empty array) which may be replaced if support is
 required. 
 @item @code{defaultAssertionStatus()} -- A stub which can be implemented
 by VMs providing assertion support.  At present, it always returns @code{true}.
+@item @code{getSystemAssertionStatus()} -- A stub which can be implemented
+by VMs providing support for system assertions.  At present, it always returns
+@code{true}.
 @item @code{packageAssertionStatus()} -- Much the same status as the above.
 The method should return a map converting package names to boolean status
 values.  The stub implementation provides an empty map.
diff --git a/java/lang/Class.java b/java/lang/Class.java
index af0a0a2..b7059cc 100644
--- a/java/lang/Class.java
+++ b/java/lang/Class.java
@@ -1,5 +1,5 @@
 /* Class.java -- Representation of a Java class.
-   Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007
+   Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2012
    Free Software Foundation
 
 This file is part of GNU Classpath.
@@ -1229,8 +1229,16 @@ public final class Class<T>
   {
     ClassLoader c = getClassLoader();
     Object status;
+    boolean ea = false;
+
     if (c == null)
-      return VMClassLoader.defaultAssertionStatus();
+      {
+        ea = VMClassLoader.getSystemAssertionStatus();
+        c = VMClassLoader.getSystemClassLoader();
+      }
+    else
+      ea = c.defaultAssertionStatus;
+
     if (c.classAssertionStatus != null)
       synchronized (c)
         {
@@ -1278,7 +1286,7 @@ public final class Class<T>
         if (status != null)
           return status.equals(Boolean.TRUE);
       }
-    return c.defaultAssertionStatus;
+    return ea;
   }
 
   /**
diff --git a/vm/reference/java/lang/VMClassLoader.java b/vm/reference/java/lang/VMClassLoader.java
index c2817d3..eb5e5c5 100644
--- a/vm/reference/java/lang/VMClassLoader.java
+++ b/vm/reference/java/lang/VMClassLoader.java
@@ -1,6 +1,6 @@
 /* VMClassLoader.java -- Reference implementation of native interface
    required by ClassLoader
-   Copyright (C) 1998, 2001, 2002, 2004, 2005, 2006, 2010
+   Copyright (C) 1998, 2001, 2002, 2004, 2005, 2006, 2010, 2012
    Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
@@ -333,7 +333,19 @@ final class VMClassLoader
 
   /**
    * The system default for assertion status. This is used for all system
-   * classes (those with a null ClassLoader), as well as the initial value for
+   * classes (those with a null ClassLoader).
+   *
+   * XXX - Not implemented yet; this requires native help.
+   *
+   * @return the system-wide default assertion status
+   */
+  static final boolean getSystemAssertionStatus()
+  {
+    return true;
+  }
+
+  /**
+   * The default for assertion status. This is used as the initial value for
    * every ClassLoader's default assertion status.
    *
    * XXX - Not implemented yet; this requires native help.
-- 
1.7.7

Reply via email to