Makefile.in: Rebuilt.
* Makefile.in: Rebuilt. * Makefile.am (nat_source_files): Added natVMSecurityManager, natResourceBundle. * java/util/ResourceBundle.java (Security): Removed. (getCallingClassLoader): Now native. * java/util/natResourceBundle.cc: New file. * java/lang/natVMSecurityManager.cc: New file. * java/lang/VMSecurityManager.java (getClassContext): Now native. From-SVN: r59840
This commit is contained in:
@@ -42,8 +42,6 @@ import java.lang.ref.Reference;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import gnu.classpath.Configuration;
|
||||
|
||||
/**
|
||||
@@ -105,44 +103,7 @@ public abstract class ResourceBundle
|
||||
*/
|
||||
private Locale locale;
|
||||
|
||||
/**
|
||||
* We override SecurityManager in order to access getClassContext().
|
||||
*/
|
||||
private static final class Security extends SecurityManager
|
||||
{
|
||||
/**
|
||||
* Avoid accessor method of private constructor.
|
||||
*/
|
||||
Security()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the ClassLoader of the class which called into this
|
||||
* ResourceBundle, or null if it cannot be determined.
|
||||
*/
|
||||
ClassLoader getCallingClassLoader()
|
||||
{
|
||||
Class[] stack = getClassContext();
|
||||
for (int i = 0; i < stack.length; i++)
|
||||
if (stack[i] != Security.class && stack[i] != ResourceBundle.class)
|
||||
return stack[i].getClassLoader();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** A security context for grabbing the correct class loader. */
|
||||
private static final Security security
|
||||
= (Security) AccessController.doPrivileged(new PrivilegedAction()
|
||||
{
|
||||
// This will always work since java.util classes have (all) system
|
||||
// permissions.
|
||||
public Object run()
|
||||
{
|
||||
return new Security();
|
||||
}
|
||||
}
|
||||
);
|
||||
private static native ClassLoader getCallingClassLoader();
|
||||
|
||||
/**
|
||||
* The resource bundle cache. This is a two-level hash map: The key
|
||||
@@ -256,7 +217,7 @@ public abstract class ResourceBundle
|
||||
public static final ResourceBundle getBundle(String baseName)
|
||||
{
|
||||
return getBundle(baseName, Locale.getDefault(),
|
||||
security.getCallingClassLoader());
|
||||
getCallingClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -274,7 +235,7 @@ public abstract class ResourceBundle
|
||||
public static final ResourceBundle getBundle(String baseName,
|
||||
Locale locale)
|
||||
{
|
||||
return getBundle(baseName, locale, security.getCallingClassLoader());
|
||||
return getBundle(baseName, locale, getCallingClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
// Written by Tom Tromey <tromey@redhat.com>
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <gcj/cni.h>
|
||||
#include <jvm.h>
|
||||
#include <java/util/ResourceBundle.h>
|
||||
#include <java/lang/SecurityManager.h>
|
||||
#include <java/lang/ClassLoader.h>
|
||||
#include <java/lang/Class.h>
|
||||
#include <gnu/gcj/runtime/StackTrace.h>
|
||||
|
||||
java::lang::ClassLoader *
|
||||
java::util::ResourceBundle::getCallingClassLoader ()
|
||||
{
|
||||
gnu::gcj::runtime::StackTrace *t = new gnu::gcj::runtime::StackTrace(6);
|
||||
if (! t)
|
||||
return NULL;
|
||||
for (int i = 3; i < 6; ++i)
|
||||
{
|
||||
jclass klass = t->classAt(i);
|
||||
if (klass != NULL)
|
||||
return klass->getClassLoaderInternal();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user