[kaffe] gnu.java.nio.charset.iconv.IconvCharset cannot be used

Ito Kazumitsu kaz at maczuka.gcd.org
Fri Jun 3 16:33:39 PDT 2005


Hi,

ChangeLog says:

2005-05-30  Helmer Kraemer  <hkraemer at freenet.de>

        * libraries/javalib/kaffe/lang/AppClassLoader.java,
        libraries/javalib/kaffe/lang/PrimordialClassLoader.java,
        libraries/clib/native/PrimordialClassLoader.c: removed. Loading classes is
        now handled completely by ClassLoader / VMClassLoader.
...
	* libraries/javalib/META-INF/services/java.nio.charset.spi.CharsetProvider:
	removed, as iconv is treated specially by java.nio.charset.Charset

The removal of META-INF/... is OK for me because I prefer using my own
CharsetProvider wrapping gnu.java.nio.charset.iconv.IconvProvider.

But the following simple program dumps core. This problem did not occur
when kaffe.lang.*ClassLoader was used.

bash-2.05b$ cat TestCharsetProviderMain.java
import java.nio.charset.*;
import java.nio.charset.spi.*;
public final class TestCharsetProviderMain
{
  public static void main(String[] args) throws Exception
  {
      Class c = Class.forName("gnu.java.nio.charset.iconv.IconvProvider", true,
	    Thread.currentThread().getContextClassLoader());
      System.out.println(c);
      System.out.flush();
      CharsetProvider p = (CharsetProvider)(c.newInstance());
      System.out.println(p);
      System.out.flush();
      System.out.println(p.charsetForName(args[0]));
  }
}
bash-2.05b$ kaffe TestCharsetProviderMain EUC-JP
class gnu.java.nio.charset.iconv.IconvProvider
gnu.java.nio.charset.iconv.IconvProvider at 8408c3c
charsetForName EUC-JP
IconvMetaData gnu.java.nio.charset.iconv.IconvMetaData at 844cebc
trying new IconvCharset(info)
Assertion failed: (cls != NULL), function createRawData, file gnu_java_nio_charset_iconv_IconvEncoder.c, line 192.
Abort trap (core dumped)

Please note that some files are modified for debugging purpose:

--- gnu/java/nio/charset/iconv/IconvProvider.java.orig	Sat Apr 23 18:54:27 2005
+++ gnu/java/nio/charset/iconv/IconvProvider.java	Fri Jun  3 07:34:02 2005
@@ -62,7 +62,7 @@
         }
     }
 
-  private IconvProvider()
+  public IconvProvider()
   {
     IconvMetaData.setup();
   }
@@ -88,13 +88,23 @@
   {
     try
       {
+	System.out.println("charsetForName " + charsetName);
+	System.out.flush();
 	IconvMetaData info = IconvMetaData.get(charsetName);
+	System.out.println("IconvMetaData " + info);
+	System.out.flush();
 
 	// Try anyway if the set isn't found.
 	if (info == null)
 	  info = new IconvMetaData(charsetName, 2.0f, 2.0f, 2.0f, 2.0f,
 	                           new String[] {  }, charsetName);
-	return new IconvCharset(info);
+	System.out.println("trying new IconvCharset(info)");
+	System.out.flush();
+	Charset cs = new IconvCharset(info);
+	System.out.println("new IconvCharset(info) " + cs);
+	System.out.flush();
+	return cs;
+	// return new IconvCharset(info);
       }
     catch (IllegalArgumentException e)
       {


Note: Without changing private IconvProvider() to public IconvProvider(),
      an instance of this class cannot be created newInstance().

--- libraries/clib/nio/gnu_java_nio_charset_iconv_IconvEncoder.c.~1.3.~	Fri May 20 23:46:49 2005
+++ libraries/clib/nio/gnu_java_nio_charset_iconv_IconvEncoder.c	Sat Jun  4 07:04:23 2005
@@ -79,6 +79,7 @@
   if (infid == NULL || outfid == NULL)
     {
       cls = (*env)->GetObjectClass (env, obj);
+      assert (cls != NULL);
       infid = (*env)->GetFieldID (env, cls, "inremaining", "I");
       assert (infid != 0);
       outfid = (*env)->GetFieldID (env, cls, "outremaining", "I");
@@ -183,10 +184,12 @@
 
 #ifdef POINTERS_ARE_64BIT
   cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
+  assert (cls != NULL);
   method = (*env)->GetMethodID (env, cls, "<init>", "(J)V");
   data = (*env)->NewObject (env, cls, method, (jlong) ptr);
 #else
   cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
+  assert (cls != NULL);
   method = (*env)->GetMethodID (env, cls, "<init>", "(I)V");
   data = (*env)->NewObject (env, cls, method, (jint) ptr);
 #endif


Note: "assert (cls != NULL)" is also written in lookupClassMethod
      in kaffe/kaffevm/support.c.  Without inserting "assert (cls != NULL)"
      here, the failure will be checked there.
 




More information about the kaffe mailing list