Index: working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java (revision 647500) +++ working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java (working copy) @@ -30,6 +30,8 @@ import java.util.HashMap; import java.util.Iterator; +import java.lang.reflect.Field; + import org.apache.harmony.kernel.vm.VM; import org.apache.harmony.luni.internal.nls.Messages; import org.apache.harmony.luni.util.Msg; @@ -1124,47 +1126,63 @@ } for (ObjectStreamField fieldDesc : fields) { + + // get associated Field + Field field = fieldDesc.getAssocField(); + + // TODO: Consider moving slowpath to initialization + if(field == null) { + String fieldName = ""; + try { + fieldName = fieldDesc.getName(); + field = declaringClass.getDeclaredField(fieldName); + field.setAccessible(true); + } catch(NoSuchFieldException e) { + // TODO: Eliminate this debug check + System.err.println("readFieldValues failed on resolving field: " + fieldName); + System.exit(1); + } + fieldDesc.setAssocField(field); + } + + // Code duplication starts, just because Java is typed if (fieldDesc.isPrimitive()) { try { switch (fieldDesc.getTypeCode()) { case 'B': - setField(obj, declaringClass, fieldDesc.getName(), - input.readByte()); + field.setByte(obj, input.readByte()); break; case 'C': - setField(obj, declaringClass, fieldDesc.getName(), - input.readChar()); + field.setChar(obj, input.readChar()); break; case 'D': - setField(obj, declaringClass, fieldDesc.getName(), - input.readDouble()); + field.setDouble(obj, input.readDouble()); break; case 'F': - setField(obj, declaringClass, fieldDesc.getName(), - input.readFloat()); + field.setFloat(obj, input.readFloat()); break; case 'I': - setField(obj, declaringClass, fieldDesc.getName(), - input.readInt()); + field.setInt(obj, input.readInt()); break; case 'J': - setField(obj, declaringClass, fieldDesc.getName(), - input.readLong()); + field.setLong(obj, input.readLong()); break; case 'S': - setField(obj, declaringClass, fieldDesc.getName(), - input.readShort()); + field.setShort(obj, input.readShort()); break; case 'Z': - setField(obj, declaringClass, fieldDesc.getName(), - input.readBoolean()); + field.setBoolean(obj, input.readBoolean()); break; default: throw new StreamCorruptedException(Msg.getString( "K00d5", fieldDesc.getTypeCode())); //$NON-NLS-1$ } } catch (NoSuchFieldError err) { + } catch (IllegalAccessException e) { + // TODO: Eliminate this debug check + System.err.println("readFieldValues failed: IllegalAccessException"); + System.exit(1); } } else { // Object type (array included). @@ -1195,10 +1213,12 @@ + fieldName })); } try { - objSetField(obj, declaringClass, fieldName, fieldDesc - .getTypeString(), toSet); + field.set(obj, toSet); } catch (NoSuchFieldError e) { // Ignored + } catch (IllegalAccessException e) { + System.err.println("FAIL2 BUG"); + System.exit(1); } } } Index: working_classlib/modules/luni/src/main/java/java/io/ObjectStreamField.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/io/ObjectStreamField.java (revision 647500) +++ working_classlib/modules/luni/src/main/java/java/io/ObjectStreamField.java (working copy) @@ -21,6 +21,8 @@ import java.util.Arrays; import java.util.Comparator; +import java.lang.reflect.Field; + /** * This class represents object fields that are saved to the stream, by * serialization. Classes can define the collection of fields to be dumped, @@ -47,6 +49,16 @@ private boolean isDeserialized; + private Field assocField; + + Field getAssocField() { + return assocField; + } + + void setAssocField(Field newField) { + assocField = newField; + } + /** * Constructs an ObjectStreamField with the given name and the given type *