/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package java.lang;
import org.jnode.vm.VmSystem;
/**
* 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 Class[] getClassContext() {
return VmSystem.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 ClassLoader currentClassLoader() {
Class[] stack = getClassContext();
for (int i = 0; i < stack.length; i++) {
ClassLoader loader = stack[i].getClassLoader();
if (loader != null)
return loader;
}
return null;
}
}