[multiple changes]
2005-02-21 Bryce McKinlay <mckinlay@redhat.com> Merge serialization from GNU Classpath. * gcj/method.h: Add missing #includes. * java/io/ObjectInputStream.java (readClassDescriptor): Check for primitive class IDs on the stream here... (resolveClass): ...not here. * java/io/ObjectStreamField.java: Use VMObjectStream class calls to set fields. * java/io/VMObjectStreamClass.java (setDoubleNative, setFloatNative, setLongNative, setIntNative, setShortNative, setCharNative, setByteNative, setBooleanNative, setObjectNative): New native methods. * java/io/natVMObjectStreamClass.java (setDoubleNative, setFloatNative, setLongNative, setIntNative, setShortNative, setCharNative, setByteNative, setBooleanNative, setObjectNative): Implement them. * java/io/natObjectInputStream.cc (allocateObject): Add new parameters from Classpath's version. Use _Jv_FromReflectedConstructor(). Call the constructor here. (callConstructor): Removed. (getCallersClassLoader): Removed. * java/lang/reflect/Field.java (setByte, setShort, setInt, setLong, setFloat, setDouble, setChar, setBoolean): Add 'checkFinal' parameter to control whether setting final field values is permitted. Call getAddr() with checkFinal parameter instead of setAddr(). * java/lang/reflect/natField.cc (getType): Lookup and resolve field only if not done already. (getAddr): Add checkFinal parameter. Do the final field check only if checkFinal is set. (setAddr): Removed. 2005-02-21 Mark Wielaard <mark@klomp.org> # Fixes bug #11957 * java/io/ObjectInputStream.java (resolveClass): Don't check "void" twice. 2005-02-21 Mark Wielaard <mark@klomp.org> Fixes bug #11618. * java/io/ObjectInputStream.java (readClassDescriptor): Handle classes without a super class and us ObjectStreamClass.lookupForClassObject(). (resolveClass): Check for primitive types. (lookupClass): Return null when argument is null. 2005-02-21 Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectInputStream.java (readObject): Fix to consume TC_ENDBLOCKDATA after readExternal. 2005-02-21 Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectOutputStream.java (writeObject, callWriteMethod): Replaced reflection with accessing cached info in ObjectStreamClass. (getMethod): Removed. * java/io/ObjectStreamClass.java (findMethod): Added check to make sure the method found has the right modifiers. (cacheMethods): Added writeReplace and writeObject methods. (setFlags): Look at new writeObjectMethod field instead of doing reflection again. (writeReplaceMethod): New field. (writeObjectMethod): New field. 2005-02-21 Guilhem Lavaux <guilhem@kaffe.org> Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectInputStream.java (newObject): Changed prototype. Get a constructor reflect object directly. (callConstructor): Removed. (allocateObject): Changed prototype. (readClassDescriptor): Build the constructor reflection directly. (readObject): Invoke newObject using the new prototype. * java/io/ObjectStreamClass.java (firstNonSerializableParent): Removed. (firstNonSerializableParentConstructor): Added. From-SVN: r95378
This commit is contained in:
parent
bb2e164049
commit
f4294557b7
10 changed files with 454 additions and 255 deletions
|
@ -250,6 +250,11 @@ public class ObjectOutputStream extends OutputStream
|
|||
break;
|
||||
}
|
||||
|
||||
Class clazz = obj.getClass();
|
||||
ObjectStreamClass osc = ObjectStreamClass.lookupForClassObject(clazz);
|
||||
if (osc == null)
|
||||
throw new NotSerializableException(clazz.getName());
|
||||
|
||||
if ((replacementEnabled || obj instanceof Serializable)
|
||||
&& ! replaceDone)
|
||||
{
|
||||
|
@ -257,19 +262,11 @@ public class ObjectOutputStream extends OutputStream
|
|||
|
||||
if (obj instanceof Serializable)
|
||||
{
|
||||
Method m = null;
|
||||
try
|
||||
{
|
||||
Class classArgs[] = {};
|
||||
m = getMethod(obj.getClass(), "writeReplace",
|
||||
classArgs);
|
||||
// m can't be null by definition since an
|
||||
// exception would have been thrown so a check
|
||||
// for null is not needed.
|
||||
obj = m.invoke(obj, new Object[] {});
|
||||
}
|
||||
catch (NoSuchMethodException ignore)
|
||||
{
|
||||
Method m = osc.writeReplaceMethod;
|
||||
if (m != null)
|
||||
obj = m.invoke(obj, new Object[0]);
|
||||
}
|
||||
catch (IllegalAccessException ignore)
|
||||
{
|
||||
|
@ -294,11 +291,6 @@ public class ObjectOutputStream extends OutputStream
|
|||
break;
|
||||
}
|
||||
|
||||
Class clazz = obj.getClass();
|
||||
ObjectStreamClass osc = ObjectStreamClass.lookupForClassObject(clazz);
|
||||
if (osc == null)
|
||||
throw new NotSerializableException(clazz.getName());
|
||||
|
||||
if (clazz.isArray ())
|
||||
{
|
||||
realOutput.writeByte(TC_ARRAY);
|
||||
|
@ -347,8 +339,8 @@ public class ObjectOutputStream extends OutputStream
|
|||
fieldsAlreadyWritten = false;
|
||||
if (currentObjectStreamClass.hasWriteMethod())
|
||||
{
|
||||
if (dump)
|
||||
dumpElementln ("WRITE METHOD CALLED FOR: " + obj);
|
||||
if (dump)
|
||||
dumpElementln ("WRITE METHOD CALLED FOR: " + obj);
|
||||
setBlockDataMode(true);
|
||||
callWriteMethod(obj, currentObjectStreamClass);
|
||||
setBlockDataMode(false);
|
||||
|
@ -358,10 +350,10 @@ public class ObjectOutputStream extends OutputStream
|
|||
}
|
||||
else
|
||||
{
|
||||
if (dump)
|
||||
dumpElementln ("WRITE FIELDS CALLED FOR: " + obj);
|
||||
writeFields(obj, currentObjectStreamClass);
|
||||
}
|
||||
if (dump)
|
||||
dumpElementln ("WRITE FIELDS CALLED FOR: " + obj);
|
||||
writeFields(obj, currentObjectStreamClass);
|
||||
}
|
||||
}
|
||||
|
||||
this.currentObject = prevObject;
|
||||
|
@ -1261,18 +1253,11 @@ public class ObjectOutputStream extends OutputStream
|
|||
private void callWriteMethod(Object obj, ObjectStreamClass osc)
|
||||
throws IOException
|
||||
{
|
||||
Class klass = osc.forClass();
|
||||
currentPutField = null;
|
||||
try
|
||||
{
|
||||
Class classArgs[] = {ObjectOutputStream.class};
|
||||
Method m = getMethod(klass, "writeObject", classArgs);
|
||||
Object args[] = {this};
|
||||
m.invoke(obj, args);
|
||||
}
|
||||
catch (NoSuchMethodException nsme)
|
||||
{
|
||||
// Nothing.
|
||||
Object args[] = {this};
|
||||
osc.writeObjectMethod.invoke(obj, args);
|
||||
}
|
||||
catch (InvocationTargetException x)
|
||||
{
|
||||
|
@ -1285,7 +1270,8 @@ public class ObjectOutputStream extends OutputStream
|
|||
|
||||
IOException ioe
|
||||
= new IOException("Exception thrown from writeObject() on " +
|
||||
klass + ": " + exception.getClass().getName());
|
||||
osc.forClass().getName() + ": " +
|
||||
exception.getClass().getName());
|
||||
ioe.initCause(exception);
|
||||
throw ioe;
|
||||
}
|
||||
|
@ -1293,7 +1279,8 @@ public class ObjectOutputStream extends OutputStream
|
|||
{
|
||||
IOException ioe
|
||||
= new IOException("Failure invoking writeObject() on " +
|
||||
klass + ": " + x.getClass().getName());
|
||||
osc.forClass().getName() + ": " +
|
||||
x.getClass().getName());
|
||||
ioe.initCause(x);
|
||||
throw ioe;
|
||||
}
|
||||
|
@ -1535,15 +1522,6 @@ public class ObjectOutputStream extends OutputStream
|
|||
}
|
||||
}
|
||||
|
||||
private Method getMethod (Class klass, String name, Class[] args)
|
||||
throws java.lang.NoSuchMethodException
|
||||
{
|
||||
final Method m = klass.getDeclaredMethod(name, args);
|
||||
setAccessible.setMember(m);
|
||||
AccessController.doPrivileged(setAccessible);
|
||||
return m;
|
||||
}
|
||||
|
||||
private void dumpElementln (String msg)
|
||||
{
|
||||
for (int i = 0; i < depth; i++)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue