This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Some Classpath merging
- From: Mark Wielaard <mark at klomp dot org>
- To: java-patches at gcc dot gnu dot org
- Date: 01 Nov 2002 00:09:45 +0100
- Subject: Some Classpath merging
Hi,
The following merges a couple of classes that were recently changed in
GNU Classpath.
2002-10-31 Stephen Crawley <crawley@dstc.edu.au>
* java/lang/Double.java (valueOf): Return new Double(parseDouble(s)).
2002-10-31 Wu Gansha <gansha.wu@intel.com>:
* java/util/ArrayList.java (readObject, writeObject): Only read/write
size items.
2002-10-31 Wu Gansha <gansha.wu@intel.com>:
* java/io/DataInputStream.java (convertFromUTF): Give StringBuffer an
initial estimated size to avoid enlarge buffer frequently.
2002-10-31 Wu Gansha <gansha.wu@intel.com>:
* java/lang/reflect/Proxy.java (ProxyType): Set loader to System
ClassLoader when null.
(ProxyType.hashCode): Loader null check no longer needed.
(ProxyType.sameTypes): New method.
(ProxyType.equals): Use new method.
2002-10-31 Mark Wielaard <mark@klomp.org>
* java/net/URLDecoder.java (decode): Initialize Stringbuffer size to
length of String.
* java/net/URLEncoder.java (encode): Likewise.
2002-10-31 Mark Wielaard <mark@klomp.org>
* java/util/zip/ZipInputStream.java (getNextEntry): Throw IOException
when stream is closed.
(closeEntry): Likewise.
(read): Likewise.
* java/util/zip/ZipOutputStream.java (putNextEntry): Throw
* ZipException
when no entry active.
(closeEntry): Likewise.
(write): Likewise.
OK to commit?
BTW, Tom could you regenerate the libgcj-classpath-compare page?
Cheers,
Mark
Index: java/io/DataInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/DataInputStream.java,v
retrieving revision 1.12
diff -u -r1.12 DataInputStream.java
--- java/io/DataInputStream.java 22 Jan 2002 22:40:14 -0000 1.12
+++ java/io/DataInputStream.java 31 Oct 2002 23:05:09 -0000
@@ -734,7 +734,9 @@
static String convertFromUTF(byte[] buf)
throws EOFException, UTFDataFormatException
{
- StringBuffer strbuf = new StringBuffer();
+ // Give StringBuffer an initial estimated size to avoid
+ // enlarge buffer frequently
+ StringBuffer strbuf = new StringBuffer(buf.length/2 + 2);
for (int i = 0; i < buf.length; )
{
Index: java/lang/reflect/Proxy.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/Proxy.java,v
retrieving revision 1.1
diff -u -r1.1 Proxy.java
--- java/lang/reflect/Proxy.java 30 Sep 2002 05:19:09 -0000 1.1
+++ java/lang/reflect/Proxy.java 31 Oct 2002 23:05:11 -0000
@@ -462,7 +462,6 @@
private static native Class generateProxyClass0(ClassLoader loader,
ProxyData data);
-
/**
* Helper class for mapping unique ClassLoader and interface combinations
* to proxy classes.
@@ -490,6 +489,8 @@
*/
ProxyType(ClassLoader loader, Class[] interfaces)
{
+ if (loader == null)
+ loader = ClassLoader.getSystemClassLoader();
this.loader = loader;
this.interfaces = interfaces;
}
@@ -501,12 +502,56 @@
*/
public int hashCode()
{
- int hash = (loader == null) ? 0 : loader.hashCode();
+ //loader is always not null
+ int hash = loader.hashCode();
for (int i = 0; i < interfaces.length; i++)
hash = hash * 31 + interfaces[i].hashCode();
return hash;
}
+ // A more comprehensive comparison of two arrays,
+ // ignore array element order, and
+ // ignore redundant elements
+ private static boolean sameTypes(Class arr1[], Class arr2[]) {
+ if (arr1.length == 1 && arr2.length == 1) {
+ return arr1[0] == arr2[0];
+ }
+
+ // total occurrance of elements of arr1 in arr2
+ int total_occ_of_arr1_in_arr2 = 0;
+ each_type:
+ for (int i = arr1.length; --i >= 0; )
+ {
+ Class t = arr1[i];
+ for (int j = i; --j >= 0; )
+ {
+ if (t == arr1[j])
+ { //found duplicate type
+ continue each_type;
+ }
+ }
+
+ // count c(a unique element of arr1)'s
+ // occurrences in arr2
+ int occ_in_arr2 = 0;
+ for (int j = arr2.length; --j >= 0; )
+ {
+ if (t == arr2[j])
+ {
+ ++occ_in_arr2;
+ }
+ }
+ if (occ_in_arr2 == 0)
+ { // t does not occur in arr2
+ return false;
+ }
+
+ total_occ_of_arr1_in_arr2 += occ_in_arr2;
+ }
+ // now, each element of arr2 must have been visited
+ return total_occ_of_arr1_in_arr2 == arr2.length;
+ }
+
/**
* Calculates equality.
*
@@ -518,15 +563,10 @@
ProxyType pt = (ProxyType) other;
if (loader != pt.loader || interfaces.length != pt.interfaces.length)
return false;
- int i = interfaces.length;
- while (--i >= 0)
- if (interfaces[i] != pt.interfaces[i])
- return false;
- return true;
+ return sameTypes(interfaces, pt.interfaces);
}
} // class ProxyType
-
/**
* Helper class which allows hashing of a method name and signature
* without worrying about return type, declaring class, or throws clause,
@@ -681,7 +721,6 @@
}
} // class ProxySignature
-
/**
* A flat representation of all data needed to generate bytecode/instantiate
* a proxy class. This is basically a struct.
@@ -820,7 +859,6 @@
}
} // class ProxyData
-
/**
* Does all the work of building a class. By making this a nested class,
* this code is not loaded in memory if the VM has a native
Index: java/net/URLDecoder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/URLDecoder.java,v
retrieving revision 1.7
diff -u -r1.7 URLDecoder.java
--- java/net/URLDecoder.java 25 Sep 2002 05:05:06 -0000 1.7
+++ java/net/URLDecoder.java 31 Oct 2002 23:05:11 -0000
@@ -63,7 +63,7 @@
public class URLDecoder
{
/**
- * Constructor for compatibility with Sun's JDK.
+ * Public contructor. Note that this class has only static methods.
*/
public URLDecoder ()
{
@@ -116,8 +116,6 @@
public static String decode(String s, String encoding)
throws UnsupportedEncodingException
{
- StringBuffer result = new StringBuffer();
-
// First convert all '+' characters to spaces.
String str = s.replace('+', ' ');
@@ -126,6 +124,7 @@
int start = 0;
byte[] bytes = null;
int length = str.length();
+ StringBuffer result = new StringBuffer(length);
while ((i = str.indexOf('%', start)) >= 0)
{
// Add all non-encoded characters to the result buffer
Index: java/net/URLEncoder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/URLEncoder.java,v
retrieving revision 1.6
diff -u -r1.6 URLEncoder.java
--- java/net/URLEncoder.java 25 Sep 2002 05:05:06 -0000 1.6
+++ java/net/URLEncoder.java 31 Oct 2002 23:05:11 -0000
@@ -1,5 +1,5 @@
/* URLEncoder.java -- Class to convert strings to a properly encoded URL
- Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,7 +39,7 @@
import java.io.UnsupportedEncodingException;
-/**
+/*
* Written using on-line Java Platform 1.2/1.4 API Specification, as well
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
* Status: Believed complete and correct.
@@ -102,11 +102,11 @@
public static String encode(String s, String encoding)
throws UnsupportedEncodingException
{
- StringBuffer result = new StringBuffer();
int length = s.length();
int start = 0;
int i = 0;
+ StringBuffer result = new StringBuffer(length);
while (true)
{
while ( i < length && isSafe(s.charAt(i)) )
Index: java/util/ArrayList.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/ArrayList.java,v
retrieving revision 1.12
diff -u -r1.12 ArrayList.java
--- java/util/ArrayList.java 16 Jun 2002 21:15:38 -0000 1.12
+++ java/util/ArrayList.java 31 Oct 2002 23:05:12 -0000
@@ -558,7 +558,9 @@
// We serialize unused list entries to preserve capacity.
int len = data.length;
s.writeInt(len);
- for (int i = 0; i < len; i++)
+ // it would be more efficient to just write "size" items,
+ // this need readObject read "size" items too.
+ for (int i = 0; i < size; i++)
s.writeObject(data[i]);
}
@@ -578,7 +580,7 @@
s.defaultReadObject();
int capacity = s.readInt();
data = new Object[capacity];
- for (int i = 0; i < capacity; i++)
+ for (int i = 0; i < size; i++)
data[i] = s.readObject();
}
}
Index: java/util/zip/ZipInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/zip/ZipInputStream.java,v
retrieving revision 1.15
diff -u -r1.15 ZipInputStream.java
--- java/util/zip/ZipInputStream.java 25 Sep 2002 20:10:42 -0000 1.15
+++ java/util/zip/ZipInputStream.java 31 Oct 2002 23:05:12 -0000
@@ -139,7 +139,7 @@
public ZipEntry getNextEntry() throws IOException
{
if (crc == null)
- throw new IllegalStateException("Closed.");
+ throw new IOException("Stream closed.");
if (entry != null)
closeEntry();
@@ -216,7 +216,7 @@
public void closeEntry() throws IOException
{
if (crc == null)
- throw new IllegalStateException("Closed.");
+ throw new IOException("Stream closed.");
if (entry == null)
return;
@@ -287,7 +287,7 @@
public int read(byte[] b, int off, int len) throws IOException
{
if (crc == null)
- throw new IllegalStateException("Closed.");
+ throw new IOException("Stream closed.");
if (entry == null)
return -1;
boolean finished = false;
Index: java/util/zip/ZipOutputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/util/zip/ZipOutputStream.java,v
retrieving revision 1.12
diff -u -r1.12 ZipOutputStream.java
--- java/util/zip/ZipOutputStream.java 15 Jun 2002 18:31:13 -0000 1.12
+++ java/util/zip/ZipOutputStream.java 31 Oct 2002 23:05:12 -0000
@@ -158,12 +158,12 @@
* is not set in the entry, the current time is used.
* @param entry the entry.
* @exception IOException if an I/O error occured.
- * @exception IllegalStateException if stream was finished
+ * @exception ZipException if stream was finished.
*/
public void putNextEntry(ZipEntry entry) throws IOException
{
if (entries == null)
- throw new IllegalStateException("ZipOutputStream was finished");
+ throw new ZipException("ZipOutputStream was finished");
int method = entry.getMethod();
int flags = 0;
@@ -249,12 +249,12 @@
/**
* Closes the current entry.
* @exception IOException if an I/O error occured.
- * @exception IllegalStateException if no entry is active.
+ * @exception ZipException if no entry is active.
*/
public void closeEntry() throws IOException
{
if (curEntry == null)
- throw new IllegalStateException("No open entry");
+ throw new ZipException("No open entry");
/* First finish the deflater, if appropriate */
if (curMethod == DEFLATED)
@@ -300,12 +300,12 @@
/**
* Writes the given buffer to the current entry.
* @exception IOException if an I/O error occured.
- * @exception IllegalStateException if no entry is active.
+ * @exception ZipException if no entry is active.
*/
public void write(byte[] b, int off, int len) throws IOException
{
if (curEntry == null)
- throw new IllegalStateException("No open entry.");
+ throw new ZipException("No open entry.");
switch (curMethod)
{