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:
Tom Tromey
2002-12-05 00:49:30 +00:00
committed by Tom Tromey
parent 67f1b90611
commit 76508852a0
8 changed files with 121 additions and 59 deletions
+2 -6
View File
@@ -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.
+54
View File
@@ -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;
}
+3 -42
View File
@@ -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());
}
/**
+34
View File
@@ -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;
}