[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cp-patches] Patch: FYI: Classpath<->libgcj serialization merge
From: |
Bryce McKinlay |
Subject: |
[cp-patches] Patch: FYI: Classpath<->libgcj serialization merge |
Date: |
Mon, 21 Feb 2005 22:36:21 -0500 |
User-agent: |
Mozilla Thunderbird 1.0 (X11/20041206) |
This patch contains two small serialization changes:
1. Caching the result of currentLoader(). Previously we would look up
the current classloader every time a class was read from the stream.
Saving the caller's classloader after the first time avoids tracing the
stack many times for a single ObjectStream.
2. Move checks for primitive type classes (which are valid names in the
ObjectInputStream but which won't be recognized by ClassLoaders) from
resolveClass() to readClassDescriptor(). This is because it is typical
to override resolveClass() in order to force the ObjectInputStream to
use a particular classloader. If that was done, primitive type classes
would no longer work.
With this patch, Serialization code is now completely merged between
libgcj and classpath - for the first time ever!
Bryce
2005-02-21 Bryce McKinlay <address@hidden>
* 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.
Index: ObjectInputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectInputStream.java,v
retrieving revision 1.53
diff -u -r1.53 ObjectInputStream.java
--- ObjectInputStream.java 13 Feb 2005 15:21:57 -0000 1.53
+++ ObjectInputStream.java 22 Feb 2005 03:22:38 -0000
@@ -501,7 +501,8 @@
flags, fields);
assignNewHandle(osc);
- ClassLoader currentLoader = currentLoader();
+ if (callersClassLoader == null)
+ callersClassLoader = currentLoader();
for (int i = 0; i < field_count; i++)
{
@@ -522,12 +523,40 @@
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 @@
// 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 @@
protected Class resolveClass(ObjectStreamClass osc)
throws ClassNotFoundException, IOException
{
- try
+ if (callersClassLoader == null)
{
- return Class.forName(osc.getName(), true, currentLoader());
+ callersClassLoader = currentLoader ();
+ if (Configuration.DEBUG && dump)
+ {
+ dumpElementln ("CallersClassLoader = " + callersClassLoader);
+ }
}
- 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;
- }
+ return Class.forName(osc.getName(), true, callersClassLoader);
}
/**
@@ -1919,6 +1930,7 @@
private Hashtable classLookupTable;
private GetField prereadFields;
+ private ClassLoader callersClassLoader;
private static boolean dump;
// The nesting depth for debugging output
Index: ObjectOutputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectOutputStream.java,v
retrieving revision 1.52
diff -u -r1.52 ObjectOutputStream.java
--- ObjectOutputStream.java 1 Dec 2004 10:13:33 -0000 1.52
+++ ObjectOutputStream.java 22 Feb 2005 03:22:38 -0000
@@ -352,8 +352,8 @@
{
if (dump)
dumpElementln ("WRITE FIELDS CALLED FOR: " + obj);
- writeFields(obj, currentObjectStreamClass);
- }
+ writeFields(obj, currentObjectStreamClass);
+ }
}
this.currentObject = prevObject;
@@ -1268,7 +1268,7 @@
if (exception instanceof IOException)
throw (IOException) exception;
- IOException ioe
+ IOException ioe
= new IOException("Exception thrown from writeObject() on " +
osc.forClass().getName() + ": " +
exception.getClass().getName());
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cp-patches] Patch: FYI: Classpath<->libgcj serialization merge,
Bryce McKinlay <=