+2001-01-27 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/io/ObjectInputStream.java (read): AND byte with 0xff to make
+ result unsigned.
+ (read (byte[], int, int)): Only call readNextBlock() if the block
+ buffer would actually be overrun. Increment blockDataPosition.
+ (callReadMethod): Propagate exceptions from invocation target.
+ * java/io/ObjectOutputStream.java (callWriteMethod): Propagate
+ exceptions from invocation target.
+
2001-01-26 Tom Tromey <tromey@redhat.com>
* jni.cc (_Jv_JNI_GetAnyMethodID): Rewrite signature from external
{
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)
{
- if (this.blockDataPosition + length >= this.blockDataBytes)
+ if (this.blockDataPosition + length > this.blockDataBytes)
readNextBlock ();
System.arraycopy (this.blockData, this.blockDataPosition,
data, offset, length);
+ blockDataPosition += length;
+
return length;
}
else
{
try
{
- Class classArgs[] = {Class.forName ("java.io.ObjectInputStream")};
+ Class classArgs[] = {ObjectInputStream.class};
Method m = getMethod (klass, "readObject", classArgs);
if (m == null)
return;
Object args[] = {this};
- m.invoke (obj, args);
+ m.invoke (obj, args);
}
- catch (Exception _)
+ 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 ();
+ throw new IOException ("Failure invoking readObject() on " +
+ klass + ": " + x.getClass().getName());
}
}
/**
@see java.io.DataOutputStream#write (byte[])
*/
- public void write (byte b[]) throws IOException
+ public void write (byte[] b) throws IOException
{
write (b, 0, b.length);
}
/**
@see java.io.DataOutputStream#write (byte[],int,int)
*/
- public void write (byte b[], int off, int len) throws IOException
+ public void write (byte[] b, int off, int len) throws IOException
{
if (writeDataAsBlocks)
{
private void callWriteMethod (Object obj) throws IOException
{
+ Class klass = obj.getClass ();
try
{
- Class classArgs[] = {Class.forName ("java.io.ObjectOutputStream")};
- Class klass = obj.getClass ();
+ Class classArgs[] = {ObjectOutputStream.class};
Method m = getMethod (klass, "writeObject", classArgs);
if (m == null)
return;
Object args[] = {this};
m.invoke (obj, args);
}
- catch (Exception _)
+ catch (InvocationTargetException x)
{
- throw new IOException ();
+ /* 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 writeObject() on " +
+ klass + ": " + exception.getClass().getName());
+ }
+ catch (Exception x)
+ {
+ throw new IOException ("Failure invoking writeObject() on " +
+ klass + ": " + x.getClass().getName());
}
}
-
+
private boolean getBooleanField (Object obj, String field_name) throws IOException
{
try
private static native Field getField (Class klass, String name)
throws java.lang.NoSuchFieldException;
- private static native Method getMethod (Class klass, String name, Class args[])
+ private static native Method getMethod (Class klass, String name, Class[] args)
throws java.lang.NoSuchMethodException;
// this value comes from 1.2 spec, but is used in 1.1 as well