natVMSecurityManager.cc (getClassContext): Add new arg: klass.

2005-03-17  Andrew Haley  <aph@redhat.com>

	* java/lang/natVMSecurityManager.cc (getClassContext): Add new
	arg: klass.
	Pass klass to _Jv_StackTrace::GetClassContext().
	* java/lang/ClassLoader.java (getParent): Pass class to
	VMSecurityManager.getClassContext()
	(getSystemClassLoader): Likewise.
	* java/lang/Package.java (getPackage): Likewise.
	(getPackages): Likewise.
	* java/lang/SecurityManager.java (getClassContext): Likewise.
	(currentClassLoader): Likewise.
	* java/lang/VMSecurityManager.java: (getClassContext): Likewise.
	(currentClassLoader) Add new arg: caller.
	Pass caller to VMSecurityManager.getClassContext.

	* stacktrace.cc (GetClassContext): Correct calculation of
	jframe_count.

	* boehm.cc (_Jv_MarkObj): (_Jv_MarkObj): Mark
	im->source_file_name.

From-SVN: r96803
This commit is contained in:
Andrew Haley 2005-03-21 14:50:14 +00:00 committed by Andrew Haley
parent 21e01bf10d
commit e5a8980bb9
8 changed files with 45 additions and 22 deletions

View file

@ -486,7 +486,7 @@ public abstract class ClassLoader
SecurityManager sm = System.getSecurityManager();
if (sm != null)
{
Class c = VMSecurityManager.getClassContext()[1];
Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
ClassLoader cl = c.getClassLoader();
if (cl != null && ! cl.isAncestorOf(this))
sm.checkPermission(new RuntimePermission("getClassLoader"));
@ -729,7 +729,7 @@ public abstract class ClassLoader
SecurityManager sm = System.getSecurityManager();
if (sm != null)
{
Class c = VMSecurityManager.getClassContext()[1];
Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
ClassLoader cl = c.getClassLoader();
if (cl != null && cl != systemClassLoader)
sm.checkPermission(new RuntimePermission("getClassLoader"));

View file

@ -273,7 +273,7 @@ public class Package
public static Package getPackage(String name)
{
// Get the caller's classloader
ClassLoader cl = VMSecurityManager.currentClassLoader();
ClassLoader cl = VMSecurityManager.currentClassLoader(Package.class);
return cl != null ? cl.getPackage(name) : VMClassLoader.getPackage(name);
}
@ -286,7 +286,7 @@ public class Package
public static Package[] getPackages()
{
// Get the caller's classloader
Class c = VMSecurityManager.getClassContext()[1];
Class c = VMSecurityManager.getClassContext(Package.class)[1];
ClassLoader cl = c.getClassLoader();
return cl != null ? cl.getPackages() : VMClassLoader.getPackages();
}

View file

@ -167,7 +167,7 @@ public class SecurityManager
*/
protected Class[] getClassContext()
{
return VMSecurityManager.getClassContext();
return VMSecurityManager.getClassContext(SecurityManager.class);
}
/**
@ -189,7 +189,7 @@ public class SecurityManager
*/
protected ClassLoader currentClassLoader()
{
return VMSecurityManager.currentClassLoader();
return VMSecurityManager.currentClassLoader(SecurityManager.class);
}
/**

View file

@ -43,19 +43,19 @@ class VMSecurityManager
** @return an array containing all the methods on classes
** on the Java execution stack.
**/
static native Class[] getClassContext();
static native Class[] getClassContext(Class caller);
/** Get the current ClassLoader--the one nearest to the
** top of the stack.
** @return the current ClassLoader.
**/
static ClassLoader currentClassLoader()
static ClassLoader currentClassLoader(Class caller)
{
// The docs above are wrong. See the online docs.
// FIXME this implementation is a bit wrong too -- the docs say we
// must also consider ancestors of the system class loader.
ClassLoader systemClassLoader = VMClassLoader.getSystemClassLoader();
Class[] classStack = getClassContext ();
Class[] classStack = getClassContext (caller);
for (int i = 0; i < classStack.length; i++)
{
ClassLoader loader = classStack[i].getClassLoader();

View file

@ -20,10 +20,10 @@ details. */
#include <java/lang/Class.h>
JArray<jclass> *
java::lang::VMSecurityManager::getClassContext ()
java::lang::VMSecurityManager::getClassContext (jclass klass)
{
JArray<jclass> *result =
_Jv_StackTrace::GetClassContext (&SecurityManager::class$);
_Jv_StackTrace::GetClassContext (klass);
return result;
}