From f4294557b7ebb12ab58c9b57e1309d5f2fcfb019 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Tue, 22 Feb 2005 03:13:35 +0000 Subject: [multiple changes] 2005-02-21 Bryce McKinlay 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 # Fixes bug #11957 * java/io/ObjectInputStream.java (resolveClass): Don't check "void" twice. 2005-02-21 Mark Wielaard 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 * java/io/ObjectInputStream.java (readObject): Fix to consume TC_ENDBLOCKDATA after readExternal. 2005-02-21 Jeroen Frijters * 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 Jeroen Frijters * 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 --- libjava/java/io/ObjectOutputStream.java | 62 +++++++++++---------------------- 1 file changed, 20 insertions(+), 42 deletions(-) (limited to 'libjava/java/io/ObjectOutputStream.java') diff --git a/libjava/java/io/ObjectOutputStream.java b/libjava/java/io/ObjectOutputStream.java index 3482225..55763ee 100644 --- a/libjava/java/io/ObjectOutputStream.java +++ b/libjava/java/io/ObjectOutputStream.java @@ -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++) -- cgit v1.1