ObjectStreamClass.java (ensureFieldsSet): New method.
authorAndrew Haley <aph@gcc.gnu.org>
Thu, 26 Apr 2007 14:31:29 +0000 (14:31 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Thu, 26 Apr 2007 14:31:29 +0000 (14:31 +0000)
2007-04-25  Andrew Haley  <aph@redhat.com>

* java/io/ObjectStreamClass.java (ensureFieldsSet): New method.
(setFields): call ensureFieldsSet.
(fieldsSet): New field.
* java/io/ObjectOutputStream.java (writeFields): Call
osc.ensureFieldsSet().

* java/io/ObjectInputStream.java (parseContent): Assign the handle
for a PROXYCLASSDESC immediately after reading the marker.

From-SVN: r124187

15 files changed:
libjava/classpath/java/io/ObjectInputStream.java
libjava/classpath/java/io/ObjectOutputStream.java
libjava/classpath/java/io/ObjectStreamClass.java
libjava/classpath/lib/java/io/ObjectInputStream$1.class
libjava/classpath/lib/java/io/ObjectInputStream$2.class
libjava/classpath/lib/java/io/ObjectInputStream$GetField.class
libjava/classpath/lib/java/io/ObjectInputStream$ValidatorAndPriority.class
libjava/classpath/lib/java/io/ObjectInputStream.class
libjava/classpath/lib/java/io/ObjectOutputStream.class
libjava/classpath/lib/java/io/ObjectStreamClass$1.class
libjava/classpath/lib/java/io/ObjectStreamClass$2.class
libjava/classpath/lib/java/io/ObjectStreamClass$InterfaceComparator.class
libjava/classpath/lib/java/io/ObjectStreamClass$MemberComparator.class
libjava/classpath/lib/java/io/ObjectStreamClass.class
libjava/java/io/ObjectStreamClass.h

index e469609bde0f2e15e33f744a13d3fa88290d2a32..735d46cd920904f180bfe6f0fd5eb4d12a2acddc 100644 (file)
@@ -223,6 +223,15 @@ public class ObjectInputStream extends InputStream
        case TC_PROXYCLASSDESC:
        {
          if(dump) dumpElementln("PROXYCLASS");
+
+/* GCJ LOCAL */
+         // The grammar at this point is
+         //   TC_PROXYCLASSDESC newHandle proxyClassDescInfo
+         // i.e. we have to assign the handle immediately after
+         // reading the marker.
+         int handle = assignNewHandle("Dummy proxy");
+/* END GCJ LOCAL */
+
          int n_intf = this.realInputStream.readInt();
          String[] intfs = new String[n_intf];
          for (int i = 0; i < n_intf; i++)
@@ -250,7 +259,9 @@ public class ObjectInputStream extends InputStream
                     new InternalError("Object ctor missing").initCause(x);
                 }
             }
-         assignNewHandle(osc);
+/* GCJ LOCAL */
+         rememberHandle(osc,handle);
+/* END GCJ LOCAL */
          
          if (!is_consumed)
            {
index eac11f78db92043450b375d1bb08087506b387a4..316b9070133e2a43dd3c6e4f07613de2df211988 100644 (file)
@@ -1211,11 +1211,17 @@ public class ObjectOutputStream extends OutputStream
   }
 
 
+/* GCJ LOCAL */
   // writes out FIELDS of OBJECT for the specified ObjectStreamClass.
-  // FIELDS are already in canonical order.
+  // FIELDS are already supposed already to be in canonical order, but
+  // under some circumstances (to do with Proxies) this isn't the
+  // case, so we call ensureFieldsSet().
   private void writeFields(Object obj, ObjectStreamClass osc)
     throws IOException
   {
+    osc.ensureFieldsSet(osc.forClass());
+/* END GCJ LOCAL */
+
     ObjectStreamField[] fields = osc.fields;
     boolean oldmode = setBlockDataMode(false);
 
index 52a1ad428738c6d0184da0202464a18c73cf075a..cc3d0a9e31fb1569ec19449f73ced3d8ace021a7 100644 (file)
@@ -654,11 +654,29 @@ outer:
       flags |= ObjectStreamConstants.SC_ENUM;
   }
 
