summaryrefslogtreecommitdiff
path: root/libjava/classpath/java/io/ObjectStreamClass.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/java/io/ObjectStreamClass.java')
-rw-r--r--libjava/classpath/java/io/ObjectStreamClass.java23
1 files changed, 23 insertions, 0 deletions
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;