summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2005-04-30 13:53:29 +0000
committerMark Wielaard <mark@klomp.org>2005-04-30 13:53:29 +0000
commita312ac7880d32afe5c8465162677c5fcc968983f (patch)
tree9238dd730eced06c95740eb5cd3c783cdb34a4c0
parent14c4666c9827b5570ad498b40dc38e1506f301dc (diff)
downloadclasspath-a312ac7880d32afe5c8465162677c5fcc968983f.tar.gz
* java/io/ObjectInputStream.java
(currentLoader): Don't create SecurityManager, directly call VMObjectInputStream.currentClassLoader(). (resolveProxyClass): Use currentLoader(). * vm/reference/java/io/VMObjectInputStream.java (currentClassLoader(SecurityManager)): Removed. (currentClassLoader): New method. * native/jni/java-io/java_io_VMObjectInputStream.c (Java_java_io_VMObjectInputStream_currentClassLoader): Removed. * include/java_io_VMObjectInputStream.h: Regenerated. * NEWS: Document new interface and reference implementation.
-rw-r--r--ChangeLog15
-rw-r--r--NEWS3
-rw-r--r--include/java_io_VMObjectInputStream.h1
-rw-r--r--java/io/ObjectInputStream.java21
-rw-r--r--native/jni/java-io/java_io_VMObjectInputStream.c22
-rw-r--r--vm/reference/java/io/VMObjectInputStream.java51
6 files changed, 58 insertions, 55 deletions
diff --git a/ChangeLog b/ChangeLog
index 18ac8a9a0..42412a2e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
2005-04-30 Mark Wielaard <mark@klomp.org>
+ * java/io/ObjectInputStream.java
+ (currentLoader): Don't create SecurityManager, directly call
+ VMObjectInputStream.currentClassLoader().
+ (resolveProxyClass): Use currentLoader().
+ * vm/reference/java/io/VMObjectInputStream.java
+ (currentClassLoader(SecurityManager)): Removed.
+ (currentClassLoader): New method.
+ * native/jni/java-io/java_io_VMObjectInputStream.c
+ (Java_java_io_VMObjectInputStream_currentClassLoader): Removed.
+ * include/java_io_VMObjectInputStream.h: Regenerated.
+
+ * NEWS: Document new interface and reference implementation.
+
+2005-04-30 Mark Wielaard <mark@klomp.org>
+
* gnu/java/awt/peer/gtk/GtkToolkit.java (prepareImage): Only prepare
GtkImages.
diff --git a/NEWS b/NEWS
index a904c0397..cb7d3bcc7 100644
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,9 @@ Runtime interface changes:
to define the location of the JNI libraries. It is by all means meant
ONLY for VM implementors and GNU Classpath hackers. See the hacking
guide for more information.
+* The helper methods currentLoader() and allocateObject() for
+ java.io.ObjectInputStream have been moved to a VMObjectInputStream class.
+ Reference implementations are provided.
Other changes:
diff --git a/include/java_io_VMObjectInputStream.h b/include/java_io_VMObjectInputStream.h
index 22e95636e..42dce2286 100644
--- a/include/java_io_VMObjectInputStream.h
+++ b/include/java_io_VMObjectInputStream.h
@@ -10,7 +10,6 @@ extern "C"
{
#endif
-JNIEXPORT jobject JNICALL Java_java_io_VMObjectInputStream_currentClassLoader (JNIEnv *env, jclass, jobject);
JNIEXPORT jobject JNICALL Java_java_io_VMObjectInputStream_allocateObject (JNIEnv *env, jclass, jclass, jclass, jobject);
#ifdef __cplusplus
diff --git a/java/io/ObjectInputStream.java b/java/io/ObjectInputStream.java
index c867240da..ae1d20f29 100644
--- a/java/io/ObjectInputStream.java
+++ b/java/io/ObjectInputStream.java
@@ -783,20 +783,12 @@ public class ObjectInputStream extends InputStream
}
/**
- * This method invokes the method currentClassLoader for the
- * current security manager (or build an empty one if it is not
- * present).
- *
- * @return The most recent non-system ClassLoader on the execution stack.
- * @see java.lang.SecurityManager#currentClassLoader()
+ * Returns he most recent user defined ClassLoader on the execution stack
+ * or null of none is found.
*/
private ClassLoader currentLoader()
{
- SecurityManager sm = System.getSecurityManager();
- if (sm == null)
- sm = new SecurityManager () {};
-
- return VMObjectInputStream.currentClassLoader(sm);
+ return VMObjectInputStream.currentClassLoader();
}
/**
@@ -883,12 +875,7 @@ public class ObjectInputStream extends InputStream
protected Class resolveProxyClass(String[] intfs)
throws IOException, ClassNotFoundException
{
- SecurityManager sm = System.getSecurityManager();
-
- if (sm == null)
- sm = new SecurityManager() {};
-
- ClassLoader cl = VMObjectInputStream.currentClassLoader(sm);
+ ClassLoader cl = currentLoader();
Class[] clss = new Class[intfs.length];
if(cl == null)
diff --git a/native/jni/java-io/java_io_VMObjectInputStream.c b/native/jni/java-io/java_io_VMObjectInputStream.c
index 0e0190a16..71fa71499 100644
--- a/native/jni/java-io/java_io_VMObjectInputStream.c
+++ b/native/jni/java-io/java_io_VMObjectInputStream.c
@@ -49,28 +49,6 @@ exception statement from your version. */
/*
* Class: java_io_VMObjectInputStream
- * Method: currentClassLoader
- * Signature: (Ljava/lang/SecurityManager;)Ljava/lang/ClassLoader;
- */
-JNIEXPORT jobject JNICALL
-Java_java_io_VMObjectInputStream_currentClassLoader (JNIEnv * env,
- jclass clazz,
- jobject loader)
-{
- jmethodID id = (*env)->GetMethodID (env,
- (*env)->GetObjectClass (env, loader),
- "currentClassLoader",
- "()Ljava/lang/ClassLoader;");
-
- if (id == NULL)
- return NULL;
-
- return (*env)->CallObjectMethod (env, loader, id, clazz);
-}
-
-
-/*
- * Class: java_io_VMObjectInputStream
* Method: allocateObject
* Signature: (Ljava/lang/Class;)Ljava/lang/Object;
*/
diff --git a/vm/reference/java/io/VMObjectInputStream.java b/vm/reference/java/io/VMObjectInputStream.java
index a2955fed3..5c0a400ef 100644
--- a/vm/reference/java/io/VMObjectInputStream.java
+++ b/vm/reference/java/io/VMObjectInputStream.java
@@ -39,27 +39,48 @@ exception statement from your version. */
package java.io;
-import gnu.classpath.Configuration;
-import gnu.java.io.ObjectIdentityWrapper;
-
-import java.lang.reflect.Array;
+import gnu.classpath.VMStackWalker;
import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
import java.security.AccessController;
import java.security.PrivilegedAction;
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.Vector;
final class VMObjectInputStream
{
- static native ClassLoader currentClassLoader(SecurityManager sm);
+ private static Class oisClass = ObjectInputStream.class;
+ private static Class vmoisClass = VMObjectInputStream.class;
+
+ // PrivilegedAction needed for Class.getClassLoader()
+ private static PrivilegedAction loaderAction = new PrivilegedAction()
+ {
+ public Object run()
+ {
+ Class[] ctx = VMStackWalker.getClassContext();
+ for (int i = 0; i < ctx.length; i++)
+ {
+ ClassLoader cl = ctx[i].getClassLoader();
+ if (cl != null)
+ return cl;
+ }
+ return null;
+ }
+ };
- static native Object allocateObject(Class clazz, Class constr_clazz, Constructor constructor)
+ /**
+ * Returns the first user defined class loader on the call stack, or
+ * null when no non-null class loader was found.
+ */
+ static ClassLoader currentClassLoader()
+ {
+ return (ClassLoader) AccessController.doPrivileged(loaderAction);
+ }
+
+ /**
+ * Allocates a new Object of type clazz but without running the
+ * default constructor on it. It then calls the given constructor on
+ * it. The given constructor method comes from the constr_clazz
+ * which is a super class of the given clazz.
+ */
+ static native Object allocateObject(Class clazz, Class constr_clazz,
+ Constructor constructor)
throws InstantiationException;
}
-