summaryrefslogtreecommitdiff
path: root/vm
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 /vm
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.
Diffstat (limited to 'vm')
-rw-r--r--vm/reference/java/io/VMObjectInputStream.java51
1 files changed, 36 insertions, 15 deletions
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;
}
-