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:
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* java.lang.SecurityManager: part of the Java Class Libraries project.
|
||||
* Copyright (C) 1998, 2001 Free Software Foundation
|
||||
* Copyright (C) 1998, 2001, 2002 Free Software Foundation
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
@@ -43,11 +43,7 @@ class VMSecurityManager
|
||||
** @return an array containing all the methods on classes
|
||||
** on the Java execution stack.
|
||||
**/
|
||||
static Class[] getClassContext()
|
||||
{
|
||||
// FIXME: can't yet implement this for libgcj.
|
||||
return new Class[0];
|
||||
}
|
||||
static native Class[] getClassContext();
|
||||
|
||||
/** Get the current ClassLoader--the one nearest to the
|
||||
** top of the stack.
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/* 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/lang/VMSecurityManager.h>
|
||||
#include <java/lang/SecurityManager.h>
|
||||
#include <java/lang/ClassLoader.h>
|
||||
#include <java/lang/Class.h>
|
||||
#include <gnu/gcj/runtime/StackTrace.h>
|
||||
|
||||
JArray<jclass> *
|
||||
java::lang::VMSecurityManager::getClassContext ()
|
||||
{
|
||||
JArray<jclass> *result = NULL;
|
||||
gnu::gcj::runtime::StackTrace *t = new gnu::gcj::runtime::StackTrace();
|
||||
if (t)
|
||||
{
|
||||
int maxlen = t->length();
|
||||
|
||||
int len = 0;
|
||||
while (len < maxlen)
|
||||
{
|
||||
jclass klass = t->classAt(len);
|
||||
if (klass != NULL && klass != &java::lang::VMSecurityManager::class$
|
||||
&& klass != &java::lang::SecurityManager::class$)
|
||||
++len;
|
||||
}
|
||||
|
||||
result =
|
||||
(JArray<jclass> *) _Jv_NewObjectArray (len, &java::lang::Class::class$,
|
||||
NULL);
|
||||
|
||||
len = 0;
|
||||
while (len < maxlen)
|
||||
{
|
||||
jclass klass = t->classAt(len);
|
||||
if (klass != NULL && klass != &java::lang::VMSecurityManager::class$
|
||||
&& klass != &java::lang::SecurityManager::class$)
|
||||
elements(result)[len++] = klass;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -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