summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2005-02-22 03:39:42 +0000
committerBryce McKinlay <mckinlay@redhat.com>2005-02-22 03:39:42 +0000
commitc79a49e6c2df666b7dc792236d8bfe872c595950 (patch)
treeb8568381359e5f2e18a4c5abe034192c4f3ac664
parentdf4e13685cfc8df78f28d7a66495d5c876fe026a (diff)
downloadclasspath-c79a49e6c2df666b7dc792236d8bfe872c595950.tar.gz
2005-02-21 Bryce McKinlay <mckinlay@redhat.com>
* java/io/ObjectInputStream.java (readClassDescriptor): Cache result of currentLoader() in callersClassLoader field. Check for primitive type Class names if resolveClass throws a ClassNotFoundException. (resolveClass): Call currentLoader() only if callersClassLoader is not set. Cache result of currentLoader(). Don't check for primitive type Class names here. (callersClassLoader): New field. * java/io/ObjectOutputStream.java (writeObject, callWriteMethod): Whitespace fixes.
-rw-r--r--ChangeLog12
-rw-r--r--java/io/ObjectInputStream.java72
-rw-r--r--java/io/ObjectOutputStream.java6
3 files changed, 57 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index ab0336044..c6953c82b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-02-21 Bryce McKinlay <mckinlay@redhat.com>
+
+ * java/io/ObjectInputStream.java (readClassDescriptor): Cache result
+ of currentLoader() in callersClassLoader field. Check for primitive
+ type Class names if resolveClass throws a ClassNotFoundException.
+ (resolveClass): Call currentLoader() only if callersClassLoader is
+ not set. Cache result of currentLoader(). Don't check for primitive
+ type Class names here.
+ (callersClassLoader): New field.
+ * java/io/ObjectOutputStream.java (writeObject, callWriteMethod):
+ Whitespace fixes.
+
2005-02-22 Robert Schuster <thebohemian@gmx.net>
* java/io/InputStreamReader.java: Fixed compilation
diff --git a/java/io/ObjectInputStream.java b/java/io/ObjectInputStream.java
index 1b1b14895..2cfe4c994 100644
--- a/java/io/ObjectInputStream.java
+++ b/java/io/ObjectInputStream.java
@@ -501,7 +501,8 @@ public class ObjectInputStream extends InputStream
flags, fields);
assignNewHandle(osc);
- ClassLoader currentLoader = currentLoader();
+ if (callersClassLoader == null)
+ callersClassLoader = currentLoader();
for (int i = 0; i < field_count; i++)
{
@@ -522,12 +523,40 @@ public class ObjectInputStream extends InputStream
class_name = String.valueOf(type_code);
fields[i] =
- new ObjectStreamField(field_name, class_name, currentLoader);
+ new ObjectStreamField(field_name, class_name, callersClassLoader);
}
/* Now that fields have been read we may resolve the class
* (and read annotation if needed). */
- Class clazz = resolveClass(osc);
+ Class clazz;
+ try
+ {
+ clazz = resolveClass(osc);
+ }
+ catch (ClassNotFoundException cnfe)
+ {
+ // Maybe it was an primitive class?
+ if (name.equals("void"))
+ clazz = Void.TYPE;
+ else if (name.equals("boolean"))
+ clazz = Boolean.TYPE;
+ else if (name.equals("byte"))
+ clazz = Byte.TYPE;
+ else if (name.equals("short"))
+ clazz = Short.TYPE;
+ else if (name.equals("char"))
+ clazz = Character.TYPE;
+ else if (name.equals("int"))
+ clazz = Integer.TYPE;
+ else if (name.equals("long"))
+ clazz = Long.TYPE;
+ else if (name.equals("float"))
+ clazz = Float.TYPE;
+ else if (name.equals("double"))
+ clazz = Double.TYPE;
+ else
+ throw cnfe;
+ }
boolean oldmode = setBlockDataMode(true);
osc.setClass(clazz, lookupClass(clazz.getSuperclass()));
@@ -540,6 +569,7 @@ public class ObjectInputStream extends InputStream
// Maybe it is a primitive class, those don't have a super class,
// or Object itself. Otherwise we can keep getting the superclass
// till we hit the Object class, or some other non-serializable class.
+
if (first_nonserial == null)
first_nonserial = clazz;
else
@@ -740,35 +770,16 @@ public class ObjectInputStream extends InputStream
protected Class resolveClass(ObjectStreamClass osc)
throws ClassNotFoundException, IOException
{
- try
+ if (callersClassLoader == null)
{
- return Class.forName(osc.getName(), true, currentLoader());
- }
- catch (ClassNotFoundException cnfe)
- {
- // Maybe it was an primitive class?
- String name = osc.getName();
- if (name.equals("void"))
- return Void.TYPE;
- if (name.equals("boolean"))
- return Boolean.TYPE;
- if (name.equals("byte"))
- return Byte.TYPE;
- if (name.equals("short"))
- return Short.TYPE;
- if (name.equals("char"))
- return Character.TYPE;
- if (name.equals("int"))
- return Integer.TYPE;
- if (name.equals("long"))
- return Long.TYPE;
- if (name.equals("float"))
- return Float.TYPE;
- if (name.equals("double"))
- return Double.TYPE;
-
- throw cnfe;
+ callersClassLoader = currentLoader ();
+ if (Configuration.DEBUG && dump)
+ {
+ dumpElementln ("CallersClassLoader = " + callersClassLoader);
+ }
}
+
+ return Class.forName(osc.getName(), true, callersClassLoader);
}
/**
@@ -1919,6 +1930,7 @@ public class ObjectInputStream extends InputStream
private Hashtable classLookupTable;
private GetField prereadFields;
+ private ClassLoader callersClassLoader;
private static boolean dump;
// The nesting depth for debugging output
diff --git a/java/io/ObjectOutputStream.java b/java/io/ObjectOutputStream.java
index 6dd3fe9f3..55763eedd 100644
--- a/java/io/ObjectOutputStream.java
+++ b/java/io/ObjectOutputStream.java
@@ -352,8 +352,8 @@ public class ObjectOutputStream extends OutputStream
{
if (dump)
dumpElementln ("WRITE FIELDS CALLED FOR: " + obj);
- writeFields(obj, currentObjectStreamClass);
- }
+ writeFields(obj, currentObjectStreamClass);
+ }
}
this.currentObject = prevObject;
@@ -1268,7 +1268,7 @@ public class ObjectOutputStream extends OutputStream
if (exception instanceof IOException)
throw (IOException) exception;
- IOException ioe
+ IOException ioe
= new IOException("Exception thrown from writeObject() on " +
osc.forClass().getName() + ": " +
exception.getClass().getName());