[kaffe] CVS kaffe (guilhem): Class loading updates. lockCount
overflow fix.
Kaffe CVS
cvs-commits at kaffe.org
Sun Dec 18 02:48:06 PST 2005
PatchSet 7008
Date: 2005/12/18 10:39:48
Author: guilhem
Branch: HEAD
Tag: (none)
Log:
Class loading updates. lockCount overflow fix.
* kaffe/kaffevm/classPool.c
(classMappingSearch): If we are asking again the same class while
we are loading it then it means we have a circularity problem.
* kaffe/kaffevm/locks.c:
(slowLockMutex): Added an assertion checking.
* kaffe/kaffevm/locks.h:
(iLock.lockCount): Use uint32 instead of uint8.
* libraries/clib/native/ClassLoader.c
(findLoadedClasses): New native function.
* libraries/javalib/vmspecific/java/lang/ClassLoader.java:
Removed.
* libraries/javalib/vmspecific/java/lang/VMClassLoader.java:
Reimported from GNU Classpath and merged with the older version.
* libraries/javalib/Makefile.am, libraries/javalib/Makefile.in:
Regenerated.
Members:
ChangeLog:1.4528->1.4529
kaffe/kaffevm/classPool.c:1.37->1.38
kaffe/kaffevm/locks.c:1.66->1.67
kaffe/kaffevm/locks.h:1.30->1.31
libraries/clib/native/ClassLoader.c:1.49->1.50
libraries/javalib/Makefile.am:1.411->1.412
libraries/javalib/Makefile.in:1.508->1.509
libraries/javalib/vmspecific/java/lang/ClassLoader.java:1.1->1.2(DEAD)
libraries/javalib/vmspecific/java/lang/VMClassLoader.java:1.1->1.2
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4528 kaffe/ChangeLog:1.4529
--- kaffe/ChangeLog:1.4528 Fri Dec 16 20:35:43 2005
+++ kaffe/ChangeLog Sun Dec 18 10:39:48 2005
@@ -1,3 +1,27 @@
+2005-12-17 Guilhem Lavaux <guilhem at kaffe.org>
+
+ * kaffe/kaffevm/classPool.c
+ (classMappingSearch): If we are asking again the same class while
+ we are loading it then it means we have a circularity problem.
+
+ * kaffe/kaffevm/locks.c:
+ (slowLockMutex): Added an assertion checking.
+
+ * kaffe/kaffevm/locks.h:
+ (iLock.lockCount): Use uint32 instead of uint8.
+
+ * libraries/clib/native/ClassLoader.c
+ (findLoadedClasses): New native function.
+
+ * libraries/javalib/vmspecific/java/lang/ClassLoader.java:
+ Removed.
+
+ * libraries/javalib/vmspecific/java/lang/VMClassLoader.java:
+ Reimported from GNU Classpath and merged with the older version.
+
+ * libraries/javalib/Makefile.am, libraries/javalib/Makefile.in:
+ Regenerated.
+
2005-12-16 Guilhem Lavaux <guilhem at kaffe.org>
* kaffe/kaffevm/jni/jni-helpers.c
Index: kaffe/kaffe/kaffevm/classPool.c
diff -u kaffe/kaffe/kaffevm/classPool.c:1.37 kaffe/kaffe/kaffevm/classPool.c:1.38
--- kaffe/kaffe/kaffevm/classPool.c:1.37 Tue Jul 19 16:27:35 2005
+++ kaffe/kaffe/kaffevm/classPool.c Sun Dec 18 10:39:55 2005
@@ -345,7 +345,14 @@
case NMS_SEARCHING:
if( ce->data.thread == jt )
{
+ /* Circularity. */
done = 1;
+ retval = 0;
+ postExceptionMessage(
+ einfo,
+ JAVA_LANG(ClassNotFoundException),
+ "%s",
+ ce->name->data);
break;
}
waitStaticCond(&ce->slock, (jlong)0);
Index: kaffe/kaffe/kaffevm/locks.c
diff -u kaffe/kaffe/kaffevm/locks.c:1.66 kaffe/kaffe/kaffevm/locks.c:1.67
--- kaffe/kaffe/kaffevm/locks.c:1.66 Mon Dec 5 20:54:04 2005
+++ kaffe/kaffe/kaffevm/locks.c Sun Dec 18 10:39:55 2005
@@ -233,6 +233,7 @@
/* If I hold the heavy lock then just keep on going */
if (cur == lk->holder) {
+ assert(lk->lockCount < 0xffffffff);
lk->lockCount++;
putHeavyLock(lk);
KTHREAD(enable_stop)();
Index: kaffe/kaffe/kaffevm/locks.h
diff -u kaffe/kaffe/kaffevm/locks.h:1.30 kaffe/kaffe/kaffevm/locks.h:1.31
--- kaffe/kaffe/kaffevm/locks.h:1.30 Sun Apr 24 15:10:46 2005
+++ kaffe/kaffe/kaffevm/locks.h Sun Dec 18 10:39:55 2005
@@ -51,7 +51,7 @@
jthread_t mux;
jthread_t cv;
Ksem sem;
- uint8 lockCount;
+ uint32 lockCount;
void* hlockHolder;
} iLock;
Index: kaffe/libraries/clib/native/ClassLoader.c
diff -u kaffe/libraries/clib/native/ClassLoader.c:1.49 kaffe/libraries/clib/native/ClassLoader.c:1.50
--- kaffe/libraries/clib/native/ClassLoader.c:1.49 Wed Oct 19 20:10:39 2005
+++ kaffe/libraries/clib/native/ClassLoader.c Sun Dec 18 10:39:55 2005
@@ -161,6 +161,32 @@
}
}
+struct Hjava_lang_Class*
+java_lang_VMClassLoader_findLoadedClass(Hjava_lang_ClassLoader* loader, Hjava_lang_String* name)
+{
+ Utf8Const *utfClassName;
+ classEntry *centry;
+ errorInfo einfo;
+ Hjava_lang_Class *clazz;
+
+ utfClassName = checkPtr(stringJava2Utf8ConstReplace(name, '.', '/'));
+
+ /*
+ * See if an entry for that name and class loader already exists
+ * create one if not.
+ */
+ centry = lookupClassEntryInternal(utfClassName, loader);
+ if (centry == NULL)
+ return NULL;
+
+ utf8ConstRelease(utfClassName);
+
+ if (centry->state >= NMS_LOADED)
+ return centry->data.cl;
+ else
+ return NULL;
+}
+
struct Hjava_lang_Class*
java_lang_VMClassLoader_loadClass(Hjava_lang_String* jStr, jboolean resolve)
Index: kaffe/libraries/javalib/Makefile.am
diff -u kaffe/libraries/javalib/Makefile.am:1.411 kaffe/libraries/javalib/Makefile.am:1.412
--- kaffe/libraries/javalib/Makefile.am:1.411 Wed Dec 14 05:08:56 2005
+++ kaffe/libraries/javalib/Makefile.am Sun Dec 18 10:39:51 2005
@@ -668,7 +668,6 @@
vmspecific/java/io/VMObjectInputStream.java \
vmspecific/java/io/VMObjectStreamClass.java \
vmspecific/java/lang/Class.java \
- vmspecific/java/lang/ClassLoader.java \
vmspecific/java/lang/Runtime.java \
vmspecific/java/lang/String.java \
vmspecific/java/lang/VMClass.java \
Index: kaffe/libraries/javalib/Makefile.in
diff -u kaffe/libraries/javalib/Makefile.in:1.508 kaffe/libraries/javalib/Makefile.in:1.509
--- kaffe/libraries/javalib/Makefile.in:1.508 Wed Dec 14 05:08:57 2005
+++ kaffe/libraries/javalib/Makefile.in Sun Dec 18 10:39:54 2005
@@ -979,7 +979,6 @@
vmspecific/java/io/VMObjectInputStream.java \
vmspecific/java/io/VMObjectStreamClass.java \
vmspecific/java/lang/Class.java \
- vmspecific/java/lang/ClassLoader.java \
vmspecific/java/lang/Runtime.java \
vmspecific/java/lang/String.java \
vmspecific/java/lang/VMClass.java \
===================================================================
Checking out kaffe/libraries/javalib/vmspecific/java/lang/ClassLoader.java
RCS: /home/cvs/kaffe/kaffe/libraries/javalib/vmspecific/java/lang/Attic/ClassLoader.java,v
VERS: 1.1
***************
--- kaffe/libraries/javalib/vmspecific/java/lang/ClassLoader.java Sun Dec 18 10:48:06 2005
+++ /dev/null Sun Aug 4 19:57:58 2002
@@ -1,1115 +0,0 @@
-/* ClassLoader.java -- responsible for loading classes into the VM
- Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005 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., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 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;
-
-import gnu.classpath.SystemProperties;
-import gnu.classpath.VMStackWalker;
-import gnu.java.util.DoubleEnumeration;
-import gnu.java.util.EmptyEnumeration;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.CodeSource;
-import java.security.PermissionCollection;
-import java.security.Policy;
-import java.security.ProtectionDomain;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-/**
- * The ClassLoader is a way of customizing the way Java gets its classes
- * and loads them into memory. The verifier and other standard Java things
- * still run, but the ClassLoader is allowed great flexibility in determining
- * where to get the classfiles and when to load and resolve them. For that
- * matter, a custom ClassLoader can perform on-the-fly code generation or
- * modification!
- *
- * <p>Every classloader has a parent classloader that is consulted before
- * the 'child' classloader when classes or resources should be loaded.
- * This is done to make sure that classes can be loaded from an hierarchy of
- * multiple classloaders and classloaders do not accidentially redefine
- * already loaded classes by classloaders higher in the hierarchy.
- *
- * <p>The grandparent of all classloaders is the bootstrap classloader, which
- * loads all the standard system classes as implemented by GNU Classpath. The
- * other special classloader is the system classloader (also called
- * application classloader) that loads all classes from the CLASSPATH
- * (<code>java.class.path</code> system property). The system classloader
- * is responsible for finding the application classes from the classpath,
- * and delegates all requests for the standard library classes to its parent
- * the bootstrap classloader. Most programs will load all their classes
- * through the system classloaders.
- *
- * <p>The bootstrap classloader in GNU Classpath is implemented as a couple of
- * static (native) methods on the package private class
- * <code>java.lang.VMClassLoader</code>, the system classloader is an
- * anonymous inner class of ClassLoader and a subclass of
- * <code>java.net.URLClassLoader</code>.
- *
- * <p>Users of a <code>ClassLoader</code> will normally just use the methods
- * <ul>
- * <li> <code>loadClass()</code> to load a class.</li>
- * <li> <code>getResource()</code> or <code>getResourceAsStream()</code>
- * to access a resource.</li>
- * <li> <code>getResources()</code> to get an Enumeration of URLs to all
- * the resources provided by the classloader and its parents with the
- * same name.</li>
- * </ul>
- *
- * <p>Subclasses should implement the methods
- * <ul>
- * <li> <code>findClass()</code> which is called by <code>loadClass()</code>
- * when the parent classloader cannot provide a named class.</li>
- * <li> <code>findResource()</code> which is called by
- * <code>getResource()</code> when the parent classloader cannot provide
- * a named resource.</li>
- * <li> <code>findResources()</code> which is called by
- * <code>getResource()</code> to combine all the resources with the
- * same name from the classloader and its parents.</li>
- * <li> <code>findLibrary()</code> which is called by
- * <code>Runtime.loadLibrary()</code> when a class defined by the
- * classloader wants to load a native library.</li>
- * </ul>
- *
- * @author John Keiser
- * @author Mark Wielaard
- * @author Eric Blake (ebb9 at email.byu.edu)
- * @see Class
- * @since 1.0
- * @status still missing 1.4 functionality
- */
-public abstract class ClassLoader
-{
- /**
- * All classes loaded by this classloader. If the VM's chooses to implement
- * this cache natively this field will be null.
- * It is not private in order to allow VMClassLoader access to this field.
- */
- final HashMap loadedClasses =
- VMClassLoader.USE_VM_CACHE ? null : new HashMap();
-
- /**
- * All packages defined by this classloader. It is not private in order to
- * allow native code (and trusted subclasses) access to this field.
- */
- final HashMap definedPackages = new HashMap();
-
- /**
- * The classloader that is consulted before this classloader.
- * If null then the parent is the bootstrap classloader.
- */
- private final ClassLoader parent;
-
- /**
- * This is true if this classloader was successfully initialized.
- * This flag is needed to avoid a class loader attack: even if the
- * security manager rejects an attempt to create a class loader, the
- * malicious class could have a finalize method which proceeds to
- * define classes.
- */
- private final boolean initialized;
-
- static class StaticData
- {
- /**
- * The System Class Loader (a.k.a. Application Class Loader). The one
- * returned by ClassLoader.getSystemClassLoader.
- */
- static final ClassLoader systemClassLoader =
- VMClassLoader.getSystemClassLoader();
- static
- {
- // Find out if we have to install a default security manager. Note that
- // this is done here because we potentially need the system class loader
- // to load the security manager and note also that we don't need the
- // security manager until the system class loader is created.
- // If the runtime chooses to use a class loader that doesn't have the
- // system class loader as its parent, it is responsible for setting
- // up a security manager before doing so.
- String secman = SystemProperties.getProperty("java.security.manager");
- if (secman != null && SecurityManager.current == null)
- {
- if (secman.equals("") || secman.equals("default"))
- {
- SecurityManager.current = new SecurityManager();
- }
- else
- {
- try
- {
- Class cl = Class.forName(secman, false, StaticData.systemClassLoader);
- SecurityManager.current = (SecurityManager)cl.newInstance();
- }
- catch (Exception x)
- {
- throw (InternalError)
- new InternalError("Unable to create SecurityManager")
- .initCause(x);
- }
- }
- }
- }
-
- /**
- * The default protection domain, used when defining a class with a null
- * parameter for the domain.
- */
- static final ProtectionDomain defaultProtectionDomain;
- static
- {
- CodeSource cs = new CodeSource(null, null);
- PermissionCollection perm = Policy.getPolicy().getPermissions(cs);
- defaultProtectionDomain = new ProtectionDomain(cs, perm);
- }
- /**
- * 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 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 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 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 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;
-
- /**
- * VM private data.
- */
- transient Object vmdata;
-
- /**
- * Create a new ClassLoader with as parent the system classloader. There
- * may be a security check for <code>checkCreateClassLoader</code>.
- *
- * @throws SecurityException if the security check fails
- */
- protected ClassLoader() throws SecurityException
- {
- this(StaticData.systemClassLoader);
- }
-
- /**
- * Create a new ClassLoader with the specified parent. The parent will
- * be consulted when a class or resource is requested through
- * <code>loadClass()</code> or <code>getResource()</code>. Only when the
- * parent classloader cannot provide the requested class or resource the
- * <code>findClass()</code> or <code>findResource()</code> method
- * of this classloader will be called. There may be a security check for
- * <code>checkCreateClassLoader</code>.
- *
- * @param parent the classloader's parent, or null for the bootstrap
- * classloader
- * @throws SecurityException if the security check fails
- * @since 1.2
- */
- protected ClassLoader(ClassLoader parent)
- {
- // May we create a new classloader?
- SecurityManager sm = SecurityManager.current;
- if (sm != null)
- sm.checkCreateClassLoader();
- this.parent = parent;
- this.initialized = true;
- }
-
- /**
- * Load a class using this ClassLoader or its parent, without resolving
- * it. Calls <code>loadClass(name, false)</code>.
- *
- * <p>Subclasses should not override this method but should override
- * <code>findClass()</code> which is called by this method.</p>
- *
- * @param name the name of the class relative to this ClassLoader
- * @return the loaded class
- * @throws ClassNotFoundException if the class cannot be found
- */
- public Class loadClass(String name) throws ClassNotFoundException
- {
- return loadClass(name, false);
- }
-
- /**
- * Load a class using this ClassLoader or its parent, possibly resolving
- * it as well using <code>resolveClass()</code>. It first tries to find
- * out if the class has already been loaded through this classloader by
- * calling <code>findLoadedClass()</code>. Then it calls
- * <code>loadClass()</code> on the parent classloader (or when there is
- * no parent it uses the VM bootclassloader). If the class is still
- * not loaded it tries to create a new class by calling
- * <code>findClass()</code>. Finally when <code>resolve</code> is
- * <code>true</code> it also calls <code>resolveClass()</code> on the
- * newly loaded class.
- *
- * <p>Subclasses should not override this method but should override
- * <code>findClass()</code> which is called by this method.</p>
- *
- * @param name the fully qualified name of the class to load
- * @param resolve whether or not to resolve the class
- * @return the loaded class
- * @throws ClassNotFoundException if the class cannot be found
- */
- protected synchronized Class loadClass(String name, boolean resolve)
- throws ClassNotFoundException
- {
- // Have we already loaded this class?
- Class c = findLoadedClass(name);
- if (c == null)
- {
- // Can the class be loaded by a parent?
- try
- {
- if (parent == null)
- {
- c = VMClassLoader.loadClass(name, resolve);
- if (c != null)
- return c;
- }
- else
- {
- return parent.loadClass(name, resolve);
- }
- }
- catch (ClassNotFoundException e)
- {
- }
- // Still not found, we have to do it ourself.
- c = findClass(name);
- }
- if (resolve)
- resolveClass(c);
- return c;
- }
-
- /**
- * Called for every class name that is needed but has not yet been
- * defined by this classloader or one of its parents. It is called by
- * <code>loadClass()</code> after both <code>findLoadedClass()</code> and
- * <code>parent.loadClass()</code> couldn't provide the requested class.
- *
- * <p>The default implementation throws a
- * <code>ClassNotFoundException</code>. Subclasses should override this
- * method. An implementation of this method in a subclass should get the
- * class bytes of the class (if it can find them), if the package of the
- * requested class doesn't exist it should define the package and finally
- * it should call define the actual class. It does not have to resolve the
- * class. It should look something like the following:<br>
- *
- * <pre>
- * // Get the bytes that describe the requested class
- * byte[] classBytes = classLoaderSpecificWayToFindClassBytes(name);
- * // Get the package name
- * int lastDot = name.lastIndexOf('.');
- * if (lastDot != -1)
- * {
- * String packageName = name.substring(0, lastDot);
- * // Look if the package already exists
- * if (getPackage(packageName) == null)
- * {
- * // define the package
- * definePackage(packageName, ...);
- * }
- * }
- * // Define and return the class
- * return defineClass(name, classBytes, 0, classBytes.length);
- * </pre>
- *
- * <p><code>loadClass()</code> makes sure that the <code>Class</code>
- * returned by <code>findClass()</code> will later be returned by
- * <code>findLoadedClass()</code> when the same class name is requested.
- *
- * @param name class name to find (including the package name)
- * @return the requested Class
- * @throws ClassNotFoundException when the class can not be found
- * @since 1.2
- */
- protected Class findClass(String name) throws ClassNotFoundException
- {
- throw new ClassNotFoundException(name);
- }
-
- /**
- * Helper to define a class using a string of bytes. This version is not
- * secure.
- *
- * @param data the data representing the classfile, in classfile format
- * @param offset the offset into the data where the classfile starts
- * @param len the length of the classfile data in the array
- * @return the class that was defined
- * @throws ClassFormatError if data is not in proper classfile format
- * @throws IndexOutOfBoundsException if offset or len is negative, or
- * offset + len exceeds data
- * @deprecated use {@link #defineClass(String, byte[], int, int)} instead
- */
- protected final Class defineClass(byte[] data, int offset, int len)
- throws ClassFormatError
- {
- return defineClass(null, data, offset, len);
- }
-
- /**
- * Helper to define a class using a string of bytes without a
- * ProtectionDomain. Subclasses should call this method from their
- * <code>findClass()</code> implementation. The name should use '.'
- * separators, and discard the trailing ".class". The default protection
- * domain has the permissions of
- * <code>Policy.getPolicy().getPermissions(new CodeSource(null, null))</code>.
- *
- * @param name the name to give the class, or null if unknown
- * @param data the data representing the classfile, in classfile format
- * @param offset the offset into the data where the classfile starts
- * @param len the length of the classfile data in the array
- * @return the class that was defined
- * @throws ClassFormatError if data is not in proper classfile format
- * @throws IndexOutOfBoundsException if offset or len is negative, or
- * offset + len exceeds data
- * @throws SecurityException if name starts with "java."
- * @since 1.1
- */
- protected final Class defineClass(String name, byte[] data, int offset,
- int len) throws ClassFormatError
- {
- return defineClass(name, data, offset, len, null);
- }
-
- /**
- * Helper to define a class using a string of bytes. Subclasses should call
- * this method from their <code>findClass()</code> implementation. If the
- * domain is null, the default of
- * <code>Policy.getPolicy().getPermissions(new CodeSource(null, null))</code>
- * is used. Once a class has been defined in a package, all further classes
- * in that package must have the same set of certificates or a
- * SecurityException is thrown.
- *
- * @param name the name to give the class. null if unknown
- * @param data the data representing the classfile, in classfile format
- * @param offset the offset into the data where the classfile starts
- * @param len the length of the classfile data in the array
- * @param domain the ProtectionDomain to give to the class, null for the
- * default protection domain
- * @return the class that was defined
- * @throws ClassFormatError if data is not in proper classfile format
- * @throws IndexOutOfBoundsException if offset or len is negative, or
- * offset + len exceeds data
- * @throws SecurityException if name starts with "java.", or if certificates
- * do not match up
- * @since 1.2
- */
- protected final synchronized Class defineClass(String name, byte[] data,
- int offset, int len,
- ProtectionDomain domain)
- throws ClassFormatError
- {
- if (domain == null)
- domain = StaticData.defaultProtectionDomain;
- if (! initialized)
- throw new SecurityException("attempt to define class from uninitialized class loader");
-
- Class retval = VMClassLoader.defineClass(this, name, data,
- offset, len, domain);
- if (! VMClassLoader.USE_VM_CACHE)
- loadedClasses.put(retval.getName(), retval);
- return retval;
- }
-
- /**
- * Links the class, if that has not already been done. Linking basically
- * resolves all references to other classes made by this class.
- *
- * @param c the class to resolve
- * @throws NullPointerException if c is null
- * @throws LinkageError if linking fails
- */
- protected final void resolveClass(Class c)
- {
- VMClassLoader.resolveClass(c);
- }
-
- /**
- * Helper to find a Class using the system classloader, possibly loading it.
- * A subclass usually does not need to call this, if it correctly
- * overrides <code>findClass(String)</code>.
- *
- * @param name the name of the class to find
- * @return the found class
- * @throws ClassNotFoundException if the class cannot be found
- */
- protected final Class findSystemClass(String name)
- throws ClassNotFoundException
- {
- return Class.forName(name, false, StaticData.systemClassLoader);
- }
-
- /**
- * Returns the parent of this classloader. If the parent of this
- * classloader is the bootstrap classloader then this method returns
- * <code>null</code>. A security check may be performed on
- * <code>RuntimePermission("getClassLoader")</code>.
- *
- * @return the parent <code>ClassLoader</code>
- * @throws SecurityException if the security check fails
- * @since 1.2
- */
- public final ClassLoader getParent()
- {
- // Check if we may return the parent classloader.
- SecurityManager sm = SecurityManager.current;
- if (sm != null)
- {
- ClassLoader cl = VMStackWalker.getCallingClassLoader();
- if (cl != null && ! cl.isAncestorOf(this))
- sm.checkPermission(new RuntimePermission("getClassLoader"));
- }
- return parent;
- }
-
- /**
- * Helper to set the signers of a class. This should be called after
- * defining the class.
- *
- * @param c the Class to set signers of
- * @param signers the signers to set
- * @since 1.1
- */
- protected final void setSigners(Class c, Object[] signers)
- {
- c.setSigners(signers);
- }
-
- /**
- * Helper to find an already-loaded class in this ClassLoader.
- *
- * @param name the name of the class to find
- * @return the found Class, or null if it is not found
- * @since 1.1
- */
- protected final synchronized Class findLoadedClass(String name)
- {
- return VMClassLoader.findLoadedClass(this, name);
- }
-
- /**
- * Get the URL to a resource using this classloader or one of its parents.
- * First tries to get the resource by calling <code>getResource()</code>
- * on the parent classloader. If the parent classloader returns null then
- * it tries finding the resource by calling <code>findResource()</code> on
- * this classloader. The resource name should be separated by '/' for path
- * elements.
- *
- * <p>Subclasses should not override this method but should override
- * <code>findResource()</code> which is called by this method.
- *
- * @param name the name of the resource relative to this classloader
- * @return the URL to the resource or null when not found
- */
- public URL getResource(String name)
- {
- URL result;
-
- if (parent == null)
- result = VMClassLoader.getResource(name);
- else
- result = parent.getResource(name);
-
- if (result == null)
- result = findResource(name);
- return result;
- }
-
- /**
- * Returns an Enumeration of all resources with a given name that can
- * be found by this classloader and its parents. Certain classloaders
- * (such as the URLClassLoader when given multiple jar files) can have
- * multiple resources with the same name that come from multiple locations.
- * It can also occur that a parent classloader offers a resource with a
- * certain name and the child classloader also offers a resource with that
- * same name. <code>getResource()</code> only offers the first resource (of the
- * parent) with a given name. This method lists all resources with the
- * same name. The name should use '/' as path separators.
- *
- * <p>The Enumeration is created by first calling <code>getResources()</code>
- * on the parent classloader and then calling <code>findResources()</code>
- * on this classloader.</p>
- *
- * @param name the resource name
- * @return an enumaration of all resources found
- * @throws IOException if I/O errors occur in the process
- * @since 1.2
- */
- public final Enumeration getResources(String name) throws IOException
- {
- Enumeration parentResources;
- if (parent == null)
- parentResources = VMClassLoader.getResources(name);
- else
- parentResources = parent.getResources(name);
- return new DoubleEnumeration(parentResources, findResources(name));
- }
-
- /**
- * Called whenever all locations of a named resource are needed.
- * It is called by <code>getResources()</code> after it has called
- * <code>parent.getResources()</code>. The results are combined by
- * the <code>getResources()</code> method.
- *
- * <p>The default implementation always returns an empty Enumeration.
- * Subclasses should override it when they can provide an Enumeration of
- * URLs (possibly just one element) to the named resource.
- * The first URL of the Enumeration should be the same as the one
- * returned by <code>findResource</code>.
- *
- * @param name the name of the resource to be found
- * @return a possibly empty Enumeration of URLs to the named resource
- * @throws IOException if I/O errors occur in the process
- * @since 1.2
- */
- protected Enumeration findResources(String name) throws IOException
- {
- return EmptyEnumeration.getInstance();
- }
-
- /**
- * Called whenever a resource is needed that could not be provided by
- * one of the parents of this classloader. It is called by
- * <code>getResource()</code> after <code>parent.getResource()</code>
- * couldn't provide the requested resource.
- *
- * <p>The default implementation always returns null. Subclasses should
- * override this method when they can provide a way to return a URL
- * to a named resource.
- *
- * @param name the name of the resource to be found
- * @return a URL to the named resource or null when not found
- * @since 1.2
- */
- protected URL findResource(String name)
- {
- return null;
- }
-
- /**
- * Get the URL to a resource using the system classloader.
- *
- * @param name the name of the resource relative to the system classloader
- * @return the URL to the resource
- * @since 1.1
- */
- public static final URL getSystemResource(String name)
- {
- return StaticData.systemClassLoader.getResource(name);
- }
-
- /**
- * Get an Enumeration of URLs to resources with a given name using the
- * the system classloader. The enumeration firsts lists the resources with
- * the given name that can be found by the bootstrap classloader followed
- * by the resources with the given name that can be found on the classpath.
- *
- * @param name the name of the resource relative to the system classloader
- * @return an Enumeration of URLs to the resources
- * @throws IOException if I/O errors occur in the process
- * @since 1.2
- */
- public static Enumeration getSystemResources(String name) throws IOException
- {
- return StaticData.systemClassLoader.getResources(name);
- }
-
- /**
- * Get a resource as stream using this classloader or one of its parents.
- * First calls <code>getResource()</code> and if that returns a URL to
- * the resource then it calls and returns the InputStream given by
- * <code>URL.openStream()</code>.
- *
- * <p>Subclasses should not override this method but should override
- * <code>findResource()</code> which is called by this method.
- *
- * @param name the name of the resource relative to this classloader
- * @return an InputStream to the resource, or null
- * @since 1.1
- */
- public InputStream getResourceAsStream(String name)
- {
- try
- {
- URL url = getResource(name);
- if (url == null)
- return null;
- return url.openStream();
- }
- catch (IOException e)
- {
- return null;
- }
- }
-
- /**
- * Get a resource using the system classloader.
- *
- * @param name the name of the resource relative to the system classloader
- * @return an input stream for the resource, or null
- * @since 1.1
- */
- public static final InputStream getSystemResourceAsStream(String name)
- {
- try
- {
- URL url = getSystemResource(name);
- if (url == null)
- return null;
- return url.openStream();
- }
- catch (IOException e)
- {
- return null;
- }
- }
-
- /**
- * Returns the system classloader. The system classloader (also called
- * the application classloader) is the classloader that is used to
- * load the application classes on the classpath (given by the system
- * property <code>java.class.path</code>. This is set as the context
- * class loader for a thread. The system property
- * <code>java.system.class.loader</code>, if defined, is taken to be the
- * name of the class to use as the system class loader, which must have
- * a public constructor which takes a ClassLoader as a parent. The parent
- * class loader passed in the constructor is the default system class
- * loader.
- *
- * <p>Note that this is different from the bootstrap classloader that
- * actually loads all the real "system" classes.
- *
- * <p>A security check will be performed for
- * <code>RuntimePermission("getClassLoader")</code> if the calling class
- * is not a parent of the system class loader.
- *
- * @return the system class loader
- * @throws SecurityException if the security check fails
- * @throws IllegalStateException if this is called recursively
- * @throws Error if <code>java.system.class.loader</code> fails to load
- * @since 1.2
- */
- public static ClassLoader getSystemClassLoader()
- {
- // Check if we may return the system classloader
- SecurityManager sm = SecurityManager.current;
- if (sm != null)
- {
- ClassLoader cl = VMStackWalker.getCallingClassLoader();
- if (cl != null && cl != StaticData.systemClassLoader)
- sm.checkPermission(new RuntimePermission("getClassLoader"));
- }
-
- return StaticData.systemClassLoader;
- }
-
- /**
- * Defines a new package and creates a Package object. The package should
- * be defined before any class in the package is defined with
- * <code>defineClass()</code>. The package should not yet be defined
- * before in this classloader or in one of its parents (which means that
- * <code>getPackage()</code> should return <code>null</code>). All
- * parameters except the <code>name</code> of the package may be
- * <code>null</code>.
- *
- * <p>Subclasses should call this method from their <code>findClass()</code>
- * implementation before calling <code>defineClass()</code> on a Class
- * in a not yet defined Package (which can be checked by calling
- * <code>getPackage()</code>).
- *
- * @param name the name of the Package
- * @param specTitle the name of the specification
- * @param specVendor the name of the specification designer
- * @param specVersion the version of this specification
- * @param implTitle the name of the implementation
- * @param implVendor the vendor that wrote this implementation
- * @param implVersion the version of this implementation
- * @param sealed if sealed the origin of the package classes
- * @return the Package object for the specified package
- * @throws IllegalArgumentException if the package name is null or it
- * was already defined by this classloader or one of its parents
- * @see Package
- * @since 1.2
- */
- protected Package definePackage(String name, String specTitle,
- String specVendor, String specVersion,
- String implTitle, String implVendor,
- String implVersion, URL sealed)
- {
- if (getPackage(name) != null)
- throw new IllegalArgumentException("Package " + name
- + " already defined");
*** Patch too long, truncated ***
More information about the kaffe
mailing list