diff options
author | Andrew Haley <aph@redhat.com> | 2007-04-26 14:42:37 +0000 |
---|---|---|
committer | Andrew Haley <aph@redhat.com> | 2007-04-26 14:42:37 +0000 |
commit | aa37305baed082d859f7e32b6b9ba448223e6283 (patch) | |
tree | 3fd8a7eb0c6263c80846c05c9d688deea01b6d2f | |
parent | df9828321acc5860234cf3af3fc5986acaaa8c29 (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.gcj | 11 | ||||
-rw-r--r-- | libjava/classpath/java/io/ObjectInputStream.java | 13 | ||||
-rw-r--r-- | libjava/classpath/java/io/ObjectOutputStream.java | 8 | ||||
-rw-r--r-- | libjava/classpath/java/io/ObjectStreamClass.java | 23 |
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; |