Frames | No Frames |
1: /* VMStackWalker.java -- Reference implementation of VM hooks for stack access 2: Copyright (C) 2005, 2006 Free Software Foundation 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package gnu.classpath; 39: 40: import gnu.gcj.RawData; 41: 42: /** 43: * This class provides access to the classes on the Java stack 44: * for reflection and security purposes. 45: * 46: * <p> 47: * This class is only available to privileged code (i.e., code loaded 48: * by the bootstrap loader). 49: * 50: * @author John Keiser 51: * @author Eric Blake <ebb9@email.byu.edu> 52: * @author Archie Cobbs 53: * @author Andrew Haley <aph@redhat.com> 54: * @author Gary Benson <gbenson@redhat.com> 55: */ 56: public final class VMStackWalker 57: { 58: /** 59: * Get a list of all the classes currently executing methods on the 60: * Java stack. <code>getClassContext()[0]</code> is the class associated 61: * with the currently executing method, i.e., the method that called 62: * <code>VMStackWalker.getClassContext()</code> (possibly through 63: * reflection). So you may need to pop off these stack frames from 64: * the top of the stack: 65: * <ul> 66: * <li><code>VMStackWalker.getClassContext()</code> 67: * <li><code>Method.invoke()</code> 68: * </ul> 69: * 70: * @return an array of the declaring classes of each stack frame 71: */ 72: public static native Class[] getClassContext(); 73: 74: /** 75: * Get the class associated with the method invoking the method 76: * invoking this method, or <code>null</code> if the stack is not 77: * that deep (e.g., invoked via JNI invocation API). This method 78: * is an optimization for the expression <code>getClassContext()[1]</code> 79: * and should return the same result. 80: * 81: * <p> 82: * When compiling to native code gcj translates calls to this 83: * method into calls to <code>getCallingClass(addr)</code>, with 84: * <code>addr</code> being the address of the method calling this 85: * method. <code>getCallingClass(addr)</code> does not unwind the 86: * stack, so is therefore more efficient. 87: */ 88: public static native Class getCallingClass(); 89: 90: /** 91: * Get the class associated with the method invoking the method 92: * invoking this method, or <code>null</code> if the stack is not 93: * that deep (e.g., invoked via JNI invocation API). 94: * 95: * @param addr The address of the method invoking this method. 96: */ 97: private static native Class getCallingClass(RawData addr); 98: 99: /** 100: * Get the class loader associated with the Class returned by 101: * <code>getCallingClass()</code>, or <code>null</code> if no such class 102: * exists or it is the boot loader. This method is an optimization for the 103: * expression <code>VMStackWalker.getClassLoader(getClassContext()[1])</code> 104: * and should return the same result. 105: * 106: * <p> 107: * When compiling to native code gcj translates calls to this 108: * method into calls to <code>getCallingClassLoader(addr)</code>, 109: * with <code>addr</code> being the address of the method calling 110: * this method. <code>getCallingClassLoader(addr)</code> does not 111: * unwind the stack, so is therefore more efficient. 112: */ 113: public static native ClassLoader getCallingClassLoader(); 114: 115: /** 116: * Get the class loader associated with the Class returned by 117: * <code>getCallingClass()</code>, or <code>null</code> if no 118: * such class exists or it is the boot loader. 119: * 120: * @param addr The address of the method invoking this method. 121: */ 122: private static native ClassLoader getCallingClassLoader(RawData addr); 123: 124: /** 125: * Retrieve the class's ClassLoader, or <code>null</code> if loaded 126: * by the bootstrap loader. I.e., this should return the same thing 127: * as {@link java.lang.VMClass#getClassLoader}. This duplicate version 128: * is here to work around access permissions. 129: */ 130: public static native ClassLoader getClassLoader(Class cl); 131: 132: /** 133: * Walk up the stack and return the first non-null class loader. 134: * If there aren't any non-null class loaders on the stack, return null. 135: */ 136: public static native ClassLoader firstNonNullClassLoader(); 137: }