aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2007-04-26 14:42:37 +0000
committerAndrew Haley <aph@redhat.com>2007-04-26 14:42:37 +0000
commitaa37305baed082d859f7e32b6b9ba448223e6283 (patch)
tree3fd8a7eb0c6263c80846c05c9d688deea01b6d2f
parentdf9828321acc5860234cf3af3fc5986acaaa8c29 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/redhat/gcc-4_1-branch@124189 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libjava/classpath/ChangeLog.gcj11
-rw-r--r--libjava/classpath/java/io/ObjectInputStream.java13
-rw-r--r--libjava/classpath/java/io/ObjectOutputStream.java8
-rw-r--r--libjava/classpath/java/io/ObjectStreamClass.java23
4 files changed, 53 insertions, 2 deletions
diff --git a/libjava/classpath/ChangeLog.gcj b/libjava/classpath/ChangeLog.gcj
index 8ce7506acc0..f93f0a6fe71 100644
--- a/libjava/classpath/ChangeLog.gcj
+++ b/libjava/classpath/ChangeLog.gcj
@@ -1,3 +1,14 @@
+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.
+
2007-03-09 Gary Benson <gbenson@redhat.com>
Chris Burdess <dog@gnu.org>
diff --git a/libjava/classpath/java/io/ObjectInputStream.java b/libjava/classpath/java/io/ObjectInputStream.java
index d6c1406ea81..671eb4db56d 100644
--- a/libjava/classpath/java/io/ObjectInputStream.java
+++ b/libjava/classpath/java/io/ObjectInputStream.java
@@ -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)
{
diff --git a/libjava/classpath/java/io/ObjectOutputStream.java b/libjava/classpath/java/io/ObjectOutputStream.java
index c3c3df9a304..a4339f5793b 100644
--- a/libjava/classpath/java/io/ObjectOutputStream.java
+++ b/libjava/classpath/java/io/ObjectOutputStream.java
@@ -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);
diff --git a/libjava/classpath/java/io/ObjectStreamClass.java b/libjava/classpath/java/io/ObjectStreamClass.java
index 52a1ad42873..cc3d0a9e31f 100644
--- a/libjava/classpath/java/io/ObjectStreamClass.java
+++ b/libjava/classpath/java/io/ObjectStreamClass.java
@@ -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;