+/* GCJ LOCAL */
+  // FIXME: This is a workaround for a fairly obscure bug that happens
+  // when reading a Proxy and then writing it back out again.  The
+  // result is that the ObjectStreamClass doesn't have its fields set,
+  // generating a NullPointerException.  Rather than this kludge we
+  // should probably fix the real bug, but it would require a fairly
+  // radical reorganization to do so.
+  final void ensureFieldsSet(Class cl)
+  {
+    if (! fieldsSet)
+      setFields(cl);
+  }
+/* END GCJ LOCAL */
+
 
   // Sets fields to be a sorted array of the serializable fields of
   // clazz.
   private void setFields(Class cl)
   {
+/* GCJ LOCAL */
+    fieldsSet = true;
+/* END GCJ LOCAL */
+
     SetAccessibleAction setAccessible = new SetAccessibleAction();
 
     if (!isSerializable() || isExternalizable() || isEnum())
@@ -1094,6 +1112,11 @@ outer:
 
   boolean isProxyClass = false;
 
+/* GCJ LOCAL */
+  // True after setFields() has been called
+  private boolean fieldsSet = false;
+/* END GCJ LOCAL */
+
   // This is probably not necessary because this class is special cased already
   // but it will avoid showing up as a discrepancy when comparing SUIDs.
   private static final long serialVersionUID = -6120832682080437368L;
index 43e3a0c23fc57d2c7f5b02c5303e7d672863de2f..d800fe4c61d425187a9d1caac2f51477c5d2e81a 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectInputStream$1.class and b/libjava/classpath/lib/java/io/ObjectInputStream$1.class differ
index 053a354bde5fe5671b005a22fb3045507ac45b34..d723177725c828bd873f929073761f53be7bf5c4 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectInputStream$2.class and b/libjava/classpath/lib/java/io/ObjectInputStream$2.class differ
index da4ee3774702c21c2e305144ffac98bb087dea31..e93a33030a2f62eaf462018f4fd5500ea5e6d326 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectInputStream$GetField.class and b/libjava/classpath/lib/java/io/ObjectInputStream$GetField.class differ
index 20eacdb3b2be1400a5e7e71efcc4ce52e20bf69c..06cec269ed18cc18f4b4e3236efc3729ef612db5 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectInputStream$ValidatorAndPriority.class and b/libjava/classpath/lib/java/io/ObjectInputStream$ValidatorAndPriority.class differ
index 9cc3755a53ff66fa4b704985a5a67754341b9a93..2c61cc687cf63b91fa3fd45084302800fa268f84 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectInputStream.class and b/libjava/classpath/lib/java/io/ObjectInputStream.class differ
index 2ab5f486baa7d08f24e1e194f7150da8889baa88..472096945b063da8c49924abb64228101cc5bc63 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectOutputStream.class and b/libjava/classpath/lib/java/io/ObjectOutputStream.class differ
index 6279a244cd8a9343858205e3261f31ebb24c53d8..8b3cbb0f527ff186adc409617f1441e4a9a75e44 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectStreamClass$1.class and b/libjava/classpath/lib/java/io/ObjectStreamClass$1.class differ
index 4c91ea650b2b83be212fbafe629758695889b4a3..18a1c61b270db176067cc88f7a0805ddc4fbb4fb 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectStreamClass$2.class and b/libjava/classpath/lib/java/io/ObjectStreamClass$2.class differ
index 7c0ac37ee2f1bf4ea06af7f2da418662b572fa5e..babf58570decf555bc0073e700f8a2098a072af6 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectStreamClass$InterfaceComparator.class and b/libjava/classpath/lib/java/io/ObjectStreamClass$InterfaceComparator.class differ
index 233aa690ae438f7b826af41a761e732490783722..527fd88ab9f57e8c50d5a7e9e79242bd411e91f1 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectStreamClass$MemberComparator.class and b/libjava/classpath/lib/java/io/ObjectStreamClass$MemberComparator.class differ
index e0d9e7f21b2e00a05772ee37a50099f56235328e..da622eb8947befb44488a48fbd237aad79bc2c9f 100644 (file)
Binary files a/libjava/classpath/lib/java/io/ObjectStreamClass.class and b/libjava/classpath/lib/java/io/ObjectStreamClass.class differ
index 7638f7bed3a8422b10a854750e115e42bb133a7a..34514534b8d9b28816dba0552b0aa1daa16f2089 100644 (file)
@@ -57,6 +57,9 @@ private:
   void cacheMethods();
   ObjectStreamClass(::java::lang::Class *);
   void setFlags(::java::lang::Class *);
+public: // actually package-private
+  virtual void ensureFieldsSet(::java::lang::Class *);
+private:
   void setFields(::java::lang::Class *);
   jlong getClassUID(::java::lang::Class *);
 public: // actually package-private
@@ -105,6 +108,7 @@ private:
 public: // actually package-private
   jboolean isProxyClass;
 private:
+  jboolean fieldsSet;
   static const jlong serialVersionUID = -6120832682080437368LL;
 public:
   static ::java::lang::Class class$;