classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Serialization #2 (set field methods)


From: Guilhem Lavaux
Subject: Re: [PATCH] Serialization #2 (set field methods)
Date: Wed, 26 Nov 2003 22:00:33 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030630

Sorry. Here is the patch.

Guilhem.
Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectInputStream.java,v
retrieving revision 1.32
diff -u -r1.32 ObjectInputStream.java
--- java/io/ObjectInputStream.java      1 Aug 2003 03:33:59 -0000       1.32
+++ java/io/ObjectInputStream.java      26 Nov 2003 20:58:42 -0000
@@ -1566,78 +1566,102 @@
   private native void callConstructor (Class clazz, Object obj);
 
   private void setBooleanField (Object obj, Class klass, String field_name,
-                               boolean val)
+                               boolean val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setBoolean (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
   private void setByteField (Object obj, Class klass, String field_name,
-                            byte val)
+                            byte val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setByte (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
   private void setCharField (Object obj, Class klass, String field_name,
-                            char val)
+                            char val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setChar (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
   private void setDoubleField (Object obj, Class klass, String field_name,
-                              double val)
+                              double val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setDouble (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
   private void setFloatField (Object obj, Class klass, String field_name,
-                             float val)
+                             float val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setFloat (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
   private void setIntField (Object obj, Class klass, String field_name,
-                           int val)
+                           int val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setInt (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
@@ -1645,13 +1669,17 @@
 
 
   private void setLongField (Object obj, Class klass, String field_name,
-                            long val)
+                            long val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setLong (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
@@ -1659,13 +1687,17 @@
 
 
   private void setShortField (Object obj, Class klass, String field_name,
-                             short val)
+                             short val) throws IOException
   {
     try
       {
        Field f = getField (klass, field_name);
        f.setShort (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+       throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
@@ -1673,17 +1705,24 @@
 
 
   private void setObjectField (Object obj, Class klass, String field_name,
-                              String type_code, Object val)
+                              String type_code, Object val) throws IOException
   {
     try
       {
-       Field f = getField (klass, field_name);
-       // FIXME: We should check the type_code here
-       f.set (obj, val);
+       Field f = getField (klass, field_name);
+       ObjectStreamField of = new ObjectStreamField(field_name, f.getType());
+       
+       if (of.getTypeString() == null ||
+           !of.getTypeString().equals(type_code))
+          throw new InvalidClassException("incompatible field type for " + 
klass.getName() + "." + field_name);
+       f.set (obj, val);
       }
-    catch (Exception _)
+    catch (InvalidClassException e)
       {
-      }    
+       throw e;
+      }
+    catch (Exception _)
+      {}
   }
 
   private static final int BUFFER_SIZE = 1024;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]