diff options
author | Archie Cobbs <archie@dellroad.org> | 2005-01-04 17:45:49 +0000 |
---|---|---|
committer | Archie Cobbs <archie@dellroad.org> | 2005-01-04 17:45:49 +0000 |
commit | 4923c01b66f2e49e3735d067f8e4e671399abd25 (patch) | |
tree | 81d523f0c72c634c0b2ef37fb6790771df996ce5 /vm | |
parent | a712bf1a74c8ec249aee8e22b2035cd771fb6c9e (diff) | |
download | classpath-4923c01b66f2e49e3735d067f8e4e671399abd25.tar.gz |
* NEWS: Document changes.
* java/lang/Class.java (newInstance(), getClassLoader(),
forName(String), forName(String, boolean, ClassLoader)):
Use new VMStackWalker methods.
* java/lang/ClassLoader.java (getParent(), getSystemClassLoader()):
Likewise.
* java/lang/Package.java (getPackages()): Likewise.
* java/lang/SecurityManager.java (getClassContext()): Likewise.
* java/util/ResourceBundle.java (getBundle()): Likewise.
* java/lang/Runtime.java (load(), loadLibrary()): Load the native
library using the calling class' class loader.
* java/lang/System.java (load(), loadLibrary()): Likewise.
(currentClassLoader()): implement via currentLoadedClass().
* vm/reference/gnu/classpath/VMStackWalker.java: New class.
* vm/reference/java/lang/VMRuntime.java (nativeLoad()):
Add a ClassLoader parameter.
* vm/reference/java/lang/VMSecurityManager.java: Removed.
Diffstat (limited to 'vm')
-rw-r--r-- | vm/reference/gnu/classpath/VMStackWalker.java | 108 | ||||
-rw-r--r-- | vm/reference/java/lang/VMRuntime.java | 3 | ||||
-rw-r--r-- | vm/reference/java/lang/VMSecurityManager.java | 73 |
3 files changed, 110 insertions, 74 deletions
diff --git a/vm/reference/gnu/classpath/VMStackWalker.java b/vm/reference/gnu/classpath/VMStackWalker.java new file mode 100644 index 000000000..72e41d8c7 --- /dev/null +++ b/vm/reference/gnu/classpath/VMStackWalker.java @@ -0,0 +1,108 @@ +/* VMStackWalker.java -- Reference implementation of VM hooks for stack access + Copyright (C) 2005 Free Software Foundation + +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 gnu.classpath; + +/** + * This class provides access to the classes on the Java stack + * for reflection and security purposes. + * + * <p> + * This class is only available to priviledged code (i.e., code loaded + * by the bootstrap loader). + * + * @author John Keiser + * @author Eric Blake <ebb9@email.byu.edu> + * @author Archie Cobbs + */ +public final class VMStackWalker +{ + /** + * Get a list of all the classes currently executing methods on the + * Java stack. <code>getClassContext()[0]</code> is the class associated + * with the currently executing method, i.e., the method that called + * <code>VMStackWalker.getClassContext()</code> (possibly through + * reflection). So you may need to pop off these stack frames from + * the top of the stack: + * <ul> + * <li><code>VMStackWalker.getClassContext()</code> + * <li><code>Method.invoke()</code> + * </ul> + * + * @return an array of the declaring classes of each stack frame + */ + public static native Class[] getClassContext(); + + /** + * Get the class associated with the method invoking the method + * invoking this method, or <code>null</code> if the stack is not + * that deep (e.g., invoked via JNI invocation API). This method + * is an optimization for the expression <code>getClassContext()[1]</code> + * and should return the same result. + * + * <p> + * VM implementers are encouraged to provide a more efficient + * version of this method. + */ + public static Class getCallingClass() + { + Class[] ctx = getClassContext(); + if (ctx.length < 3) + return null; + return ctx[2]; + } + + /** + * Get the class loader associated with the Class returned by + * <code>getCallingClass()</code>, or <code>null</code> if no + * such class exists or it is the boot loader. This method is an optimization + * for the expression <code>getClassContext()[1].getClassLoader()</code> + * and should return the same result. + * + * <p> + * VM implementers are encouraged to provide a more efficient + * version of this method. + */ + public static ClassLoader getCallingClassLoader() + { + Class[] ctx = getClassContext(); + if (ctx.length < 3) + return null; + return ctx[2].getClassLoader(); + } +} + diff --git a/vm/reference/java/lang/VMRuntime.java b/vm/reference/java/lang/VMRuntime.java index 72e22390d..8da217f15 100644 --- a/vm/reference/java/lang/VMRuntime.java +++ b/vm/reference/java/lang/VMRuntime.java @@ -151,9 +151,10 @@ final class VMRuntime * already been mapped to a true filename. * * @param filename the file to load + * @param loader class loader, or <code>null</code> for the boot loader * @return 0 on failure, nonzero on success */ - static native int nativeLoad(String filename); + static native int nativeLoad(String filename, ClassLoader loader); /** * Map a system-independent "short name" to the full file name. diff --git a/vm/reference/java/lang/VMSecurityManager.java b/vm/reference/java/lang/VMSecurityManager.java deleted file mode 100644 index 3d95c8a96..000000000 --- a/vm/reference/java/lang/VMSecurityManager.java +++ /dev/null @@ -1,73 +0,0 @@ -/* VMSecurityManager.java -- Reference implementation of VM hooks for security - Copyright (C) 1998, 2002 Free Software Foundation - -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; - -/** - * VMSecurityManager is a helper class for SecurityManager the VM must - * implement. - * - * @author John Keiser - * @author Eric Blake <ebb9@email.byu.edu> - */ -final class VMSecurityManager -{ - /** - * Get a list of all the classes currently executing methods on the - * Java stack. getClassContext()[0] is the currently executing method, ie. - * the method which called SecurityManager.getClassContext(). (Hint: you - * may need to pop off one or more frames: don't include SecurityManager - * or VMSecurityManager.getClassContext in your result. Also, be sure that - * you correctly handle the context if SecurityManager.getClassContext - * was invoked by reflection). - * - * @return an array of the declaring classes of each stack frame - */ - static native Class[] getClassContext(); - - /** - * Get the current ClassLoader. This is the first non-null class loader - * on the stack, if one exists, stopping either at the end of the stack - * or the first instance of a PrivilegedAction. In other words, this call - * automatically unwinds past all classes loaded by the bootstrap loader, - * where getClassLoader() returns null, to get to the user class that - * really invoked the call that needs a classloader. - * - * @return the current ClassLoader - */ - static native ClassLoader currentClassLoader(); -} |