From aac025f40baea1dc5842b9d9d65dcbe09c90d68a Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 19 Jan 2003 18:38:39 +0000 Subject: * java/io/ObjectInputStream.java (ObjectInputStream): Set dump flag according to System property. (resolveObject): Moved to allign with libgcj version. (read): Make sure result is positive. (getField): New method. (getMethod): Likewise. (callReadMethod): No longer native. (setBooleanField): Likewise. (setByteField): Likewise. (setCharField): Likewise. (setDoubleField): Likewise. (setFloatField): Likewise. (setIntField): Likewise. (setLongField): Likewise. (setShortField): Likewise. (setObjectField): Likewise. (setDump): Removed. * native/jni/java-io/java_io_ObjectInputStream.c (callReadMethod): removed. (setBooleanField): removed. (setByteField): removed. (setCharField): Removed. (setDoubleField): Removed. (setFloatField): Removed. (setIntField): Removed. (setLongField): Removed. (setShortField): Removed. (setObjectField): Removed. * include/java_io_ObjectInputStream.h: Regenerated. --- ChangeLog | 32 +++ include/java_io_ObjectInputStream.h | 10 - java/io/ObjectInputStream.java | 274 +++++++++++++++++----- native/jni/java-io/java_io_ObjectInputStream.c | 306 ------------------------- 4 files changed, 254 insertions(+), 368 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82453e507..6c449ce5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2003-01-19 Mark Wielaard + + * java/io/ObjectInputStream.java (ObjectInputStream): Set dump flag + according to System property. + (resolveObject): Moved to allign with libgcj version. + (read): Make sure result is positive. + (getField): New method. + (getMethod): Likewise. + (callReadMethod): No longer native. + (setBooleanField): Likewise. + (setByteField): Likewise. + (setCharField): Likewise. + (setDoubleField): Likewise. + (setFloatField): Likewise. + (setIntField): Likewise. + (setLongField): Likewise. + (setShortField): Likewise. + (setObjectField): Likewise. + (setDump): Removed. + * native/jni/java-io/java_io_ObjectInputStream.c (callReadMethod): + removed. + (setBooleanField): removed. + (setByteField): removed. + (setCharField): Removed. + (setDoubleField): Removed. + (setFloatField): Removed. + (setIntField): Removed. + (setLongField): Removed. + (setShortField): Removed. + (setObjectField): Removed. + * include/java_io_ObjectInputStream.h: Regenerated. + 2003-01-18 Archie Cobbs * gnu/java/io/encode/EncoderUTF8.java (bytesInCharArray): Use offset. diff --git a/include/java_io_ObjectInputStream.h b/include/java_io_ObjectInputStream.h index 9fc3b9ed9..ccf3e4d25 100644 --- a/include/java_io_ObjectInputStream.h +++ b/include/java_io_ObjectInputStream.h @@ -11,18 +11,8 @@ extern "C" #endif extern jobject Java_java_io_ObjectInputStream_currentClassLoader (JNIEnv *env, jclass, jobject); -extern void Java_java_io_ObjectInputStream_callReadMethod (JNIEnv *env, jobject, jobject, jclass); extern jobject Java_java_io_ObjectInputStream_allocateObject (JNIEnv *env, jobject, jclass); extern void Java_java_io_ObjectInputStream_callConstructor (JNIEnv *env, jobject, jclass, jobject); -extern void Java_java_io_ObjectInputStream_setBooleanField (JNIEnv *env, jobject, jobject, jstring, jboolean); -extern void Java_java_io_ObjectInputStream_setByteField (JNIEnv *env, jobject, jobject, jstring, jbyte); -extern void Java_java_io_ObjectInputStream_setCharField (JNIEnv *env, jobject, jobject, jstring, jchar); -extern void Java_java_io_ObjectInputStream_setDoubleField (JNIEnv *env, jobject, jobject, jstring, jdouble); -extern void Java_java_io_ObjectInputStream_setFloatField (JNIEnv *env, jobject, jobject, jstring, jfloat); -extern void Java_java_io_ObjectInputStream_setIntField (JNIEnv *env, jobject, jobject, jstring, jint); -extern void Java_java_io_ObjectInputStream_setLongField (JNIEnv *env, jobject, jobject, jstring, jlong); -extern void Java_java_io_ObjectInputStream_setShortField (JNIEnv *env, jobject, jobject, jstring, jshort); -extern void Java_java_io_ObjectInputStream_setObjectField (JNIEnv *env, jobject, jobject, jstring, jstring, jobject); #ifdef __cplusplus } diff --git a/java/io/ObjectInputStream.java b/java/io/ObjectInputStream.java index 060fe6403..63b23ee96 100644 --- a/java/io/ObjectInputStream.java +++ b/java/io/ObjectInputStream.java @@ -1,5 +1,5 @@ /* ObjectInputStream.java -- Class used to read serialized objects - Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -73,6 +73,21 @@ public class ObjectInputStream extends InputStream public ObjectInputStream (InputStream in) throws IOException, StreamCorruptedException { + if (Configuration.DEBUG) + { + String val = System.getProperty("gcj.dumpobjects"); + if (dump == false && val != null && !val.equals("")) + { + dump = true; + System.out.println ("Serialization debugging enabled"); + } + else if (dump == true && (val == null || val.equals(""))) + { + dump = false; + System.out.println ("Serialization debugging disabled"); + } + } + this.resolveEnabled = false; this.isDeserializing = false; this.blockDataPosition = 0; @@ -568,6 +583,26 @@ public class ObjectInputStream extends InputStream } } + + /** + Allows subclasses to resolve objects that are read from the + stream with other objects to be returned in their place. This + method is called the first time each object is encountered. + + This method must be enabled before it will be called in the + serialization process. + + @exception IOException Exception from underlying + OutputStream. + + @see enableResolveObject (boolean) + */ + protected Object resolveObject (Object obj) throws IOException + { + return obj; + } + + protected Class resolveProxyClass (String[] intfs) throws IOException, ClassNotFoundException { @@ -594,25 +629,6 @@ public class ObjectInputStream extends InputStream } } - /** - Allows subclasses to resolve objects that are read from the - stream with other objects to be returned in their place. This - method is called the first time each object is encountered. - - This method must be enabled before it will be called in the - serialization process. - - @exception IOException Exception from underlying - OutputStream. - - @see enableResolveObject (boolean) - */ - protected Object resolveObject (Object obj) throws IOException - { - return obj; - } - - /** If enable is true and this object is trusted, then resolveObject (Object) will be called @@ -665,13 +681,13 @@ public class ObjectInputStream extends InputStream { if (this.blockDataPosition >= this.blockDataBytes) readNextBlock (); - return this.blockData[this.blockDataPosition++]; + return (this.blockData[this.blockDataPosition++] & 0xff); } else return this.realInputStream.read (); } - public int read (byte data[], int offset, int length) throws IOException + public int read (byte[] data, int offset, int length) throws IOException { if (this.readDataFromBlock) { @@ -1502,7 +1518,7 @@ public class ObjectInputStream extends InputStream // returns a new instance of REAL_CLASS that has been constructed - // only to th level of CONSTRUCTOR_CLASS (a super class of REAL_CLASS) + // only to the level of CONSTRUCTOR_CLASS (a super class of REAL_CLASS) private Object newObject (Class real_class, Class constructor_class) { try @@ -1542,32 +1558,191 @@ public class ObjectInputStream extends InputStream // of the same name in SecurityManger private static native ClassLoader currentClassLoader (SecurityManager sm); - private native void callReadMethod (Object obj, Class clazz); + private static Field getField (Class klass, String name) + throws java.lang.NoSuchFieldException + { + return klass.getDeclaredField(name); + } + + private static Method getMethod (Class klass, String name, Class args[]) + throws java.lang.NoSuchMethodException + { + return klass.getDeclaredMethod(name, args); + } + private void callReadMethod (Object obj, Class klass) throws IOException + { + try + { + Class classArgs[] = {ObjectInputStream.class}; + Method m = getMethod (klass, "readObject", classArgs); + if (m == null) + return; + Object args[] = {this}; + m.invoke (obj, args); + } + catch (InvocationTargetException x) + { + /* Rethrow if possible. */ + Throwable exception = x.getTargetException(); + if (exception instanceof RuntimeException) + throw (RuntimeException) exception; + if (exception instanceof IOException) + throw (IOException) exception; + + throw new IOException ("Exception thrown from readObject() on " + + klass + ": " + exception.getClass().getName()); + } + catch (Exception x) + { + throw new IOException ("Failure invoking readObject() on " + + klass + ": " + x.getClass().getName()); + } + } + private native Object allocateObject (Class clazz) throws InstantiationException; private native void callConstructor (Class clazz, Object obj); - private native void setBooleanField (Object obj, String field_name, - boolean val); - private native void setByteField (Object obj, String field_name, - byte val); - private native void setCharField (Object obj, String field_name, - char val); - private native void setDoubleField (Object obj, String field_name, - double val); - private native void setFloatField (Object obj, String field_name, - float val); - private native void setIntField (Object obj, String field_name, - int val); - private native void setLongField (Object obj, String field_name, - long val); - private native void setShortField (Object obj, String field_name, - short val); - private native void setObjectField (Object obj, String field_name, - String type_code, Object val); + private void setBooleanField (Object obj, String field_name, + boolean val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setBoolean (obj, val); + } + catch (Exception _) + { + } + } + + private void setByteField (Object obj, String field_name, + byte val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setByte (obj, val); + } + catch (Exception _) + { + } + } + private void setCharField (Object obj, String field_name, + char val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setChar (obj, val); + } + catch (Exception _) + { + } + } + + private void setDoubleField (Object obj, String field_name, + double val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setDouble (obj, val); + } + catch (Exception _) + { + } + } + + private void setFloatField (Object obj, String field_name, + float val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setFloat (obj, val); + } + catch (Exception _) + { + } + } + + private void setIntField (Object obj, String field_name, + int val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setInt (obj, val); + } + catch (Exception _) + { + } + } + + + private void setLongField (Object obj, String field_name, + long val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setLong (obj, val); + } + catch (Exception _) + { + } + } + + + private void setShortField (Object obj, String field_name, + short val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + f.setShort (obj, val); + } + catch (Exception _) + { + } + } + + + private void setObjectField (Object obj, String field_name, String type_code, + Object val) + { + try + { + Class klass = obj.getClass (); + Field f = getField (klass, field_name); + f.setAccessible(true); + // FIXME: We should check the type_code here + f.set (obj, val); + } + catch (Exception _) + { + } + } private static final int BUFFER_SIZE = 1024; private static final Class[] readObjectParams = { ObjectInputStream.class }; @@ -1591,21 +1766,16 @@ public class ObjectInputStream extends InputStream private static boolean dump = false; - public static void setDump (boolean dodump) - { - dump = dodump; - } - private void dumpElement (String msg) { - if (dump) - System.out.print (msg); + if (Configuration.DEBUG && dump) + System.out.print(msg); } - + private void dumpElementln (String msg) { - if (dump) - System.out.println (msg); + if (Configuration.DEBUG && dump) + System.out.println(msg); } static diff --git a/native/jni/java-io/java_io_ObjectInputStream.c b/native/jni/java-io/java_io_ObjectInputStream.c index 28fdd46d1..8a4c87d5b 100644 --- a/native/jni/java-io/java_io_ObjectInputStream.c +++ b/native/jni/java-io/java_io_ObjectInputStream.c @@ -97,309 +97,3 @@ Java_java_io_ObjectInputStream_callConstructor( JNIEnv * env, (*env)->CallNonvirtualVoidMethod( env, obj, constr_class, id ); } - - -/* - * Class: java_io_ObjectInputStream - * Method: callReadMethod - * Signature: (Ljava/lang/Object;Ljava/lang/Class;)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_callReadMethod( JNIEnv * env, - jobject self, - jobject obj, - jclass clazz ) -{ - jmethodID id = (*env)->GetMethodID( env, clazz, - "readObject", - "(Ljava/io/ObjectInputStream;)V" ); - - if( id == NULL ) - return; - - (*env)->CallNonvirtualVoidMethod( env, obj, clazz, id, self ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setBooleanField - * Signature: (Ljava/lang/Object;Ljava/lang/String;Z)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setBooleanField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jboolean val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "Z" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetBooleanField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setByteField - * Signature: (Ljava/lang/Object;Ljava/lang/String;B)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setByteField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jbyte val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "B" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetByteField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setCharField - * Signature: (Ljava/lang/Object;Ljava/lang/String;C)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setCharField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jchar val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "C" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetCharField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setDoubleField - * Signature: (Ljava/lang/Object;Ljava/lang/String;D)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setDoubleField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jdouble val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "D" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetDoubleField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setFloatField - * Signature: (Ljava/lang/Object;Ljava/lang/String;F)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setFloatField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jfloat val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "F" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetFloatField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setIntField - * Signature: (Ljava/lang/Object;Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setIntField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jint val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "I" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetIntField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setLongField - * Signature: (Ljava/lang/Object;Ljava/lang/String;J)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setLongField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jlong val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "J" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetLongField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setShortField - * Signature: (Ljava/lang/Object;Ljava/lang/String;S)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setShortField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jshort val ) -{ - jfieldID id; - char * name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, "S" ); - - JCL_free_cstring( env, field_name, name_cstr ); - - if( id == NULL ) - return; - - (*env)->SetShortField( env, obj, id, val ); -} - - -/* - * Class: java_io_ObjectInputStream - * Method: setObjectField - * Signature: (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ -Object;)V - */ -JNIEXPORT void JNICALL -Java_java_io_ObjectInputStream_setObjectField( JNIEnv * env, - jobject self, - jobject obj, - jstring field_name, - jstring type_code, - jobject val ) -{ - jfieldID id; - char * name_cstr; - char * type_cstr; - - name_cstr = JCL_jstring_to_cstring( env, field_name ); - - if( name_cstr == NULL ) - return; - - type_cstr = JCL_jstring_to_cstring( env, type_code ); - - if( type_cstr == NULL ) - { - JCL_free_cstring( env, field_name, name_cstr ); - return; - } - - id = (*env)->GetFieldID( env, (*env)->GetObjectClass( env, obj ), - name_cstr, type_cstr ); - - JCL_free_cstring( env, field_name, name_cstr ); - JCL_free_cstring( env, type_code, type_cstr ); - - if( id == NULL ) - return; - - (*env)->SetObjectField( env, obj, id, val ); -} -- cgit v1.2.1