classpath-patches
[Top][All Lists]
Advanced

[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());

reply via email to

[Prev in Thread] Current Thread [Next in Thread]