aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-06-11 17:33:22 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-06-11 17:33:22 +0000
commit419831367ffe80b3e7902b86eb38e7f8c396852c (patch)
treeebbe68b8e8e326e400af4e79b545b2dd31fd6942 /libjava
parentc6226a7e2aabd8d28a282bcad0b0c62767fb6a17 (diff)
downloadgcc-419831367ffe80b3e7902b86eb38e7f8c396852c.zip
gcc-419831367ffe80b3e7902b86eb38e7f8c396852c.tar.gz
gcc-419831367ffe80b3e7902b86eb38e7f8c396852c.tar.bz2
Class.h (Class::desiredAssertionStatus): Declare.
* java/lang/Class.h (Class::desiredAssertionStatus): Declare. (Class::getPackagePortion): Likewise. * java/lang/Class.java (desiredAssertionStatus): New method from Classpath. (getPackagePortion): Likewise. * java/lang/VMClassLoader.java (defaultAssertionStatus, packageAssertionStatus, classAssertionStatus): New methods from Classpath. * java/lang/ClassLoader.java (defaultAssertionStatus, systemPackageAssertionStatus, packageAssertionStatus, systemClassAssertionStatus, classAssertionStatus): New fields from Classpath. (setDefaultAssertionStatus, setPackageAssertionStatus, setClassAssertionStatus, clearAssertionStatus): New methods from Classpath. * Makefile.in: Rebuilt. * Makefile.am (core_java_source_files): Added AssertionError.java. * java/lang/AssertionError.java: New from Classpath. From-SVN: r54517
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog21
-rw-r--r--libjava/Makefile.am1
-rw-r--r--libjava/Makefile.in4
-rw-r--r--libjava/gcj/Makefile.in4
-rw-r--r--libjava/include/Makefile.in4
-rw-r--r--libjava/java/lang/AssertionError.java148
-rw-r--r--libjava/java/lang/Class.h5
-rw-r--r--libjava/java/lang/Class.java85
-rw-r--r--libjava/java/lang/ClassLoader.java121
-rw-r--r--libjava/java/lang/VMClassLoader.java47
10 files changed, 428 insertions, 12 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 118270a..072c7b5 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,24 @@
+2002-06-10 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/Class.h (Class::desiredAssertionStatus): Declare.
+ (Class::getPackagePortion): Likewise.
+ * java/lang/Class.java (desiredAssertionStatus): New method from
+ Classpath.
+ (getPackagePortion): Likewise.
+ * java/lang/VMClassLoader.java (defaultAssertionStatus,
+ packageAssertionStatus, classAssertionStatus): New methods from
+ Classpath.
+ * java/lang/ClassLoader.java (defaultAssertionStatus,
+ systemPackageAssertionStatus, packageAssertionStatus,
+ systemClassAssertionStatus, classAssertionStatus): New fields from
+ Classpath.
+ (setDefaultAssertionStatus, setPackageAssertionStatus,
+ setClassAssertionStatus, clearAssertionStatus): New methods from
+ Classpath.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (core_java_source_files): Added AssertionError.java.
+ * java/lang/AssertionError.java: New from Classpath.
+
2002-06-10 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* configure.host: Disable hash synchronization and slow_pthread_self
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index a959fdb..29ba729 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -1029,6 +1029,7 @@ java/lang/AbstractMethodError.java \
java/lang/ArithmeticException.java \
java/lang/ArrayIndexOutOfBoundsException.java \
java/lang/ArrayStoreException.java \
+java/lang/AssertionError.java \
java/lang/Boolean.java \
java/lang/Byte.java \
java/lang/Character.java \
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index 6c4a900..72b3daf 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -796,6 +796,7 @@ java/lang/AbstractMethodError.java \
java/lang/ArithmeticException.java \
java/lang/ArrayIndexOutOfBoundsException.java \
java/lang/ArrayStoreException.java \
+java/lang/AssertionError.java \
java/lang/Boolean.java \
java/lang/Byte.java \
java/lang/Character.java \
@@ -2235,7 +2236,8 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/lang/AbstractMethodError.P \
.deps/java/lang/ArithmeticException.P \
.deps/java/lang/ArrayIndexOutOfBoundsException.P \
-.deps/java/lang/ArrayStoreException.P .deps/java/lang/Boolean.P \
+.deps/java/lang/ArrayStoreException.P .deps/java/lang/AssertionError.P \
+.deps/java/lang/Boolean.P \
.deps/java/lang/Byte.P .deps/java/lang/CharSequence.P \
.deps/java/lang/Character.P .deps/java/lang/Class.P \
.deps/java/lang/ClassCastException.P \
diff --git a/libjava/gcj/Makefile.in b/libjava/gcj/Makefile.in
index 9260947..697d7ff 100644
--- a/libjava/gcj/Makefile.in
+++ b/libjava/gcj/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -258,7 +258,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff --git a/libjava/include/Makefile.in b/libjava/include/Makefile.in
index 1d38fcd..0dbe452 100644
--- a/libjava/include/Makefile.in
+++ b/libjava/include/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
@@ -239,7 +239,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
diff --git a/libjava/java/lang/AssertionError.java b/libjava/java/lang/AssertionError.java
new file mode 100644
index 0000000..1ce00ae
--- /dev/null
+++ b/libjava/java/lang/AssertionError.java
@@ -0,0 +1,148 @@
+/* AssertionError.java -- indication of a failed assertion
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang;
+
+/**
+ * An assertion error normally occurs as a result of the <code>assert</code>
+ * statement added in JDK 1.4, to indicate that an assertion failed. There
+ * are enough constructors to ensure that
+ * <code>new AssertionError(<em>expression</em)</code> will work for all
+ * espressions, regardless of type, as if the error message were given by
+ * the string <code>"" + <em>expression</em></code>. This extends Error,
+ * because you usually do not want to inadvertently trap an assertion failure.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @since 1.4
+ * @status updated to 1.4
+ */
+public class AssertionError extends Error
+{
+ /**
+ * Compatible with JDK 1.4+.
+ */
+ private static final long serialVersionUID = -5013299493970297370L;
+
+ /**
+ * Construct an AssertionError with no detail message.
+ */
+ public AssertionError()
+ {
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * object as its error message. If the object is a Throwable, it is also
+ * set as the cause of this error.
+ *
+ * @param msg the source of the error message
+ * @see Throwable#getCause()
+ */
+ public AssertionError(Object msg)
+ {
+ super("" + msg);
+ if (msg instanceof Throwable)
+ initCause((Throwable) msg);
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * boolean as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(boolean msg)
+ {
+ super(msg ? "true" : "false");
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * char as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(char msg)
+ {
+ super(String.valueOf(msg));
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * int as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(int msg)
+ {
+ super(Integer.toString(msg, 10));
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * long as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(long msg)
+ {
+ super(Long.toString(msg));
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * float as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(float msg)
+ {
+ super(Float.toString(msg));
+ }
+
+ /**
+ * Construct an AssertionError with the string conversion of the given
+ * double as its error message.
+ *
+ * @param msg the source of the error message
+ */
+ public AssertionError(double msg)
+ {
+ super(Double.toString(msg));
+ }
+}
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index 0f36f25..91a430a 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -1,6 +1,6 @@
// Class.h - Header file for java.lang.Class. -*- c++ -*-
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
This file is part of libgcj.
@@ -210,6 +210,7 @@ public:
jobject newInstance (void);
jstring toString (void);
+ jboolean desiredAssertionStatus (void);
// FIXME: this probably shouldn't be public.
jint size (void)
@@ -232,6 +233,8 @@ private:
void initializeClass (void);
+ static jstring getPackagePortion (jstring);
+
// Friend functions implemented in natClass.cc.
friend _Jv_Method *_Jv_GetMethodLocal (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature);
diff --git a/libjava/java/lang/Class.java b/libjava/java/lang/Class.java
index 549eaec..7bd38de 100644
--- a/libjava/java/lang/Class.java
+++ b/libjava/java/lang/Class.java
@@ -1,6 +1,6 @@
// Class.java - Representation of a Java class.
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation
This file is part of libgcj.
@@ -217,6 +217,75 @@ public final class Class implements Serializable
return (isInterface () ? "interface " : "class ") + getName ();
}
+ /**
+ * Returns the desired assertion status of this class, if it were to be
+ * initialized at this moment. The class assertion status, if set, is
+ * returned; the backup is the default package status; then if there is
+ * a class loader, that default is returned; and finally the system default
+ * is returned. This method seldom needs calling in user code, but exists
+ * for compilers to implement the assert statement. Note that there is no
+ * guarantee that the result of this method matches the class's actual
+ * assertion status.
+ *
+ * @return the desired assertion status
+ * @see ClassLoader#setClassAssertionStatus(String, boolean)
+ * @see ClassLoader#setPackageAssertionStatus(String, boolean)
+ * @see ClassLoader#setDefaultAssertionStatus(boolean)
+ * @since 1.4
+ */
+ public boolean desiredAssertionStatus()
+ {
+ ClassLoader c = getClassLoader();
+ Object status;
+ if (c == null)
+ return VMClassLoader.defaultAssertionStatus();
+ if (c.classAssertionStatus != null)
+ synchronized (c)
+ {
+ status = c.classAssertionStatus.get(getName());
+ if (status != null)
+ return status.equals(Boolean.TRUE);
+ }
+ else
+ {
+ status = ClassLoader.systemClassAssertionStatus.get(getName());
+ if (status != null)
+ return status.equals(Boolean.TRUE);
+ }
+ if (c.packageAssertionStatus != null)
+ synchronized (c)
+ {
+ String name = getPackagePortion(getName());
+ if ("".equals(name))
+ status = c.packageAssertionStatus.get(null);
+ else
+ do
+ {
+ status = c.packageAssertionStatus.get(name);
+ name = getPackagePortion(name);
+ }
+ while (! "".equals(name) && status == null);
+ if (status != null)
+ return status.equals(Boolean.TRUE);
+ }
+ else
+ {
+ String name = getPackagePortion(getName());
+ if ("".equals(name))
+ status = ClassLoader.systemPackageAssertionStatus.get(null);
+ else
+ do
+ {
+ status = ClassLoader.systemPackageAssertionStatus.get(name);
+ name = getPackagePortion(name);
+ }
+ while (! "".equals(name) && status == null);
+ if (status != null)
+ return status.equals(Boolean.TRUE);
+ }
+ return c.defaultAssertionStatus;
+ }
+
// Don't allow new classes to be made.
private Class ()
{
@@ -235,4 +304,18 @@ public final class Class implements Serializable
// finalization
protected native void finalize ();
+
+ /**
+ * Strip the last portion of the name (after the last dot).
+ *
+ * @param name the name to get package of
+ * @return the package name, or "" if no package
+ */
+ private static String getPackagePortion(String name)
+ {
+ int lastInd = name.lastIndexOf('.');
+ if (lastInd == -1)
+ return "";
+ return name.substring(0, lastInd);
+ }
}
diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java
index 32351d8..7925fe7 100644
--- a/libjava/java/lang/ClassLoader.java
+++ b/libjava/java/lang/ClassLoader.java
@@ -1,6 +1,6 @@
// ClassLoader.java - Define policies for loading Java classes.
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
This file is part of libgcj.
@@ -20,9 +20,7 @@ import java.security.Permission;
import java.security.Permissions;
import java.security.Policy;
import java.security.ProtectionDomain;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Stack;
+import java.util.*;
/**
* The class <code>ClassLoader</code> is intended to be subclassed by
@@ -34,6 +32,47 @@ import java.util.Stack;
public abstract class ClassLoader
{
+ /**
+ * The desired assertion status of classes loaded by this loader, if not
+ * overridden by package or class instructions.
+ */
+ // Package visible for use by Class.
+ boolean defaultAssertionStatus = VMClassLoader.defaultAssertionStatus();
+
+ /**
+ * The command-line state of the package assertion status overrides. This
+ * map is never modified, so it does not need to be synchronized.
+ */
+ // Package visible for use by Class.
+ static final Map systemPackageAssertionStatus
+ = VMClassLoader.packageAssertionStatus();
+
+ /**
+ * The map of package assertion status overrides, or null if no package
+ * overrides have been specified yet. The values of the map should be
+ * Boolean.TRUE or Boolean.FALSE, and the unnamed package is represented
+ * by the null key. This map must be synchronized on this instance.
+ */
+ // Package visible for use by Class.
+ Map packageAssertionStatus;
+
+ /**
+ * The command-line state of the class assertion status overrides. This
+ * map is never modified, so it does not need to be synchronized.
+ */
+ // Package visible for use by Class.
+ static final Map systemClassAssertionStatus
+ = VMClassLoader.classAssertionStatus();
+
+ /**
+ * The map of class assertion status overrides, or null if no class
+ * overrides have been specified yet. The values of the map should be
+ * Boolean.TRUE or Boolean.FALSE. This map must be synchronized on this
+ * instance.
+ */
+ // Package visible for use by Class.
+ Map classAssertionStatus;
+
private ClassLoader parent;
private HashMap definedPackages = new HashMap();
@@ -577,4 +616,78 @@ public abstract class ClassLoader
// Default to returning null. Derived classes implement this.
return null;
}
+
+ /**
+ * Set the default assertion status for classes loaded by this classloader,
+ * used unless overridden by a package or class request.
+ *
+ * @param enabled true to set the default to enabled
+ * @see #setClassAssertionStatus(String, boolean)
+ * @see #setPackageAssertionStatus(String, boolean)
+ * @see #clearAssertionStatus()
+ * @since 1.4
+ */
+ public void setDefaultAssertionStatus(boolean enabled)
+ {
+ defaultAssertionStatus = enabled;
+ }
+
+ /**
+ * Set the default assertion status for packages, used unless overridden
+ * by a class request. This default also covers subpackages, unless they
+ * are also specified. The unnamed package should use null for the name.
+ *
+ * @param name the package (and subpackages) to affect
+ * @param enabled true to set the default to enabled
+ * @see #setDefaultAssertionStatus(String, boolean)
+ * @see #setClassAssertionStatus(String, boolean)
+ * @see #clearAssertionStatus()
+ * @since 1.4
+ */
+ public synchronized void setPackageAssertionStatus(String name,
+ boolean enabled)
+ {
+ if (packageAssertionStatus == null)
+ packageAssertionStatus
+ = new HashMap(systemPackageAssertionStatus);
+ packageAssertionStatus.put(name, Boolean.valueOf(enabled));
+ }
+
+ /**
+ * Set the default assertion status for a class. This only affects the
+ * status of top-level classes, any other string is harmless.
+ *
+ * @param name the class to affect
+ * @param enabled true to set the default to enabled
+ * @throws NullPointerException if name is null
+ * @see #setDefaultAssertionStatus(String, boolean)
+ * @see #setPackageAssertionStatus(String, boolean)
+ * @see #clearAssertionStatus()
+ * @since 1.4
+ */
+ public synchronized void setClassAssertionStatus(String name,
+ boolean enabled)
+ {
+ if (classAssertionStatus == null)
+ classAssertionStatus = new HashMap(systemClassAssertionStatus);
+ // The toString() hack catches null, as required.
+ classAssertionStatus.put(name.toString(), Boolean.valueOf(enabled));
+ }
+
+ /**
+ * Resets the default assertion status of this classloader, its packages
+ * and classes, all to false. This allows overriding defaults inherited
+ * from the command line.
+ *
+ * @see #setDefaultAssertionStatus(boolean)
+ * @see #setClassAssertionStatus(String, boolean)
+ * @see #setPackageAssertionStatus(String, boolean)
+ * @since 1.4
+ */
+ public synchronized void clearAssertionStatus()
+ {
+ defaultAssertionStatus = false;
+ packageAssertionStatus = new HashMap();
+ classAssertionStatus = new HashMap();
+ }
}
diff --git a/libjava/java/lang/VMClassLoader.java b/libjava/java/lang/VMClassLoader.java
index 5ff7ae8..445272b 100644
--- a/libjava/java/lang/VMClassLoader.java
+++ b/libjava/java/lang/VMClassLoader.java
@@ -1,6 +1,6 @@
/*
* java.lang.ClassLoader: part of the Java Class Libraries project.
- * Copyright (C) 1998, 2001 Free Software Foundation
+ * Copyright (C) 1998, 2001, 2002 Free Software Foundation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -20,6 +20,8 @@
package java.lang;
+import java.util.*;
+
/**
* java.lang.VMClassLoader is a package-private helper for VMs to implement
* on behalf of java.lang.ClassLoader.
@@ -59,4 +61,47 @@ class VMClassLoader {
* @param type code for the primitive type.
*/
static native Class getPrimitiveClass(char type);
+
+ /**
+ * 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
+ * every ClassLoader's default assertion status.
+ *
+ * XXX - Not implemented yet; this requires native help.
+ *
+ * @return the system-wide default assertion status
+ */
+ static final boolean defaultAssertionStatus()
+ {
+ return true;
+ }
+
+ /**
+ * The system default for package assertion status. This is used for all
+ * ClassLoader's packageAssertionStatus defaults. It must be a map of
+ * package names to Boolean.TRUE or Boolean.FALSE, with the unnamed package
+ * represented as a null key.
+ *
+ * XXX - Not implemented yet; this requires native help.
+ *
+ * @return a (read-only) map for the default packageAssertionStatus
+ */
+ static final Map packageAssertionStatus()
+ {
+ return new HashMap();
+ }
+
+ /**
+ * The system default for class assertion status. This is used for all
+ * ClassLoader's classAssertionStatus defaults. It must be a map of
+ * class names to Boolean.TRUE or Boolean.FALSE
+ *
+ * XXX - Not implemented yet; this requires native help.
+ *
+ * @return a (read-only) map for the default classAssertionStatus
+ */
+ static final Map classAssertionStatus()
+ {
+ return new HashMap();
+ }
}